This document proposes a standard format for synthesis flow charts. The format will be defined later in this document as a collection of XML DTDs. The primary motivation for such an exchangeable format was the problem of serializing collections of reusable signal processing constructs as found in (non-)realtime software synthesizers.
To be completed
When the idea for this universal format first arised, it was obvious that there should be some primitive structures defined for the format, such that compilers from FlowML to some target synthesis language would be able to generate code for these primitive structures.
The first idea was to introduce a set of primitives from synthesis languages like SAOL and CSound: various mathematical operators, along with signal processing operators. It turned out that this is (probably) not the right solution: these are constructs from a (more or less) sequential language, and a diagram does not specify a real order on its components, the way a programming language does (there was the assumption for a while that a synthesis algorithm could be drawn very easily as a directed graph). Therefore, a collection of primitive synthesis building blocks will be introduced in this document, and tools who want to support the FlowML format must provide support for these blocks.
After discussion with several people from the saol-dev mailing-list and various members of the university where this project is supervised, it would be advisable to introduce a mechanism in the format which allows for target-language specific building blocks (blocks which cannot be defined using the primitive blocks introduced in this document). At this time such a mechanism isn't included yet, but it is planned for the next version of this document.
Based on some popular realtime software synthesizers, a few primitive building blocks will now be presented. The list is by no means complete at this time, and the descriptions are missing at this time.
An example orchestra:
The following is a modified version of the flanger circuit from [Roads96], p. 438. The diagram was redesigned in terms of structures from 4:
An example structure definition:
Below are the formal specifications for the format.
<!-- FlowML Orchestra DTD --> <!ELEMENT Orchestra (Instruments, Buses)> <!ELEMENT Instruments (InstrumentInstance)+> <!ELEMENT Buses (Bus)+> <!ELEMENT InstrumentInstance (Route)+> <!ATTLIST InstrumentInstance id ID #REQUIRED label CDATA #REQUIRED> <!ELEMENT Route EMPTY> <!ATTLIST Route target_id IDREF #REQUIRED> <!ELEMENT Bus (Send)*> <!ATTLIST Bus id ID #REQUIRED label CDATA #REQUIRED width CDATA #REQUIRED output (yes|no) "no"> <!ELEMENT Send EMPTY> <!ATTLIST Send target_id IDREF #REQUIRED>
<!-- FlowML Instrument DTD --> <!ELEMENT Instrument (Description, Implementation)> <!ATTLIST Instrument id ID #REQUIRED> <!ELEMENT Description (#PCDATA)> <!ELEMENT Implementation (StructureInstance)+> <!ELEMENT StructureInstance (Connection)*> <!ATTLIST StructureInstance id ID #REQUIRED label CDATA #REQUIRED type CDATA #REQUIRED> <!ELEMENT Connection EMPTY> <!ATTLIST Connection from CDATA #REQUIRED to CDATA #REQUIRED target_id IDREF #REQUIRED>
<!-- FlowML Structure DTD --> <!ELEMENT Structure (Description, Implementation)> <!ATTLIST Structure id ID #REQUIRED> <!ELEMENT Description (#PCDATA)> <!ELEMENT Implementation (StructureInstance|PrimitiveInstance)+> <!ELEMENT StructureInstance (Connection)*> <!ATTLIST StructureInstance id ID #REQUIRED label CDATA #REQUIRED type CDATA #REQUIRED> <!ELEMENT PrimitiveInstance (Connection)*> <!ATTLIST PrimitiveInstance id ID #REQUIRED label CDATA #REQUIRED type CDATA #REQUIRED> <!ELEMENT Connection EMPTY> <!ATTLIST Connection from CDATA #REQUIRED to CDATA #REQUIRED target_id IDREF #REQUIRED>
To be completed
1 Software designers should not rely on this document until the first major version.