example.md/cfg : Updates
This commit is contained in:
parent
3f35df571a
commit
c863707946
@ -242,6 +242,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
feedback_11: {
|
feedback_11: {
|
||||||
non_real_time_fl:true,
|
non_real_time_fl:true,
|
||||||
max_cycle_count: 10,
|
max_cycle_count: 10,
|
||||||
@ -258,6 +259,20 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
subnet_12 : {
|
||||||
|
non_real_time_fl: true,
|
||||||
|
dur_limit_secs: 5,
|
||||||
|
|
||||||
|
network: {
|
||||||
|
procs: {
|
||||||
|
sub_osc: { class: mod_osc args:{ hz:220, hz_mod_hz:3, hz_mod_depth:55, amp_mod_hz:2, amp_mod_depth:0.5 }},
|
||||||
|
af: { class: audio_file_out, in:{ in:sub_osc.mo_out }
|
||||||
|
args:{ fname:"$/out.wav"}}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
sample_gen_13: {
|
sample_gen_13: {
|
||||||
non_real_time_fl:false,
|
non_real_time_fl:false,
|
||||||
|
@ -6,7 +6,7 @@ In this example the program is contained in the dictionary labeled `sine_file_01
|
|||||||
the preceeding fields (e.g. `base_dir`,`proc_dict`,`subnet_dict`, etc.) contain
|
the preceeding fields (e.g. `base_dir`,`proc_dict`,`subnet_dict`, etc.) contain
|
||||||
system parameters that the program needs to compile and run the program.
|
system parameters that the program needs to compile and run the program.
|
||||||
|
|
||||||
``` yaml
|
``` javascript
|
||||||
{
|
{
|
||||||
base_dir: "~/src/caw/examples",
|
base_dir: "~/src/caw/examples",
|
||||||
proc_dict: "~/src/caw/examples/proc_dict.cfg",
|
proc_dict: "~/src/caw/examples/proc_dict.cfg",
|
||||||
@ -112,8 +112,8 @@ Note that unless stated otherwise all variables can be either input or
|
|||||||
output ports for their processor. The `no_src` attribute on
|
output ports for their processor. The `no_src` attribute on
|
||||||
`sine_tone.out` indicates that it is an output-only variable. The
|
`sine_tone.out` indicates that it is an output-only variable. The
|
||||||
`src` attribute on `audio_file_out.in` indicates that it must be
|
`src` attribute on `audio_file_out.in` indicates that it must be
|
||||||
connected to a source variable or the processor cannot be instantiated
|
connected to a source variable or the processor cannot be instantiated -
|
||||||
- and therefore the network it is contained by cannot be instantiated.
|
and therefore the network it is contained by cannot be instantiated.
|
||||||
Note that this isn't to say that it can't be an output variable - only
|
Note that this isn't to say that it can't be an output variable - only
|
||||||
that it must be connected.
|
that it must be connected.
|
||||||
|
|
||||||
@ -624,7 +624,7 @@ list (e.g. `igain0:0.8`) then the scalar value would be assigned to all channels
|
|||||||
|
|
||||||
This example introduces the __poly__ construct. In previous examples when the
|
This example introduces the __poly__ construct. In previous examples when the
|
||||||
network used multiple copies of the same processor they were manually constructed - each with
|
network used multiple copies of the same processor they were manually constructed - each with
|
||||||
a unique suffix id. The __poly_construct allows whole sub-networks to be duplicated
|
a unique suffix id. The __poly__ construct allows whole sub-networks to be duplicated
|
||||||
and automatically assigned unique suffix id's.
|
and automatically assigned unique suffix id's.
|
||||||
|
|
||||||
|
|
||||||
@ -662,6 +662,7 @@ simple_poly_09: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
Notice the _lfo_ `in:{...}` statement for the `dc` variable
|
Notice the _lfo_ `in:{...}` statement for the `dc` variable
|
||||||
@ -710,7 +711,7 @@ This example demonstrates how to achieve a feedback connection using
|
|||||||
the `out:{...}` statement. Until now all the examples have been
|
the `out:{...}` statement. Until now all the examples have been
|
||||||
forward connections. That is processors outputs act as sources to
|
forward connections. That is processors outputs act as sources to
|
||||||
processes that execute later. The `out:{...}` statement allows
|
processes that execute later. The `out:{...}` statement allows
|
||||||
connections to processes that occur earlier. The trick to making this
|
connections to processes that occur earlier in the execution chain. The trick to making this
|
||||||
work is to be sure that the destination processor does not depend on
|
work is to be sure that the destination processor does not depend on
|
||||||
the variable receiving the feedback having a valid value on the
|
the variable receiving the feedback having a valid value on the
|
||||||
very first cycle of network execution - prior to the source processor
|
very first cycle of network execution - prior to the source processor
|
||||||
@ -718,13 +719,12 @@ executing. One way to achieve this is to set the value of the
|
|||||||
variable receiving the feedback to a default value in the `args:{...}`
|
variable receiving the feedback to a default value in the `args:{...}`
|
||||||
statement. This approach is used here with the `b.in` variable.
|
statement. This approach is used here with the `b.in` variable.
|
||||||
|
|
||||||
The `log:{...}` statement is also introduced in this example.
|
This example also introduces the `log:{...}` statement.
|
||||||
This statement has the form `log:{ <var>:<suffix_id>, <var>:<suffix_id> ... }`.
|
The `log:{...}` statement has the form `log:{ <var>:<suffix_id>, <var>:<suffix_id> ... }`.
|
||||||
Any variables included in the statement will be logged to the console
|
Any variables included in the statement will be logged to the console
|
||||||
whenever the variable changes value. This is often a more convenient
|
whenever the variable changes value. This is often a more convenient
|
||||||
way to monitor the changing state of the network then using calls to `print`.
|
way to monitor the changing state of the network then using calls to `print`.
|
||||||
The output is somewhat cryptic but it still
|
The output is somewhat cryptic but contains most of information to debug a program.
|
||||||
gives most of the necassary information to debug a program.
|
|
||||||
|
|
||||||
```
|
```
|
||||||
: exe cycle: process: id: variable: id vid ch : : : type:value : destination
|
: exe cycle: process: id: variable: id vid ch : : : type:value : destination
|
||||||
@ -745,30 +745,94 @@ info: : Entering runtime.
|
|||||||
: 3 : b: 0: out: 0 vid: 2 ch: -1 : : : i:5 : dst:add:0.in:1:
|
: 3 : b: 0: out: 0 vid: 2 ch: -1 : : : i:5 : dst:add:0.in:1:
|
||||||
```
|
```
|
||||||
|
|
||||||
The `exe cycle` value give the execution cycle index. Each time the network completes
|
#### Log Column Descriptions
|
||||||
a cycle this index advances. The process and variable 'id' column gives thethe integer suffix
|
|
||||||
id's of the associated process and variable. The 'vid' column gives the variable id
|
Column | Description
|
||||||
for the given variable. Every variable instance is given a unique integer identifier which
|
------------|---------------------------------------------------------------------
|
||||||
allows it to be located quickly by the system. The 'ch' column indicates the channel value
|
exe cycle | The `exe cycle` value give the execution cycle index.
|
||||||
of the variable, or -1 if the variable is not channelized. Recall that variables may be
|
| Each time the network completes a cycle this index advances.
|
||||||
channelized if the audio signal they are applied to have multiple channels. The 'type:value'
|
process id | The process label and suffix id of the variable
|
||||||
column give the data type and current value of the variable.
|
variable id | The variable label and variable suffix id.
|
||||||
|
vid | System assigned unique (per process) id.
|
||||||
|
ch | Channel index or -1 if the variable is not channelized.
|
||||||
|
| Variables may be channelized if the audio signal they are applied to have multiple channels.
|
||||||
|
type:value | Data type and current value of the variable.
|
||||||
|
|
||||||
|
### Example 11: Audio Feedback
|
||||||
|
|
||||||
|
Coming soon.
|
||||||
|
|
||||||
|
### Example 12: User Defined Processor
|
||||||
|
|
||||||
|
__caw__ user defined processor act somewhat like functions in a procedural programming language.
|
||||||
|
They allow a network designer to create an arbitrarily complex network but then
|
||||||
|
implement a well defined interface to it. The network can then be instantiated just like
|
||||||
|
a built-in process with a limited set of inputs and outputs. This hides the complexity of
|
||||||
|
the implementation of the network from the user and makes for simpler top level networks.
|
||||||
|
|
||||||
|
Here is a user defined processor which implements an oscillator with internal amplitude and frequency modulators.
|
||||||
|
```
|
||||||
|
mod_osc: {
|
||||||
|
|
||||||
|
vars: {
|
||||||
|
hz: { proxy:hz_lfo.dc, doc:"Audio frequency" },
|
||||||
|
hz_mod_hz: { proxy:hz_lfo.hz, doc:"Frequency modulator hz" },
|
||||||
|
hz_mod_depth: { proxy:hz_lfo.gain, doc:"Frequency modulator depth" },
|
||||||
|
amp_mod_hz: { proxy:amp_lfo.hz, doc:"Amplitude modulator hz" },
|
||||||
|
amp_mod_depth: { proxy:amp_lfo.gain, doc:"Amplutide modulator depth."},
|
||||||
|
mo_out: { proxy:ogain.out flags:[out] doc:"Oscillator output."},
|
||||||
|
},
|
||||||
|
|
||||||
|
network: {
|
||||||
|
procs: {
|
||||||
|
// Frequency modulating LFO
|
||||||
|
hz_lfo: { class: sine_tone, args: { ch_cnt:1 }}
|
||||||
|
hz_sh: { class: sample_hold, in:{ in:hz_lfo.out }}
|
||||||
|
|
||||||
|
// Amplitude modulating LFO
|
||||||
|
amp_lfo: { class: sine_tone, args: { ch_cnt:1 }}
|
||||||
|
amp_sh: { class: sample_hold, in:{ in:amp_lfo.out }}
|
||||||
|
|
||||||
|
// Audio oscillator
|
||||||
|
osc: { class: sine_tone, in:{ hz: hz_sh.out }}
|
||||||
|
ogain: { class: audio_gain, in:{ in:osc.out, gain:amp_sh.out}}
|
||||||
|
}
|
||||||
|
|
||||||
|
presets: {
|
||||||
|
net_a: { hz_lfo: { dc:220, gain:55 }, amp_lfo: { gain:0.8 } },
|
||||||
|
net_b: { hz_lfo: { dc:110, gain:25 }, amp_lfo: { gain:0.7 } },
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
The structure of a user defined procedure is the same as a __caw__ top level program with the
|
||||||
|
addition of the __vars__ dictionary. The elements of the __vars__ dictionary are a simplified
|
||||||
|
version of the variable descriptions from the processor class description record.
|
||||||
|
Each user defined __var__ element creates an input or output port for the user defined process using
|
||||||
|
the `proxy` keyword. Output ports are distinguished from input ports by the `out` attribute as
|
||||||
|
shown in the `mo_out` port.
|
||||||
|
|
||||||
|
The `mod_osc` user defined processor is instantiated and used just like a built-in processor.
|
||||||
|
```
|
||||||
|
user_defined_subnet_12 : {
|
||||||
|
non_real_time_fl: true,
|
||||||
|
dur_limit_secs: 5,
|
||||||
|
|
||||||
|
network: {
|
||||||
|
procs: {
|
||||||
|
sub_osc: { class: mod_osc args:{ hz:220, hz_mod_hz:3, hz_mod_depth:55, amp_mod_hz:2, amp_mod_depth:0.5 }},
|
||||||
|
af: { class: audio_file_out, in:{ in:sub_osc.mo_out } args:{ fname:"$/out.wav"}}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
The data types are:
|
|
||||||
|
|
||||||
Type | Description
|
|
||||||
-----|-------------
|
|
||||||
b | bool
|
|
||||||
u | unsigned
|
|
||||||
i | int
|
|
||||||
f | float
|
|
||||||
d | double
|
|
||||||
s | string
|
|
||||||
t | time
|
|
||||||
c | cfg
|
|
||||||
abuf | audio
|
|
||||||
fbuf | spectrum
|
|
||||||
mbuf | MIDI
|
|
||||||
|
|
||||||
|
|
||||||
### Appendix:
|
### Appendix:
|
||||||
@ -786,6 +850,25 @@ Label | Description
|
|||||||
`print_network_fl` |
|
`print_network_fl` |
|
||||||
|
|
||||||
|
|
||||||
|
#### `log:{...}` statement data type abbreviations:
|
||||||
|
|
||||||
|
Type | Description
|
||||||
|
-----|-------------
|
||||||
|
b | bool
|
||||||
|
u | unsigned
|
||||||
|
i | int
|
||||||
|
f | float
|
||||||
|
d | double
|
||||||
|
s | string
|
||||||
|
t | time
|
||||||
|
c | cfg
|
||||||
|
abuf | audio
|
||||||
|
fbuf | spectrum
|
||||||
|
mbuf | MIDI
|
||||||
|
|
||||||
|
|
||||||
|
### Execution Model
|
||||||
|
|
||||||
### Some Invariants
|
### Some Invariants
|
||||||
|
|
||||||
#### Network Invariants
|
#### Network Invariants
|
||||||
|
Loading…
Reference in New Issue
Block a user