caw/examples/examples.cfg
2024-10-12 15:39:55 -04:00

582 lines
18 KiB
INI

{
base_dir: "~/src/caw/examples/io", // Base project directory. See 'sine_file_01' below.
io_dict: "~/src/caw/src/caw/cfg/io.cfg" // Runtime configuration file.
proc_dict: "~/src/caw/src/libcw/flow/proc_dict.cfg", // Processor class definition file.
udp_dict: "~/src/caw/src/libcw/flow/udp_dict.cfg", // User defined proc files
programs: {
ex_00_rt_sine: {
//dur_limit_secs:5.0,
network: {
procs: {
osc: { class:sine_tone, args:{ hz:500.0 }},
aout:{ class:audio_out, in:{ in:osc.out }, args:{ dev_label:"main"} }
}
}
}
// Demonstrate a simple two processor network.
ex_01_sine_file: {
non_real_time_fl:true,
dur_limit_secs:5.0,
network: {
procs: {
osc: { class: sine_tone },
af: { class: audio_file_out, in: { in:osc.out } args:{ fname:"$/out.wav"} }
}
}
}
// Demonstrate a simple signal processing network
ex_02_mod_sine: {
non_real_time_fl:true,
dur_limit_secs:5.0,
network: {
procs: {
lfo: { class: sine_tone, args:{ hz:3, dc:440, gain:110 }}
sh: { class: sample_hold, in:{ in:lfo.out } }
osc: { class: sine_tone, preset:mono, in:{ hz:sh.out } },
af: { class: audio_file_out, in: { in:osc.out } args:{ fname:"$/out.wav"} }
}
}
}
// Demonstrate applying a preset at initialization time.
ex_03_presets: {
non_real_time_fl:true,
dur_limit_secs:5.0,
preset: "a",
network: {
procs: {
lfo: { class: sine_tone, args:{ hz:3, dc:440, gain:110 }}
sh: { class: sample_hold, in:{ in:lfo.out } }
osc: { class: sine_tone, in:{ hz:sh.out } },
af: { class: audio_file_out, in: { in:osc.out } args:{ fname:"$/out.wav"} }
}
presets:
{
a: { lfo: { hz:1.0, dc:880 }, osc: { gain:0.95 } },
b: { lfo: { hz:2.0, dc:220 }, osc: { gain:0.75 } },
c: { lfo: a880 }, // apply a the sine_tone class preset 'a880'
d: [ a,b,0.5 ] // apply a dual preset by interpolating midway between preset 'a' and 'b'.
}
}
}
// Demonstrate the `print` processor and event programming.
ex_04_program: {
non_real_time_fl:true,
dur_limit_secs: 10.0,
network {
procs: {
tmr: { class: timer, args:{ period_ms:1000.0 }},
cnt: { class: counter, in: { trigger:tmr.out }, args:{ min:0, max:3, inc:1, init:0, mode:modulo } },
print: { class: print, in: { in:cnt.out, eol_fl:cnt.out }, args:{ text:["my","count"] }}
}
}
}
// Demonstrate 'mult' inputs.
ex_05_mult_inputs: {
non_real_time_fl:true,
dur_limit_secs: 10.0,
network: {
procs: {
tmr: { class: timer, args:{ period_ms:1000.0 }},
cnt: { class: counter, in: { trigger:tmr.out }, args:{ min:0, max:3, inc:1, init:0, mode:modulo } },
numb: { class: number, args:{ in:3 }},
sum: { class: add, in: { in0:cnt.out, in1:numb.out } },
print: { class: print, in: { in0:cnt.out, in1:sum.out, eol_fl:sum.out }, args:{ text:["cnt","add","count"] }}
}
}
}
// Demonstrate different forms of the in-stmt
ex_06_mult_conn: {
non_real_time_fl:true,
dur_limit_secs: 5.0,
network: {
procs: {
// Create an oscillator with a single audio output containing 6 channels.
// Each of the channels is a different frequency.
osc: { class: sine_tone, args: { ch_cnt:6, hz:[110,220,440,880,1760, 3520] }},
// Split the single audio signal into three signals
split: { class: audio_split, in:{ in:osc.out }, args: { select:[ 0,0, 1,1, 2,2 ] } },
// Create merge.in0,in1,in2 by iterating across all outputs of 'split'.
merge_a: { class: audio_merge, in:{ in_:split.out_ } },
af_a: { class: audio_file_out, in:{ in:merge_a.out }, args:{ fname:"$/out_a.wav" }}
// Create merge.in0,in1 and connect them to split.out0 and split.out1
merge_b: { class: audio_merge, in:{ in_:split.out0_2 } },
af_b: { class: audio_file_out, in:{ in:merge_b.out }, args:{ fname:"$/out_b.wav" }}
// Create merge.in0,in1 and connect them both to split.out1
merge_c: { class: audio_merge, in:{ in0_2:split.out1 } },
af_c: { class: audio_file_out, in:{ in:merge_c.out }, args:{ fname:"$/out_c.wav" }}
}
}
}
// Demonstrate creating processors with explicit sfx-ids and connecting to them with a single in-stmt.
ex_07_proc_suffix: {
non_real_time_fl:true,
dur_limit_secs: 5.0,
network: {
procs: {
osc: { class: sine_tone, args: { ch_cnt:6, hz:[110,220,440,880,1760, 3520] }},
split: { class: audio_split, in:{ in:osc.out }, args: { select:[ 0,0, 1,1, 2,2 ] } },
// Create 3 audio gain controls with explicit sfx-ids
g0: { class:audio_gain, in:{ in:split0.out0 }, args:{ gain:0.9} },
g1: { class:audio_gain, in:{ in:split0.out1 }, args:{ gain:0.5} },
g2: { class:audio_gain, in:{ in:split0.out2 }, args:{ gain:0.1} },
// Create audio-merge inputs and connect them to 3 consecutive gain controls
// by iterating the in-stmt over the source proc sfx-id.
merge: { class: audio_merge, in:{ in_:g_.out } },
af: { class: audio_file_out, in:{ in:merge.out }, args:{ fname:"$/out_a.wav" }}
}
}
}
// Demonstrate instantiating 'mult' variables from the an 'args' statement.
ex_08_mix: {
non_real_time_fl:true,
dur_limit_secs:5.0,
network: {
procs: {
osc0: { class: sine_tone, args: { hz:110 } },
osc1: { class: sine_tone, args: { hz:220 } },
gain: { class: number, args: { in:0.5f } },
// Instantiate gain:0 and gain:1 to control the input gain of in:0 and in:1.
mix: { class: audio_mix, in: { in_:osc_.out }, args:{ igain0:[0.8, 0], igain1:[0, 0.2] } },
af: { class: audio_file_out, in: { in:mix.out } args:{ fname:"$/out.wav"} }
}
}
}
// Demonstrate a network with a polyphonic subnet.
ex_09_homog_poly: {
non_real_time_fl:true,
dur_limit_secs: 5.0,
network: {
procs: {
g_list: { class: list, args: { in:0, list:[ 110f,220f,440f ]}},
dc_list: { class: list, args: { in:0, list:[ 220f,440f,880f ]}},
osc_poly: {
class: poly,
// Create 3 instances of 'network' and run them in concurrently.
args: { count:3, parallel_fl:true },
network: {
procs: {
lfo: { class: sine_tone, in:{ _.dc:_.dc_list.value_, _.gain:_.g_list.value_ } args: { ch_cnt:1, hz:3 }},
sh: { class: sample_hold, in:{ in:lfo.out }},
osc: { class: sine_tone, in:{ hz: sh.out }},
}
}
}
// Iterate over the instances of `osc_poly.osc_.out` to create one `audio_merge`
// input for every output from the polyphonic network.
merge: { class: audio_merge, in:{ in_:osc_poly.osc_.out}, args:{ gain:1, out_gain:0.5 }},
af: { class: audio_file_out, in:{ in:merge.out } args:{ fname:"$/out.wav"} }
}
}
}
// Demonstrate a network with poly network with different subnets.
ex_10_hetero_poly: {
non_real_time_fl:true,
dur_limit_secs: 5.0,
network: {
procs: {
g_list: { class: list, args: { in:0, list:[ 110f,220f,440f ]}},
dc_list: { class: list, args: { in:0, list:[ 220f,440f,880f ]}},
osc_poly: {
class: poly,
args: { parallel_fl:true },
network: [
// network 0
{
procs: {
lfo: { class: sine_tone, in:{ _.dc:_.dc_list.value_, _.gain:_.g_list.value_ } args: { ch_cnt:1, hz:3 }},
sh: { class: sample_hold, in:{ in:lfo.out }},
osc: { class: sine_tone, in:{ hz: sh.out }},
}
},
// network 1
{
procs: {
oscil: { class: sine_tone, args:{ hz:55 }},
}
}
]
}
// Iterate over the instances of `osc_poly.osc_.out` to create one `audio_merge`
// input for every output from the polyphonic network.
merge: { class: audio_merge, in:{ in0:osc_poly.osc.out, in1:osc_poly.oscil1.out}, args:{ gain:1, out_gain:0.5 }},
af: { class: audio_file_out, in:{ in:merge.out } args:{ fname:"$/out.wav"} }
}
}
}
ex_11_feedback: {
non_real_time_fl:true,
max_cycle_count: 10,
network: {
procs: {
a: { class: number, log:{out:0}, args:{ in:1 }},
b: { class: number, log:{out:0 }, args:{ in:2 }},
add: { class: add, in: { in0:a.out, in1:b.out }, out: { out:b.in },
log:{out:0} }
}
}
},
ex_11a_feedback: {
non_real_time_fl:true,
max_cycle_count: 10,
print_network_fl: true,
network: {
procs: {
a: { class: number, log:{out:0}, args:{ in:1 }},
b: { class: reg, in:{ in:a.in }, log:{out:0} },
add: { class: add, in: { in0:a.out, in1:b.out }, out: { out:b.in },
log:{out:0}, args:{ otype:int }}
}
}
},
ex_12_user_defined_proc : {
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: {
non_real_time_fl:false,
dur_limit_secs: 30.0,
network: {
procs: {
tempo: { class:number, args:{ in:2000.0 } },
note_dur: { class:number, args:{ in:1000.0 } },
tmrA: { class: timer, in:{ period_ms:tempo.out } },
cntA: { class: counter, in:{ trigger:tmrA.out }, args:{init:1, min:1, max:128, inc:7, repeat_fl:false, out_type:uint }},
tmrB: { class: timer, in:{ delay_ms:note_dur.out, period_ms:tempo.out } },
zero: { class: number, in:{ trigger:tmrB.out }, args:{ in:0 }},
stop_cnt: { class: counter, in:{ trigger:zero.out }, args:{min:0, max:19, inc:1, repeat_fl:false } },
stop: { class: halt, in:{ in:stop_cnt.upr_lim }},
vel: { class: number, in:{ in0:cntA.out, in1:zero.out }, args:{ out_type:uint }},
log: { class:print, in:{ in0:stop_cnt.out, in1:vel.out, eol_fl:vel.out },args:{ text:[ "i", "d1", ""] }},
note_msg: { class:midi_msg, in:{d1:vel.out, trigger:vel.out }, args:{ch:0, status:144, d0:60}},
damp_msg: { class:midi_msg, args:{ch:0, status:176, d0:64}},
mmerge: { class:midi_merge, in:{ in0:note_msg.out, in1:damp_msg.out }},
mout: { class:midi_out in:{ in:mmerge.out} , args:{ dev_label:"MIDIFACE 2x2", port_label:"MIDIFACE 2x2 Midi Out 1" }}
ain: { class: audio_in, args:{ dev_label:"main" }},
split: { class: audio_split, in:{ in:ain.out } args:{ select: [0,0, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1] }},
mark: { class: audio_marker, in:{ in:split.out0, trigger:vel.out }},
af: { class: audio_file_out, in:{ in:mark.out }, args:{ fname:"~/temp/samples1.wav"}},
aout: { class: audio_out, in:{ in:ain.out }, args:{ dev_label:"main"}},
}
}
},
sample_gen_14: {
non_real_time_fl:false,
network: {
procs: {
tempo: { class: number, args:{ in:1500.0 } },
tmrA: { class: timer, in:{ period_ms:tempo.out } },
cntA: { class: counter, in:{ trigger:tmrA.out }, args:{ init:1, min:1, max:128, inc:7, repeat_fl:false, out_type:uint }},
log: { class: print, in:{ in0:cntA.out, eol_fl:cntA.out }, args:{ text:["x",""] } },
stop: { class: halt, in:{ in:cntA.upr_lim } }
}
}
},
sample_gen_15: {
non_real_time_fl:false,
network: {
procs: {
mf: { class: midi_file, args:{ csv_fname:"~/temp/wt3/21_sample.csv" }},
mout: { class: midi_out in:{ in:mf.out }, args:{ dev_label:"MIDIFACE 2x2", port_label:"MIDIFACE 2x2 Midi Out 1" }},
stop: { class: halt, in:{ in:mf.done_fl }}
ain: { class: audio_in, args:{ dev_label:"main" }},
split: { class: audio_split, in:{ in:ain.out } args:{ select: [0,0, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1] }},
af: { class: audio_file_out, in:{ in:split.out0 }, args:{ fname:"~/temp/wt3/wav/21_samples.wav"}},
aout: { class: audio_out, in:{ in:ain.out }, args:{ dev_label:"main"}},
}
}
},
midi_voice_16: {
non_real_time_fl:false,
network: {
procs: {
mf: { class: midi_file, args:{ csv_fname:"~/temp/temp_midi.csv" }},
voc: { class: midi_voice, in: { in:mf.out } },
stop: { class: halt, in: { in:mf.done_fl }}
af: { class: audio_file_out, in:{ in:voc.out }, args:{ fname:"~/temp/wt/wav/samples.wav"}},
}
}
},
audio_mix_17: {
network: {
procs: {
oscA: { class:sine_tone, args:{ hz:100.0 }},
oscB: { class:sine_tone, args:{ hz:101.0 }},
amix: { class:audio_mix, in{ in0:oscA.out, in1:oscB.out }}
aout:{ class:audio_out, in:{ in:amix.out }, args:{ dev_label:"main"} }
}
}
}
poly_voice_18: {
non_real_time_fl:false,
dur_limit_secs:10,
network: {
procs: {
midi_in: { class:midi_in },
vctl: { class: poly_voice_ctl, in:{ in:midi_in.out }, args:{ voice_cnt:3 } },
voice_poly: {
class: poly,
args: { count:3 }
network: {
procs: {
voc: { class:midi_voice, in:{ _.in:_.vctl.out_ } out:{ _.done_fl:_.vctl.done_fl_ } },
}
}
}
asil: { class: audio_silence, args:{ ch_cnt:6 }},
amix: { class: audio_mix, in:{ in_:voice_poly.voc_.out } },
amrg: { class: audio_merge, in:{ in0:asil.out, in1:amix.out } },
aout: { class: audio_out, in:{ in:amrg.out }, args:{ dev_label:"main"}}
}
}
}
midi_split_19: {
non_real_time_fl:false,
dur_limit_secs:10,
network: {
procs: {
midi_in: { class:midi_in },
ms: { class:midi_split, in: { in:midi_in.out } },
map: { class: list, in:{in:ms.d0}, args: { cfg_fname:"/home/kevin/temp/map.cfg"}},
//mm: { class:midi_msg, in: {ch:ms.ch, status:ms.status, d1:map.out, trigger:map.out } args:{ d0:60 } },
log: { class: print, in: { in0:ms.ch, in1:ms.status, in2:ms.d0, in3:map.out, eol_fl:map.out }, args:{ text:["ch","st","d0","d1",""] } },
}
}
}
piano_voice_20: {
non_real_time_fl:false,
dur_limit_secs:30,
network: {
procs: {
midi_in: { class:midi_in },
vctl: { class: poly_voice_ctl, in:{ in:midi_in.out }, args:{ voice_cnt:3 } },
voice_poly: {
class: poly,
args: { count:3 }
network: {
procs: {
voc: { class:piano_voice, in:{ _.in:_.vctl.out_ },
out:{ _.done_fl:_.vctl.done_fl_ },
args:{ wtb_dir:"~/temp/temp_5.json", wtb_instr:"piano", test_pitch:60 } },
}
}
}
asil: { class: audio_silence, args:{ ch_cnt:6 }},
amix: { class: audio_mix, in:{ in_:voice_poly.voc_.out } args:{ igain_:1.0} },
asel: { class: audio_split, in:{ in:amix.out }, args:{ select:[0,1] }},
amrg: { class: audio_merge, in:{ in0:asil.out, in1:asel.out0, in2:asel.out1 }, args:{ out_gain:2.0 } },
aout: { class: audio_out, in:{ in:amrg.out }, args:{ dev_label:"main"}}
}
}
}
// Play stereo audio out channels 7&8 of the Scarlett.
audio_test_21: {
non_real_time_fl:false,
dur_limit_secs:10,
network: {
procs: {
asil: { class:audio_silence, args:{ ch_cnt:6 }}
osc: { class:sine_tone, args:{ hz:440.0, ch_cnt:2 }},
amrg: { class:audio_merge, in:{ in0:asil.out, in1:osc.out }, args:{ out_gain:1 } },
amtr: { class:audio_meter, in:{ in:amrg.out }, args:{ rpt_ms:500 }},
aout:{ class:audio_out, in:{ in:amrg.out }, args:{ dev_label:"main"} }
}
}
}
piano_voice_22: {
non_real_time_fl:false,
//dur_limit_secs:300,
network: {
procs: {
mf: { class: midi_file, args:{ csv_fname:"~/temp/all_midi.csv" }},
stop: { class: halt, in:{ in:mf.done_fl }}
vctl: { class: poly_voice_ctl, in:{ in:mf.out }, args:{ voice_cnt:3 } },
voice_poly: {
class: poly,
args: { count:3 }
network: {
procs: {
voc: { class:piano_voice, in:{ _.in:_.vctl.out_ },
out:{ _.done_fl:_.vctl.done_fl_ },
args:{ wtb_fname:"~/temp/temp_5.json", wtb_instr:"piano" } },
}
}
}
asil: { class: audio_silence, args:{ ch_cnt:6 }},
amix: { class: audio_mix, in:{ in_:voice_poly.voc_.out } args:{ igain_:1.0 }},
//amrg: { class: audio_merge, in:{ in0:asil.out, in1:amix.out }, args:{ out_gain:1.0 } },
aout: { class: audio_out, in:{ in:amix.out }, args:{ dev_label:"main"}}
}
}
}
sample_gen_23: {
non_real_time_fl:false,
network: {
procs: {
mf: { class: midi_file, args:{ csv_fname:"~/temp/wt1/21_sample.csv" }},
mout: { class: midi_out in:{ in:mf.out }, args:{ dev_label:"MIDIFACE 2x2", port_label:"MIDIFACE 2x2 Midi Out 1" }},
stop: { class: halt, in:{ in:mf.done_fl }}
ain: { class: audio_in, args:{ dev_label:"main" }},
split: { class: audio_split, in:{ in:ain.out } args:{ select: [0,0, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1] }},
//af: { class: audio_file_out, in:{ in:split.out0 }, args:{ bits:0, fname:"~/temp/test.wav"}},
asil: { class: audio_silence, args:{ ch_cnt:6 }},
amrg: { class: audio_merge, in:{ in0:asil.out, in1:split.out0 }, args:{ out_gain:1.0 } },
aout: { class: audio_out, in:{ in:amrg.out }, args:{ dev_label:"main"}}
}
}
},
}
}