From edffaf20f3109843e6d40ae97ad45535e57674db Mon Sep 17 00:00:00 2001 From: kevin Date: Tue, 14 Feb 2023 21:15:51 -0500 Subject: [PATCH] main.cpp,main.cfg : Added vectOpTest(),scoreFollowTest(), --- src/cwtest/cfg/main.cfg | 1263 ++++++++++++++++++++------------------- src/cwtest/main.cpp | 16 + 2 files changed, 660 insertions(+), 619 deletions(-) diff --git a/src/cwtest/cfg/main.cfg b/src/cwtest/cfg/main.cfg index fc5df41..238eb1d 100644 --- a/src/cwtest/cfg/main.cfg +++ b/src/cwtest/cfg/main.cfg @@ -19,6 +19,7 @@ fileSys: {}, numbCvt: {}, object: {}, + vop:{}, time:{}, thread: {}, kbTest1: {}, @@ -59,18 +60,18 @@ listEle: { - row: { + row: { check: { name: playCheckId, title:"Play", value: false }, - select: { name: preMenuId, title:"Preset", - children: - { - option:{ name: psOpt1, title:"Sel 1" }, - option:{ name: psOpt2, title:"Sel 2" }, - option:{ name: psOpt3, title:"Sel 3" } - }, - } - }, - + select: { name: preMenuId, title:"Preset", + children: + { + option:{ name: psOpt1, title:"Sel 1" }, + option:{ name: psOpt2, title:"Sel 2" }, + option:{ name: psOpt3, title:"Sel 3" } + }, + } + }, + } }, @@ -93,12 +94,12 @@ serial: { - pollPeriodMs: 50, - recvBufByteN: 512, - - array: [ + pollPeriodMs: 50, + recvBufByteN: 512, + + array: [ { - enable_flag: true, + enable_flag: true, label: "port1", // User label device: "/dev/ttyACM0", // Serial device name baud: 115200, @@ -119,79 +120,79 @@ audio: { meterMs: 50, // audio meter filter length and meter callback period - threadTimeOutMs: 50, // audio thread cond var time out + threadTimeOutMs: 50, // audio thread cond var time out - groupL: [ - { - enableFl: true, // (req) - label: "main", // (req) User label - id: 0, // (req) User id (can also be set at runtime) + groupL: [ + { + enableFl: true, // (req) + label: "main", // (req) User label + id: 0, // (req) User id (can also be set at runtime) srate: 48000, // (req) Sample rate used by all devices in this group - dspFrameCnt: 64 // (req) Size of DSP processing buffers - } - ], + dspFrameCnt: 64 // (req) Size of DSP processing buffers + } + ], deviceL: [ { - // System device name + // System device name //device: "Scarlett 18i20 USB USB Audio", - //device: "USB Audio CODEC USB Audio", - device: "HDA Intel PCH CS4208 Analog", - + //device: "USB Audio CODEC USB Audio", + device: "HDA Intel PCH CS4208 Analog", + enableFl: true, // (req) - label: "main", // (req) User label - userId: 0, // (opt) User id (can also be set at runtime) - framesPerCycle: 512, // (req) Samples per audio device cycle - cycleCnt: 3, // (req) Count of device cycle buffers. - inGroup: "main", // (opt) All devices in a group must be 'ready' to source - outGroup: "main", // (opt) or sink data before an audio callback is made for that group + label: "main", // (req) User label + userId: 0, // (opt) User id (can also be set at runtime) + framesPerCycle: 512, // (req) Samples per audio device cycle + cycleCnt: 3, // (req) Count of device cycle buffers. + inGroup: "main", // (opt) All devices in a group must be 'ready' to source + outGroup: "main", // (opt) or sink data before an audio callback is made for that group } ] }, - socket: { + socket: { maxSocketCnt: 10, - recvBufByteCnt: 4096, - threadTimeOutMs: 50, - - socketL: [ - { - enableFl: true, // (req) - label: "sock0", // (req) - userId: 0, // (opt) - port: 5687, // (req) This sockets port number - timeOutMs: 50, // (req) Timeout used for blocking sockets. - - // Attributes: - // blocking or non-blocking, - // udp or tcp, - // listen, broadcast - // reuse_addr, reuse_port, multi_cast_ttl, multi_cast_loop - // stream - attrL: [ udp, blocking ], - - // Automatically connect to this remote socket. - // remoteAddr: "192.168.0.10", // (opt) - // remotePort: 5687 // (opt) - }, + recvBufByteCnt: 4096, + threadTimeOutMs: 50, + + socketL: [ + { + enableFl: true, // (req) + label: "sock0", // (req) + userId: 0, // (opt) + port: 5687, // (req) This sockets port number + timeOutMs: 50, // (req) Timeout used for blocking sockets. + + // Attributes: + // blocking or non-blocking, + // udp or tcp, + // listen, broadcast + // reuse_addr, reuse_port, multi_cast_ttl, multi_cast_loop + // stream + attrL: [ udp, blocking ], + + // Automatically connect to this remote socket. + // remoteAddr: "192.168.0.10", // (opt) + // remotePort: 5687 // (opt) + }, - { - enableFl: true, // (req) - label: "sock1", // (req) - userId: 1, // (opt) - port: 5688, // (req) This sockets port number - timeOutMs: 50, // (req) Timeout used for blocking sockets. - - attrL: [ udp, blocking ], - } + { + enableFl: true, // (req) + label: "sock1", // (req) + userId: 1, // (opt) + port: 5688, // (req) This sockets port number + timeOutMs: 50, // (req) Timeout used for blocking sockets. + + attrL: [ udp, blocking ], + } - ] - - - } + ] + + + } }, @@ -203,16 +204,20 @@ audio_midi: { audio_midi: { - record_dir: "/home/kevin/temp/audio_midi_app", - record_folder: "record", - record_fn_ext: "am", - max_midi_msg_count: 32768, - midi_timer_period_micro_sec: 15000, - midi_out_device: "Fastlane", - midi_out_port: "Fastlane MIDI A", - audio_in_ch_map: [0, 1 ], - audio_out_ch_map: [0, 1 ] - }, + record_dir: "/home/kevin/temp/audio_midi_app", + record_folder: "record", + record_fn_ext: "am", + max_midi_msg_count: 32768, + midi_timer_period_micro_sec: 15000, + //midi_out_device: "Fastlane", + //midi_out_port: "Fastlane MIDI A", + + midi_out_device: "iRig MIDI 2", + midi_out_port: "iRig MIDI 2 MIDI 1", + + audio_in_ch_map: [0, 1 ], + audio_out_ch_map: [0, 1 ] + }, ui: { physRootDir: "/home/kevin/src/cwtest/src/libcw/html/audio_midi", @@ -223,70 +228,77 @@ fmtBufByteN: 4096, websockTimeOutMs: 50, // max time out while blocking for a websock event uiCfgFn: "ui.cfg" // default UI resource description + idleMsgPeriodMs: 50, // period without messages before an idle message is generated + asyncFl: false }, serial: { - pollPeriodMs: 50, - recvBufByteN: 512 + pollPeriodMs: 50, + recvBufByteN: 512 array: [ - { + { + enableFl: false, + asyncFl: false, label: "port1", // User label device: "/dev/ttyACM0", // Serial device name baud: 38400, bits: 8, stop: 1, parity: no, - } - ] + } + ] }, midi: { parserBufByteN: 1024, + asyncFl: false }, audio: { meterMs: 50, // audio meter filter length and meter callback period - threadTimeOutMs: 50, // audio thread cond var time out + threadTimeOutMs: 50, // audio thread cond var time out - groupL: [ - { - enableFl: true, // (req) - label: "main", // (req) User label - id: 0, // (req) User id (can also be set at runtime) + groupL: [ + { + enableFl: true, // (req) + asyncFl: true, + label: "main", // (req) User label + id: 0, // (req) User id (can also be set at runtime) srate: 48000, // (req) Sample rate used by all devices in this group - dspFrameCnt: 64 // (req) Size of DSP processing buffers - } - ], + dspFrameCnt: 64 // (req) Size of DSP processing buffers + } + ], deviceL: [ { - // System device name + // System device name device: "Scarlett 18i20 USB USB Audio", - //device: "USB Audio CODEC USB Audio", - //device: "HDA Intel PCH CS4208 Analog", - + //device: "USB Audio CODEC USB Audio", + //device: "HDA Intel PCH CS4208 Analog", + enableFl: true, // (req) - label: "main", // (req) User label - userId: 0, // (opt) User id (can also be set at runtime) - framesPerCycle: 512, // (req) Samples per audio device cycle - cycleCnt: 3, // (req) Count of device cycle buffers. - inGroup: "main", // (opt) All devices in a group must be 'ready' to source - outGroup: "main", // (opt) or sink data before an audio callback is made for that group + label: "main", // (req) User label + userId: 0, // (opt) User id (can also be set at runtime) + framesPerCycle: 512, // (req) Samples per audio device cycle + cycleCnt: 3, // (req) Count of device cycle buffers. + inGroup: "main", // (opt) All devices in a group must be 'ready' to source + outGroup: "main", // (opt) or sink data before an audio callback is made for that group } ] }, - socket: { + socket: { + asyncFl: false, maxSocketCnt: 10, - recvBufByteCnt: 4096, - threadTimeOutMs: 50, - socketL: [], - - } + recvBufByteCnt: 4096, + threadTimeOutMs: 50, + socketL: [], + + } }, @@ -325,70 +337,70 @@ //rpt: { midiFn:"~/src/currawong/audio/workshop/demare2/record_5/midi.mid"} // csv: { midiFn:"~/src/currawong/audio/workshop/demare2/record_5/midi.mid", csvFn: "midi.csv" } //csv0: { midiFn:"~/src/currawong/site/web_part_selection/GUTIM part 1 no colors, single system all sections correcting staves distance.mid", - // csvFn: "~/temp/midi.csv" } + // csvFn: "~/temp/midi.csv" } batch_convert: { io_dir: "~/src/currawong/audio/workshop", - session_dir: "beck1", - take_begin: 0, - take_end: 9, - print_warnings_flag: false + session_dir: "beck1", + take_begin: 0, + take_end: 9, + print_warnings_flag: false }, batch_convert: { io_dir: "~/src/currawong/audio/workshop", - session_dir: "beck2", - take_begin: 0, - take_end: 9, - print_warnings_flag: false + session_dir: "beck2", + take_begin: 0, + take_end: 9, + print_warnings_flag: false }, batch_convert: { io_dir: "~/src/currawong/audio/workshop", - session_dir: "taka1", - take_begin: 0, - take_end: 10, - print_warnings_flag: false + session_dir: "taka1", + take_begin: 0, + take_end: 10, + print_warnings_flag: false }, batch_convert: { io_dir: "~/src/currawong/audio/workshop", - session_dir: "taka2", - take_begin: 0, - take_end: 16, - print_warnings_flag: false + session_dir: "taka2", + take_begin: 0, + take_end: 16, + print_warnings_flag: false }, batch_convert: { io_dir: "~/src/currawong/audio/workshop", - session_dir: "nonken1", - take_begin: 0, - take_end: 18, - print_warnings_flag: false + session_dir: "nonken1", + take_begin: 0, + take_end: 18, + print_warnings_flag: false }, batch_convert: { io_dir: "~/src/currawong/audio/workshop", - session_dir: "nonken2", - take_begin: 0, - take_end: 12, - print_warnings_flag: false + session_dir: "nonken2", + take_begin: 0, + take_end: 12, + print_warnings_flag: false }, batch_convert: { io_dir: "~/src/currawong/audio/workshop", - session_dir: "demare1", - take_begin: 0, - take_end: 13, - print_warnings_flag: false + session_dir: "demare1", + take_begin: 0, + take_end: 13, + print_warnings_flag: false }, batch_convert: { io_dir: "~/src/currawong/audio/workshop", - session_dir: "demare2", - take_begin: 0, - take_end: 10, - print_warnings_flag: false + session_dir: "demare2", + take_begin: 0, + take_end: 10, + print_warnings_flag: false }, }, @@ -869,7 +881,7 @@ args: { procSmpN: 512, wndSmpN: 2048, - hopSmpN: 512 + hopSmpN: 512 } } } @@ -933,15 +945,15 @@ balance: { vars: { - in: { type:real, value:0.5, doc:"Input vaue" }, - out: { type:real, doc:"Ouput value. Same as input value."}, - inv_out: { type:real, doc:"1.0 minus output value."} - } + in: { type:real, value:0.5, doc:"Input vaue" }, + out: { type:real, doc:"Ouput value. Same as input value."}, + inv_out: { type:real, doc:"1.0 minus output value."} + } } audio_in: { vars: { - dev_label: { type:string, doc:"Audio device label." }, + dev_label: { type:string, doc:"Audio device label." }, out: { type:audio, doc:"Audio output" }, } } @@ -964,85 +976,85 @@ audioFileOut: { vars: { fname: { type:string, doc:"Audio file name." }, - bits: { type:uint, value:32, doc:"Audio file word width. (8,16,24,32,0=float32)."}, + bits: { type:uint, value:32, doc:"Audio file word width. (8,16,24,32,0=float32)."}, in: { type:audio, srcFl:true, doc:"Audio file input." } } } audio_gain: { vars: { - in: { type:audio, srcFl:true, doc:"Audio input." }, - gain: { type:real, value:1.0, doc:"Gain coefficient." } - out: { type:audio, doc:"Audio output." }, + in: { type:audio, srcFl:true, doc:"Audio input." }, + gain: { type:real, value:1.0, doc:"Gain coefficient." } + out: { type:audio, doc:"Audio output." }, } } audio_split: { vars: { - in: { type:audio, srcFl:true, doc:"Audio input." }, - select: { type:bool, doc:"Enable/Disable each channel" } - gain: { type:real, value:1.0, doc:"Audio gain for each selected (output) channel." } - out: { type:audio, doc:"Audio output." }, - } + in: { type:audio, srcFl:true, doc:"Audio input." }, + select: { type:bool, doc:"Enable/Disable each channel" } + gain: { type:real, value:1.0, doc:"Audio gain for each selected (output) channel." } + out: { type:audio, doc:"Audio output." }, + } presets: - { - mute_off: { gain:1 }, - mute_on: { gain:0 }, - } + { + mute_off: { gain:1 }, + mute_on: { gain:0 }, + } } audio_duplicate: { vars: { - in: { type:audio, srcFl:true, doc:"Audio input."}, - duplicate: { type: uint, doc:"Count of times to repeat this channel." }, - gain: { type: real, value:1.0, doc:"Audio gain." }, - out: { type:audio, doc:"Audio output containing repeat * input channel count channels."} - } + in: { type:audio, srcFl:true, doc:"Audio input."}, + duplicate: { type: uint, doc:"Count of times to repeat this channel." }, + gain: { type: real, value:1.0, doc:"Audio gain." }, + out: { type:audio, doc:"Audio output containing repeat * input channel count channels."} + } } audio_merge: { vars: { - in0: { type:audio, srcFl:true, doc:"First audio input." }, - in1: { type:audio, srcFl:true, doc:"Second audio input." }, - gain: { type:real, value:1.0, doc:"Audio gain for each selected (output) channel." } - out: { type:audio, doc:"Audio output. Channel count is the sum of the input channel count." }, - } + in0: { type:audio, srcFl:true, doc:"First audio input." }, + in1: { type:audio, srcFl:true, doc:"Second audio input." }, + gain: { type:real, value:1.0, doc:"Audio gain for each selected (output) channel." } + out: { type:audio, doc:"Audio output. Channel count is the sum of the input channel count." }, + } } audio_mix: { vars: { - in0: { type:audio, srcFl:true, doc:"First audio input." }, - in1: { type:audio, srcFl:true, doc:"Second audio input." }, - gain0: { type:real, value:0.5, doc:"Audio gain for input 0." }, - gain1: { type:real, value:0.5, doc:"Audio gain for input 1." }, - out: { type:audio, doc:"Audio output. Channel count is the sum of the input channel count." }, - } + in0: { type:audio, srcFl:true, doc:"First audio input." }, + in1: { type:audio, srcFl:true, doc:"Second audio input." }, + gain0: { type:real, value:0.5, doc:"Audio gain for input 0." }, + gain1: { type:real, value:0.5, doc:"Audio gain for input 1." }, + out: { type:audio, doc:"Audio output. Channel count is the sum of the input channel count." }, + } } audio_delay: { vars: { - in: { type:audio, srcFl:true, doc:"Audio input." }, - maxDelayMs: { type:real, value:1000.0 doc:"Maximum possible delay in milliseconds." }, - delayMs: { type:real, doc:"Delay in milliseconds." }, - out: { type:audio, doc:"Audio output." }, - } + in: { type:audio, srcFl:true, doc:"Audio input." }, + maxDelayMs: { type:real, value:1000.0 doc:"Maximum possible delay in milliseconds." }, + delayMs: { type:real, doc:"Delay in milliseconds." }, + out: { type:audio, doc:"Audio output." }, + } } sine_tone: { vars: { - srate: { type:real, value:48000.0, doc:"Sine tone sample rate."} - chCnt: { type:uint, value:2, doc:"Output signal channel count."}, - hz: { type:real, value:440.0, doc:"Frequency in Hertz."}, - gain: { type:real, value:0.8, doc:"Signal frequency."}, + srate: { type:real, value:48000.0, doc:"Sine tone sample rate."} + chCnt: { type:uint, value:2, doc:"Output signal channel count."}, + hz: { type:real, value:440.0, doc:"Frequency in Hertz."}, + gain: { type:real, value:0.8, doc:"Signal frequency."}, out: { type:audio, doc:"Audio output" }, } - presets: { - a: { hz:220 }, - b: { hz:880 }, - } + presets: { + a: { hz:220 }, + b: { hz:880 }, + } } pv_analysis: { @@ -1079,19 +1091,19 @@ presets: { - dry: { - - } + dry: { + + } - kc: { - ceiling: 20.0, - expo: 2.0, - thresh: 65.0, - upr: 0.0, - lwr: 2.0, - mix: 0.0 - } - + kc: { + ceiling: 20.0, + expo: 2.0, + thresh: 65.0, + upr: 0.0, + lwr: 2.0, + mix: 0.0 + } + a: { ceiling: 20.0 expo: 2.0 @@ -1136,7 +1148,7 @@ lwr: 1.0 mix: 0.0 } - + f_2: { ceiling: 20.0 expo: 2.0 @@ -1172,7 +1184,7 @@ lwr: 8.0 mix: 1.0 } - + g_a: { ceiling: 40.0 expo: 2.0 @@ -1199,112 +1211,112 @@ lwr: [ 7.0 5.0] mix: 1.0 } - } + } } compressor: { vars: { - in: { type:audio, srcFl: true, doc:"Audio input." }, + in: { type:audio, srcFl: true, doc:"Audio input." }, bypass: { type:bool, value: false, doc:"Bypass the compressor."}, - igain: { type:real, value: 1.0, doc:"Input gain."}, - thresh: { type:real, value: 0.0, doc:"Attack threshold in dB."}, - ratio: { type:real, value: 2.0, doc:"Compression ratio."}, - atk_ms: { type:real, value: 20.0, doc:"Attack time in milliseconds."}, - rls_ms: { type:real, value: 20.0, doc:"Release time in milliseconds."}, - wnd_ms: { type:real, value: 200.0, doc:"RMS calc. window length in milliseconds."}, - maxWnd_ms: { type:real, value: 1000.0, doc:"Maximim (allocated) window length in milliseconds."}, - ogain: { type:real, value: 1.0, doc:"Output gain."}, - out: { type:audio, doc:"Audio output." }, - } - - presets: { - dflt: { - igain: 3.0 - thresh: 60.0 - ratio: 5.0 - atk_ms: 5.0 - rls_ms: 20.0 - wnd_ms:100.0 - ogain: 1.0 - } - - kc: { - bypass: false - igain: 3.0 - thresh: 80.0 - ratio: 2.0 - atk_ms: 20.0 - rls_ms: 1000.0 - wnd_ms: 200.0 - ogain: 1.0 - } + igain: { type:real, value: 1.0, doc:"Input gain."}, + thresh: { type:real, value: 0.0, doc:"Attack threshold in dB."}, + ratio: { type:real, value: 2.0, doc:"Compression ratio."}, + atk_ms: { type:real, value: 20.0, doc:"Attack time in milliseconds."}, + rls_ms: { type:real, value: 20.0, doc:"Release time in milliseconds."}, + wnd_ms: { type:real, value: 200.0, doc:"RMS calc. window length in milliseconds."}, + maxWnd_ms: { type:real, value: 1000.0, doc:"Maximim (allocated) window length in milliseconds."}, + ogain: { type:real, value: 1.0, doc:"Output gain."}, + out: { type:audio, doc:"Audio output." }, + } + + presets: { + dflt: { + igain: 3.0 + thresh: 60.0 + ratio: 5.0 + atk_ms: 5.0 + rls_ms: 20.0 + wnd_ms:100.0 + ogain: 1.0 + } + + kc: { + bypass: false + igain: 3.0 + thresh: 80.0 + ratio: 2.0 + atk_ms: 20.0 + rls_ms: 1000.0 + wnd_ms: 200.0 + ogain: 1.0 + } - dry: { - - } + dry: { + + } - a: { - igain: 6.0 - ogain: 1.0 - } + a: { + igain: 6.0 + ogain: 1.0 + } - b: { - igain: 10.0 - ogain: 1.0 - } + b: { + igain: 10.0 + ogain: 1.0 + } - c: { - igain: 11.0 - ogain: 1.0 - } + c: { + igain: 11.0 + ogain: 1.0 + } - d: { - igain: 9.0 - ogain: 1.0 - } + d: { + igain: 9.0 + ogain: 1.0 + } - f_1: { - igain: 6.0 - ogain: 1.0 - } + f_1: { + igain: 6.0 + ogain: 1.0 + } - f_2: { - igain: 6.0 - ogain: 1.0 - } + f_2: { + igain: 6.0 + ogain: 1.0 + } - f_3: { - igain: 6.0 - ogain: 1.0 - } - - f_4: { - igain: 6.0 - ogain: 1.0 - } - - g: { - igain: 10.0 - ogain: 0.25 - } - - g_a: { - igain: 10.0 - ogain: 0.25 - } + f_3: { + igain: 6.0 + ogain: 1.0 + } + + f_4: { + igain: 6.0 + ogain: 1.0 + } + + g: { + igain: 10.0 + ogain: 0.25 + } + + g_a: { + igain: 10.0 + ogain: 0.25 + } - g_1_a: { - igain: 10.0 - ogain: 0.25 - } + g_1_a: { + igain: 10.0 + ogain: 0.25 + } - g_1_d: { - igain: 10.0 - ogain: 0.25 - } + g_1_d: { + igain: 10.0 + ogain: 0.25 + } - } + } } } @@ -1340,22 +1352,22 @@ network: { ain: - { - class: audioFileIn, - argLabel:"compare", - - args:{ - default:{ fname:"/home/kevin/temp/audio.wav", eofFl:true }, - kc: { fname:"/home/kevin/src/currawong/audio/GUTIM_All_20200711_96k_float.wav", eofFl:true } - compare:{ fname:"/mnt/zinger02k/zonk/temp/kc_record/xform_only/cut/dry.wav", eofFl:true } - } + { + class: audioFileIn, + argLabel:"compare", + + args:{ + default:{ fname:"/home/kevin/temp/audio.wav", eofFl:true }, + kc: { fname:"/home/kevin/src/currawong/audio/GUTIM_All_20200711_96k_float.wav", eofFl:true } + compare:{ fname:"/mnt/zinger02k/zonk/temp/kc_record/xform_only/cut/dry.wav", eofFl:true } + } }, pva: { class: pv_analysis, in:{ in:ain.out }, args:{ default:{ wndSmpN:[2048,1024], hopSmpN:[512,256], hzFl:false } } }, sd: { class: spec_dist, in:{ in:pva.out }, preset:[kc b] }, pvs: { class: pv_synthesis, in:{ in:sd.out }, }, - cmp: { class: compressor, in:{ in:pvs.out }, preset:[kc b] }, + cmp: { class: compressor, in:{ in:pvs.out }, preset:[kc b] }, aout: { class: audioFileOut, in:{ in:cmp.out }, args:{ default:{fname:"/home/kevin/temp/kc_compare/b.wav"} } }, } @@ -1365,146 +1377,146 @@ preset_sel: { params: { - //score_fn: "~/src/currawong/projects/score_proc/data/play_file.csv", - //score_fn: "~/src/cwtest/src/cwtest/cfg/preset_sel/score/20220423/temp.csv", - //score_fn: "~/src/currawong/projects/score_follow/play_score.csv", - score_fn: "~/src/currawong/audio/workshop/beck1/record_4/play_score.csv" + //score_fn: "~/src/currawong/projects/score_proc/data/play_file.csv", + //score_fn: "~/src/cwtest/src/cwtest/cfg/preset_sel/score/20220423/temp.csv", + //score_fn: "~/src/currawong/projects/score_follow/play_score.csv", + score_fn: "~/src/currawong/audio/workshop/beck1/record_4/play_score.csv" - record_dir: "~/src/cwtest/src/cwtest/cfg/preset_sel/preset_sel_fragments", - - //record_fn: "preset_sel_20220423", - record_fn: "preset_sel_20220507", - //record_fn: "temp_frag", - record_fn_ext: "txt", + record_dir: "~/src/cwtest/src/cwtest/cfg/preset_sel/preset_sel_fragments", + + //record_fn: "preset_sel_20220423", + record_fn: "preset_sel_20220507", + //record_fn: "temp_frag", + record_fn_ext: "txt", - crossFadeSrate: 48000.0, // TODO: move to flow cfg. and set via 'system default sample rate' - crossFadeCount: 3, + crossFadeSrate: 48000.0, // TODO: move to flow cfg. and set via 'system default sample rate' + crossFadeCount: 3, - beg_play_loc: 0, - end_play_loc: 0, + beg_play_loc: 0, + end_play_loc: 0, - presets: { - preset_labelL: [ "dry", "a", "b", "c", "d", "f1", "f2", "f3", "f4", "g", "ga", "g1a", "g1d" ], - default_gain: 1.0, - default_wet_dry_gain: 0.5, - default_fade_ms: 500.0, - default_preset: "dry", + presets: { + preset_labelL: [ "dry", "a", "b", "c", "d", "f1", "f2", "f3", "f4", "g", "ga", "g1a", "g1d" ], + default_gain: 1.0, + default_wet_dry_gain: 0.5, + default_fade_ms: 500.0, + default_preset: "dry", - default_master_wet_in_gain: 1.0, - default_master_wet_out_gain: 1.0, - default_master_dry_gain: 1.0, - default_master_sync_delay_ms: 400, // spirio 400 + default_master_wet_in_gain: 1.0, + default_master_wet_out_gain: 1.0, + default_master_dry_gain: 1.0, + default_master_sync_delay_ms: 400, // spirio 400 - }, + }, - midi_play_record: { - max_midi_msg_count: 32768, - midi_timer_period_micro_sec: 15000, - all_off_delay_ms: 2500, // delay after stop time to turn off all notes - log_in_flag: false, - log_out_flag: false, - half_pedal_flag: false, - - midi_device_list: [ - // piano - { - enableFl: true, - //midi_out_device: "MIDIFACE 2x2", - //midi_out_port: "MIDIFACE 2x2 Midi Out 1", + midi_play_record: { + max_midi_msg_count: 32768, + midi_timer_period_micro_sec: 15000, + all_off_delay_ms: 2500, // delay after stop time to turn off all notes + log_in_flag: false, + log_out_flag: false, + half_pedal_flag: false, + + midi_device_list: [ + // piano + { + enableFl: true, + //midi_out_device: "MIDIFACE 2x2", + //midi_out_port: "MIDIFACE 2x2 Midi Out 1", - midi_out_device: "Scarlett 18i20 USB", - midi_out_port: "Scarlett 18i20 USB MIDI 1", + midi_out_device: "Scarlett 18i20 USB", + midi_out_port: "Scarlett 18i20 USB MIDI 1", - //midi_out_device: "Fastlane", - //midi_out_port: "Fastlane MIDI A", + //midi_out_device: "Fastlane", + //midi_out_port: "Fastlane MIDI A", - //midi_out_device: "PipeWire-RT-Event", - //midi_out_port: "input", + //midi_out_device: "PipeWire-RT-Event", + //midi_out_port: "input", - // pedal down velocity input/output mapping - pedal: { - down_id: 127, - down_vel: 75, - half_down_id: 64, - half_down_vel: 43, - half_up_id: 63, - half_up_vel: 43 - - }, + // pedal down velocity input/output mapping + pedal: { + down_id: 127, + down_vel: 75, + half_down_id: 64, + half_down_vel: 43, + half_up_id: 63, + half_up_vel: 43 + + }, // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 - // spirio vel_table: [ 1, 4, 10, 12, 12, 18, 24, 24, 30, 36, 36, 44, 48, 52, 58, 64, 64, 70, 76, 82, 88, 94,100,106,112 ] - - // vel_table: [ 1, 5 10, 16, 21, 26, 32, 37, 42, 48, 53, 58, 64, 69, 74, 80, 85, 90, 96,101,106,112,117,122,127 ] , - - }, - { + // spirio vel_table: [ 1, 4, 10, 12, 12, 18, 24, 24, 30, 36, 36, 44, 48, 52, 58, 64, 64, 70, 76, 82, 88, 94,100,106,112 ] + + // vel_table: [ 1, 5 10, 16, 21, 26, 32, 37, 42, 48, 53, 58, 64, 69, 74, 80, 85, 90, 96,101,106,112,117,122,127 ] , + + }, + { - enableFl: true, - //midi_out_device: "Fastlane", - //midi_out_port: "Fastlane MIDI A", - midi_out_device: "MIDIFACE 2x2", - midi_out_port: "MIDIFACE 2x2 Midi Out 2", - - //midi_out_device: "PC-300", - //midi_out_port: "PC-300 MIDI 1", - + enableFl: true, + //midi_out_device: "Fastlane", + //midi_out_port: "Fastlane MIDI A", + midi_out_device: "MIDIFACE 2x2", + midi_out_port: "MIDIFACE 2x2 Midi Out 2", + + //midi_out_device: "PC-300", + //midi_out_port: "PC-300 MIDI 1", + // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 34 - vel_table: [ 1, 4, 10, 12, 12, 18, 24, 24, 30, 36, 36, 44, 48, 52, 58, 64, 64, 70, 76, 82, 88, 94,100,106,112 ] - //vel_table: [ 1, 5 10, 16, 21, 26, 32, 37, 42, 48, 53, 58, 64, 69, 74, 80, 85, 90, 96,101,106,112,117,122,127 ] , - }, - - //{ midi_out_device: "PipeWire-RT-Event", midi_out_port: "input" }, - ], - } - - frag_panel: { + vel_table: [ 1, 4, 10, 12, 12, 18, 24, 24, 30, 36, 36, 44, 48, 52, 58, 64, 64, 70, 76, 82, 88, 94,100,106,112 ] + //vel_table: [ 1, 5 10, 16, 21, 26, 32, 37, 42, 48, 53, 58, 64, 69, 74, 80, 85, 90, 96,101,106,112,117,122,127 ] , + }, + + //{ midi_out_device: "PipeWire-RT-Event", midi_out_port: "input" }, + ], + } + + frag_panel: { panel: { - - name: fragPanelId - addClassName: fragPanel + + name: fragPanelId + addClassName: fragPanel - row: { - name: fragPanelRowId - addClassName: fragPanelRow - - col: { - numb_disp: { name: fragBegLocId, title:"Beg Loc", value: 0 }, - numb_disp: { name: fragEndLocId, title:"End Loc", value: 0 }, - number: { name: fragInGainId, title:"In Gain", min:0.0, max:100.0, step:0.1, decpl:1 }, - number: { name: fragOutGainId, title:"Out Gain", min:0.0, max:100.0, step:0.1, decpl:1 }, - }, - col: { - row: { - name: fragPresetRowId, - addClassName: fragPresetRow, - }, - - row: { - string: { name: fragNoteId, addClassName: fragNote, title:"Note" }, - } - }, - col: { - number:{ name: fragWetDryGainId, title:"Wet/Dry", min:0.0, max:1.0, step:0.1, decpl:2 }, - number:{ name: fragFadeOutMsId, title:"Fade Ms", min:0.0, max:5000, step:1, decpl:0 }, - row: { - button:{ name: fragPlaySeqBtnId, title:"Play Seq" }, - button:{ name: fragPlayAllBtnId, title:"Play All" }, - } - }, - col: { - number: { name: fragBegPlayLocId, title:"Begin", min:0, max:1000000, step:1, decpl:0 }, - number: { name: fragEndPlayLocId, title:"End", min:0, max:1000000, step:1, decpl:0 }, - button: { name: fragPlayBtnId, title:"Play" } - } - - } - } - }, - - }, + row: { + name: fragPanelRowId + addClassName: fragPanelRow + + col: { + numb_disp: { name: fragBegLocId, title:"Beg Loc", value: 0 }, + numb_disp: { name: fragEndLocId, title:"End Loc", value: 0 }, + number: { name: fragInGainId, title:"In Gain", min:0.0, max:100.0, step:0.1, decpl:1 }, + number: { name: fragOutGainId, title:"Out Gain", min:0.0, max:100.0, step:0.1, decpl:1 }, + }, + col: { + row: { + name: fragPresetRowId, + addClassName: fragPresetRow, + }, + + row: { + string: { name: fragNoteId, addClassName: fragNote, title:"Note" }, + } + }, + col: { + number:{ name: fragWetDryGainId, title:"Wet/Dry", min:0.0, max:1.0, step:0.1, decpl:2 }, + number:{ name: fragFadeOutMsId, title:"Fade Ms", min:0.0, max:5000, step:1, decpl:0 }, + row: { + button:{ name: fragPlaySeqBtnId, title:"Play Seq" }, + button:{ name: fragPlayAllBtnId, title:"Play All" }, + } + }, + col: { + number: { name: fragBegPlayLocId, title:"Begin", min:0, max:1000000, step:1, decpl:0 }, + number: { name: fragEndPlayLocId, title:"End", min:0, max:1000000, step:1, decpl:0 }, + button: { name: fragPlayBtnId, title:"Play" } + } + + } + } + }, + + }, ui: { physRootDir: "~/src/cwtest/src/libcw/html/preset_sel", @@ -1518,21 +1530,21 @@ }, serial: { - pollPeriodMs: 50, - recvBufByteN: 512, + pollPeriodMs: 50, + recvBufByteN: 512, - array: [ - { - enable_flag: false, + array: [ + { + enable_flag: false, label: "port1", // User label device: "/dev/ttyUSB0", // Serial device name baud: 115200, bits: 8, stop: 1, parity: "no", - } - ] - + } + ] + }, @@ -1542,257 +1554,270 @@ audio: { meterMs: 50, // audio meter filter length and meter callback period - threadTimeOutMs: 50, // audio thread cond var time out + threadTimeOutMs: 50, // audio thread cond var time out - groupL: [ - { - enableFl: true, // (req) - label: "main", // (req) User label - id: 0, // (req) User id (can also be set at runtime) + groupL: [ + { + enableFl: true, // (req) + label: "main", // (req) User label + id: 0, // (req) User id (can also be set at runtime) srate: 48000, // (req) Sample rate used by all devices in this group - dspFrameCnt: 64 // (req) Size of DSP processing buffers - } - ], + dspFrameCnt: 64 // (req) Size of DSP processing buffers + } + ], deviceL: [ { - // System device name + // System device name device: "Scarlett 18i20 USB USB Audio", - //device: "USB Audio CODEC USB Audio", - //device: "HDA Intel PCH CS4208 Analog", - + //device: "USB Audio CODEC USB Audio", + //device: "HDA Intel PCH CS4208 Analog", + enableFl: true, // (req) - label: "main", // (req) User label - userId: 0, // (opt) User id (can also be set at runtime) - framesPerCycle: 512, // (req) Samples per audio device cycle - cycleCnt: 3, // (req) Count of device cycle buffers. - inGroup: "main", // (opt) All devices in a group must be 'ready' to source - outGroup: "main", // (opt) or sink data before an audio callback is made for that group + label: "main", // (req) User label + userId: 0, // (opt) User id (can also be set at runtime) + framesPerCycle: 512, // (req) Samples per audio device cycle + cycleCnt: 3, // (req) Count of device cycle buffers. + inGroup: "main", // (opt) All devices in a group must be 'ready' to source + outGroup: "main", // (opt) or sink data before an audio callback is made for that group } ] }, - socket: { + socket: { maxSocketCnt: 10, - recvBufByteCnt: 4096, - threadTimeOutMs: 50, - socketL: [], - - } + recvBufByteCnt: 4096, + threadTimeOutMs: 50, + socketL: [], + + } - flow: { - framesPerCycle: 64, // time-domain audio cycles frame per cycle - maxCycleCount: 15000, // 0 disables maxCycleCount - printNetworkFl: false, // print the network instance - printClassDictFl: false, // print the class description dictionary - + flow: { + framesPerCycle: 64, // time-domain audio cycles frame per cycle + maxCycleCount: 15000, // 0 disables maxCycleCount + printNetworkFl: false, // print the network instance + printClassDictFl: false, // print the class description dictionary + - // Simulate SPIRIO with Synchron - non_spirio_network: { - aud_in: { class: audio_in, args:{ default:{dev_label:"main"} } }, + // Simulate SPIRIO with Synchron + non_spirio_network: { + aud_in: { class: audio_in, args:{ default:{dev_label:"main"} } }, - // select the first two channels (this reduces the channel count if there are more than 2 incoming channels) - ivory_in: { class: audio_split, in:{ in:aud_in.out } args:{ default:{select[1,1]}} } + // select the first two channels (this reduces the channel count if there are more than 2 incoming channels) + ivory_in: { class: audio_split, in:{ in:aud_in.out } args:{ default:{select[1,1]}} } - - vsl_in: { class: audio_split, in:{ in:aud_in.out } args:{ default:{select[0,0,1,1]}} } + + vsl_in: { class: audio_split, in:{ in:aud_in.out } args:{ default:{select[0,0,1,1]}} } - // delay the incoming audio signal to sync it with the piano - sync_delay: { class: audio_delay, in: { in:vsl_in.out }, args:{ default:{ delayMs:0 } }} + // delay the incoming audio signal to sync it with the piano + sync_delay: { class: audio_delay, in: { in:vsl_in.out }, args:{ default:{ delayMs:0 } }} - mstr_wet_in_gain: { class: audio_gain, in:{ in:ivory_in.out }, args:{}} - - // wet signal processing chain - wet_in_gain: { class: audio_gain, in:{ in:mstr_wet_in_gain.out }, args:{}}, - pva: { class: pv_analysis, in:{ in:wet_in_gain.out }, args:{ default:{ wndSmpN:512, hopSmpN:128, hzFl:false } } }, - sd: { class: spec_dist, in:{ in:pva.out }, preset:kc }, + mstr_wet_in_gain: { class: audio_gain, in:{ in:ivory_in.out }, args:{}} + + // wet signal processing chain + wet_in_gain: { class: audio_gain, in:{ in:mstr_wet_in_gain.out }, args:{}}, + pva: { class: pv_analysis, in:{ in:wet_in_gain.out }, args:{ default:{ wndSmpN:512, hopSmpN:128, hzFl:false } } }, + sd: { class: spec_dist, in:{ in:pva.out }, preset:kc }, pvs: { class: pv_synthesis, in:{ in:sd.out }, }, - cmp: { class: compressor, in:{ in:pvs.out }, preset:kc }, + cmp: { class: compressor, in:{ in:pvs.out }, preset:kc }, - wet_out_gain: { class: audio_gain, in:{ in:cmp.out }, args:{}}, + wet_out_gain: { class: audio_gain, in:{ in:cmp.out }, args:{}}, - mute_wet: { class: audio_gain, in:{ in:wet_out_gain.out }, args:{}}, + mute_wet: { class: audio_gain, in:{ in:wet_out_gain.out }, args:{}}, - // apply the wet/dry gain balance - wd_bal: { class: balance, args{}}, - wet_bal_gain: { class: audio_gain, in:{ in:wet_out_gain.out, gain:wd_bal.out }, args:{}}, - dry_bal_gain: { class: audio_gain, in:{ in:vsl_in.out, gain:wd_bal.inv_out }, args:{}}, + // apply the wet/dry gain balance + wd_bal: { class: balance, args{}}, + wet_bal_gain: { class: audio_gain, in:{ in:wet_out_gain.out, gain:wd_bal.out }, args:{}}, + dry_bal_gain: { class: audio_gain, in:{ in:vsl_in.out, gain:wd_bal.inv_out }, args:{}}, - mstr_wet_out_gain: { class: audio_gain, in:{ in:wet_bal_gain.out }, args:{}} - mstr_dry_out_gain: { class: audio_gain, in:{ in:dry_bal_gain.out }, args:{}}, + mstr_wet_out_gain: { class: audio_gain, in:{ in:wet_bal_gain.out }, args:{}} + mstr_dry_out_gain: { class: audio_gain, in:{ in:dry_bal_gain.out }, args:{}}, - // merge the wet/dry signals into a single 4 channel signal - merge0: { class: audio_merge, in:{ in0:mstr_wet_out_gain.out, in1:mstr_dry_out_gain.out }, args:{} }, + // merge the wet/dry signals into a single 4 channel signal + merge0: { class: audio_merge, in:{ in0:mstr_wet_out_gain.out, in1:mstr_dry_out_gain.out }, args:{} }, - merge1: { class: audio_merge, in:{ in0:mstr_wet_out_gain.out, in1:sync_delay.out }, args:{} }, - //merge1: { class: audio_merge, in:{ in0:ivory_in.out, in1:vsl_in.out }, args:{} }, + merge1: { class: audio_merge, in:{ in0:mstr_wet_out_gain.out, in1:sync_delay.out }, args:{} }, + //merge1: { class: audio_merge, in:{ in0:ivory_in.out, in1:vsl_in.out }, args:{} }, - aout: { class: audio_out, in:{ in:merge1.out }, args:{ default:{dev_label:"main"} } }, - } + aout: { class: audio_out, in:{ in:merge1.out }, args:{ default:{dev_label:"main"} } }, + } - // SPIRIO network - network: { - aud_in: { class: audio_in, args:{ default:{dev_label:"main"} } }, + // SPIRIO network + network: { + aud_in: { class: audio_in, args:{ default:{dev_label:"main"} } }, - // select the first two channels (this reduces the channel count if there are more than 2 incoming channels) - split_in: { class: audio_split, in:{ in:aud_in.out } args:{ default:{select[1,1]}} } + // select the first two channels (this reduces the channel count if there are more than 2 incoming channels) + split_in: { class: audio_split, in:{ in:aud_in.out } args:{ default:{select[1,1]}} } - // delay the incoming audio signal to sync it with the piano - sync_delay { class: audio_delay, in: { in:split_in.out }, args:{ default:{ delayMs:400 } }} + // delay the incoming audio signal to sync it with the piano + sync_delay { class: audio_delay, in: { in:split_in.out }, args:{ default:{ delayMs:400 } }} - mstr_wet_in_gain: { class: audio_gain, in:{ in:sync_delay.out }, args:{}} - - // wet signal processing chain - wet_in_gain: { class: audio_gain, in:{ in:mstr_wet_in_gain.out }, args:{}}, - pva: { class: pv_analysis, in:{ in:wet_in_gain.out }, args:{ default:{ wndSmpN:512, hopSmpN:128, hzFl:false } } }, - sd: { class: spec_dist, in:{ in:pva.out }, preset:kc }, + mstr_wet_in_gain: { class: audio_gain, in:{ in:sync_delay.out }, args:{}} + + // wet signal processing chain + wet_in_gain: { class: audio_gain, in:{ in:mstr_wet_in_gain.out }, args:{}}, + pva: { class: pv_analysis, in:{ in:wet_in_gain.out }, args:{ default:{ wndSmpN:512, hopSmpN:128, hzFl:false } } }, + sd: { class: spec_dist, in:{ in:pva.out }, preset:kc }, pvs: { class: pv_synthesis, in:{ in:sd.out }, }, - cmp: { class: compressor, in:{ in:pvs.out }, preset:kc }, + cmp: { class: compressor, in:{ in:pvs.out }, preset:kc }, - wet_out_gain: { class: audio_gain, in:{ in:cmp.out }, args:{}}, + wet_out_gain: { class: audio_gain, in:{ in:cmp.out }, args:{}}, - mute_wet: { class: audio_gain, in:{ in:wet_out_gain.out }, args:{}}, + mute_wet: { class: audio_gain, in:{ in:wet_out_gain.out }, args:{}}, - // apply the wet/dry gain balance - wd_bal: { class: balance, args{}}, - wet_bal_gain: { class: audio_gain, in:{ in:mute_wet.out, gain:wd_bal.out }, args:{}}, - dry_bal_gain: { class: audio_gain, in:{ in:sync_delay.out, gain:wd_bal.inv_out }, args:{}}, + // apply the wet/dry gain balance + wd_bal: { class: balance, args{}}, + wet_bal_gain: { class: audio_gain, in:{ in:mute_wet.out, gain:wd_bal.out }, args:{}}, + dry_bal_gain: { class: audio_gain, in:{ in:sync_delay.out, gain:wd_bal.inv_out }, args:{}}, - mstr_wet_out_gain: { class: audio_gain, in:{ in:wet_bal_gain.out }, args:{}} - mstr_dry_out_gain: { class: audio_gain, in:{ in:dry_bal_gain.out }, args:{}}, + mstr_wet_out_gain: { class: audio_gain, in:{ in:wet_bal_gain.out }, args:{}} + mstr_dry_out_gain: { class: audio_gain, in:{ in:dry_bal_gain.out }, args:{}}, - // merge the wet/dry signals into a single 4 channel signal - merge: { class: audio_merge, in:{ in0:mstr_wet_out_gain.out, in1:mstr_dry_out_gain.out }, args:{} }, - + // merge the wet/dry signals into a single 4 channel signal + merge: { class: audio_merge, in:{ in0:mstr_wet_out_gain.out, in1:mstr_dry_out_gain.out }, args:{} }, + //aout: { class: audio_out, in:{ in:merge.out }, args:{ default:{dev_label:"main"} } }, - aout: { class: audio_out, in:{ in:merge.out }, args:{ default:{dev_label:"main"} } }, - } + aout: { class: audio_out, in:{ in:merge.out }, args:{ default:{dev_label:"main"} } }, + } - // stereo network - stereo_network: { - aud_in: { class: audio_in, args:{ default:{dev_label:"main"} } }, + // stereo network + stereo_network: { + aud_in: { class: audio_in, args:{ default:{dev_label:"main"} } }, - // select the first two channels (this reduces the channel count if there are more than 2 incoming channels) - split_in: { class: audio_split, in:{ in:aud_in.out } args:{ default:{select[1,1]}} } + // select the first two channels (this reduces the channel count if there are more than 2 incoming channels) + split_in: { class: audio_split, in:{ in:aud_in.out } args:{ default:{select[1,1]}} } - // delay the incoming audio signal to sync it with the piano - sync_delay { class: audio_delay, in: { in:split_in.out }, args:{ default:{ delayMs:400 } }} + // delay the incoming audio signal to sync it with the piano + sync_delay { class: audio_delay, in: { in:split_in.out }, args:{ default:{ delayMs:400 } }} - mstr_wet_in_gain: { class: audio_gain, in:{ in:sync_delay.out }, args:{}} - - // wet signal processing chain - wet_in_gain: { class: audio_gain, in:{ in:mstr_wet_in_gain.out }, args:{}}, - pva: { class: pv_analysis, in:{ in:wet_in_gain.out }, args:{ default:{ wndSmpN:512, hopSmpN:128, hzFl:false } } }, - sd: { class: spec_dist, in:{ in:pva.out }, preset:kc }, + mstr_wet_in_gain: { class: audio_gain, in:{ in:sync_delay.out }, args:{}} + + // wet signal processing chain + wet_in_gain: { class: audio_gain, in:{ in:mstr_wet_in_gain.out }, args:{}}, + pva: { class: pv_analysis, in:{ in:wet_in_gain.out }, args:{ default:{ wndSmpN:512, hopSmpN:128, hzFl:false } } }, + sd: { class: spec_dist, in:{ in:pva.out }, preset:kc }, pvs: { class: pv_synthesis, in:{ in:sd.out }, }, - cmp: { class: compressor, in:{ in:pvs.out }, preset:kc }, + cmp: { class: compressor, in:{ in:pvs.out }, preset:kc }, - wet_out_gain: { class: audio_gain, in:{ in:cmp.out }, args:{}}, + wet_out_gain: { class: audio_gain, in:{ in:cmp.out }, args:{}}, - mute_wet: { class: audio_gain, in:{ in:wet_out_gain.out }, args:{}}, + mute_wet: { class: audio_gain, in:{ in:wet_out_gain.out }, args:{}}, - // apply the wet/dry gain balance - wd_bal: { class: balance, args{}}, - wet_bal_gain: { class: audio_gain, in:{ in:mute_wet.out, gain:wd_bal.out }, args:{}}, - dry_bal_gain: { class: audio_gain, in:{ in:sync_delay.out, gain:wd_bal.inv_out }, args:{}}, + // apply the wet/dry gain balance + wd_bal: { class: balance, args{}}, + wet_bal_gain: { class: audio_gain, in:{ in:mute_wet.out, gain:wd_bal.out }, args:{}}, + dry_bal_gain: { class: audio_gain, in:{ in:sync_delay.out, gain:wd_bal.inv_out }, args:{}}, - mstr_wet_out_gain: { class: audio_gain, in:{ in:wet_bal_gain.out }, args:{}} - //mstr_dry_out_gain: { class: audio_gain, in:{ in:dry_bal_gain.out }, args:{}}, + mstr_wet_out_gain: { class: audio_gain, in:{ in:wet_bal_gain.out }, args:{}} + //mstr_dry_out_gain: { class: audio_gain, in:{ in:dry_bal_gain.out }, args:{}}, - // merge the wet/dry signals into a single 4 channel signal - //merge: { class: audio_merge, in:{ in0:mstr_wet_out_gain.out, in1:mstr_dry_out_gain.out }, args:{} }, - + // merge the wet/dry signals into a single 4 channel signal + //merge: { class: audio_merge, in:{ in0:mstr_wet_out_gain.out, in1:mstr_dry_out_gain.out }, args:{} }, + //aout: { class: audio_out, in:{ in:merge.out }, args:{ default:{dev_label:"main"} } }, - aout: { class: audio_out, in:{ in:mstr_wet_out_gain.out }, args:{ default:{dev_label:"main"} } }, - } + aout: { class: audio_out, in:{ in:mstr_wet_out_gain.out }, args:{ default:{dev_label:"main"} } }, + } - presets: { - dry: { - mute_wet: { gain:0 }, - }, - a: { sd:a, cmp:a, mute_wet:{ gain:1 } }, - b: { sd:b, cmp:b, mute_wet:{ gain:1 } }, - c: { sd:c, cmp:c, mute_wet:{ gain:1 } }, - d: { sd:d, cmp:d, mute_wet:{ gain:1 } }, - f1: { sd:f_1, cmp:f_1, mute_wet:{ gain:1 } }, - f2: { sd:f_2, cmp:f_2, mute_wet:{ gain:1 } }, - f3: { sd:f_3, cmp:f_3, mute_wet:{ gain:1 } }, - f4: { sd:f_4, cmp:f_4, mute_wet:{ gain:1 } }, - g: { sd:g, cmp:g, mute_wet:{ gain:1 } }, - ga: { sd:g_a, cmp:g_a, mute_wet:{ gain:1 } }, - g1a: { sd:g_1_a, cmp:g_1_a, mute_wet:{ gain:1 } }, - g1d: { sd:g_1_d, cmp:g_1_d, mute_wet:{ gain:1 } } - - } + presets: { + dry: { + mute_wet: { gain:0 }, + }, + a: { sd:a, cmp:a, mute_wet:{ gain:1 } }, + b: { sd:b, cmp:b, mute_wet:{ gain:1 } }, + c: { sd:c, cmp:c, mute_wet:{ gain:1 } }, + d: { sd:d, cmp:d, mute_wet:{ gain:1 } }, + f1: { sd:f_1, cmp:f_1, mute_wet:{ gain:1 } }, + f2: { sd:f_2, cmp:f_2, mute_wet:{ gain:1 } }, + f3: { sd:f_3, cmp:f_3, mute_wet:{ gain:1 } }, + f4: { sd:f_4, cmp:f_4, mute_wet:{ gain:1 } }, + g: { sd:g, cmp:g, mute_wet:{ gain:1 } }, + ga: { sd:g_a, cmp:g_a, mute_wet:{ gain:1 } }, + g1a: { sd:g_1_a, cmp:g_1_a, mute_wet:{ gain:1 } }, + g1d: { sd:g_1_d, cmp:g_1_d, mute_wet:{ gain:1 } } + + } } - - } + + }, - stereo_network: { - ain: { class: audio_in, args:{ default:{dev_label:"main"} } }, + stereo_network: { + ain: { class: audio_in, args:{ default:{dev_label:"main"} } }, - // split the input channels to create a wet and dry signal path - split_wet: { class: audio_split, in:{ in:ain.out }, args:{ default:{ select:[1,0]} }}, - split_dry: { class: audio_split, in:{ in:ain.out }, args:{ default:{ select:[0,1]} }}, + // split the input channels to create a wet and dry signal path + split_wet: { class: audio_split, in:{ in:ain.out }, args:{ default:{ select:[1,0]} }}, + split_dry: { class: audio_split, in:{ in:ain.out }, args:{ default:{ select:[0,1]} }}, - // duplicate the channels on the wet/dry signal path to simulate a 4 channel audio interface - dupl_wet: { class: audio_duplicate, in:{ in:split_dry.out }, args:{ duplicate:2 } }, - dupl_dry: { class: audio_duplicate, in:{ in:split_wet.out }, args:{ duplicate:2 } }, + // duplicate the channels on the wet/dry signal path to simulate a 4 channel audio interface + dupl_wet: { class: audio_duplicate, in:{ in:split_dry.out }, args:{ duplicate:2 } }, + dupl_dry: { class: audio_duplicate, in:{ in:split_wet.out }, args:{ duplicate:2 } }, - // wet signal processing chain - pva: { class: pv_analysis, in:{ in:dupl_wet.out }, args:{ default:{ wndSmpN:512, hopSmpN:128, hzFl:false } } }, - sd: { class: spec_dist, in:{ in:pva.out }, preset:kc }, - pvs: { class: pv_synthesis, in:{ in:sd.out }, }, - cmp: { class: compressor, in:{ in:pvs.out }, preset:kc }, + // wet signal processing chain + pva: { class: pv_analysis, in:{ in:dupl_wet.out }, args:{ default:{ wndSmpN:512, hopSmpN:128, hzFl:false } } }, + sd: { class: spec_dist, in:{ in:pva.out }, preset:kc }, + pvs: { class: pv_synthesis, in:{ in:sd.out }, }, + cmp: { class: compressor, in:{ in:pvs.out }, preset:kc }, - // reduce the wet and dry signal path to 1 channel each because we are using a 2 channel interface - osplit_wet: { class: audio_split, in:{ in:cmp.out }, args:{ default:{ select:[1,0]} }}, - osplit_dry: { class: audio_split, in:{ in:dupl_dry.out }, args:{ default:{ select:[0,1]} }}, + // reduce the wet and dry signal path to 1 channel each because we are using a 2 channel interface + osplit_wet: { class: audio_split, in:{ in:cmp.out }, args:{ default:{ select:[1,0]} }}, + osplit_dry: { class: audio_split, in:{ in:dupl_dry.out }, args:{ default:{ select:[0,1]} }}, - // apply the wet/dry gain - wd_bal: { class: balance, args{}}, - wet_gain: { class: audio_gain, in:{ in:osplit_wet.out, gain:wd_bal.out }, args:{}}, - dry_gain: { class: audio_gain, in:{ in:osplit_dry.out, gain:wd_bal.inv_out }, args:{}}, + // apply the wet/dry gain + wd_bal: { class: balance, args{}}, + wet_gain: { class: audio_gain, in:{ in:osplit_wet.out, gain:wd_bal.out }, args:{}}, + dry_gain: { class: audio_gain, in:{ in:osplit_dry.out, gain:wd_bal.inv_out }, args:{}}, - // merge the wet/dry signals back into a single signal - merge: { class: audio_merge, in:{ in0:wet_gain.out, in1:dry_gain.out }, args:{} }, - - aout: { class: audio_out, in:{ in:merge.out }, args:{ default:{dev_label:"main"} } }, - } + // merge the wet/dry signals back into a single signal + merge: { class: audio_merge, in:{ in0:wet_gain.out, in1:dry_gain.out }, args:{} }, + + aout: { class: audio_out, in:{ in:merge.out }, args:{ default:{dev_label:"main"} } }, + }, - sine_network: { - framesPerCycle: 64, // time-domain audio cycles frame per cycle - maxCycleCount: 15000, // 0 disables maxCycleCount - printNetworkFl: false, // print the network instance - printClassDictFl: false, // print the class description dictionary - - - - network: { - sin: { class: sine_tone, args:{ default:{ hz:[220,880]} }}, - splitL: { class: audio_split, in:{ in:sin.out }, args:{ default:{ select:[1,0]} }}, - splitR: { class: audio_split, in:{ in:sin.out }, args:{ default:{ select:[0,1]} }}, + sine_network: { + framesPerCycle: 64, // time-domain audio cycles frame per cycle + maxCycleCount: 15000, // 0 disables maxCycleCount + printNetworkFl: false, // print the network instance + printClassDictFl: false, // print the class description dictionary + + + + network: { + sin: { class: sine_tone, args:{ default:{ hz:[220,880]} }}, + splitL: { class: audio_split, in:{ in:sin.out }, args:{ default:{ select:[1,0]} }}, + splitR: { class: audio_split, in:{ in:sin.out }, args:{ default:{ select:[0,1]} }}, - delay: { class: audio_delay, in:{ in:splitL.out }, args:{ default:{ delayMs:1} }}, - bal: { class: balance, args:{} }, - mix: { class: audio_mix, in:{ in0:delay.out, in1:splitL.out, gain0:bal.out, gain1:bal.inv_out }, args:{ }}, - - merge: { class: audio_merge, in:{ in0:mix.out, in1:splitR.out }, args:{}}, - aout: { class: audio_out, in:{ in:merge.out }, args:{ default:{dev_label:"main"} } }, - } + delay: { class: audio_delay, in:{ in:splitL.out }, args:{ default:{ delayMs:1} }}, + bal: { class: balance, args:{} }, + mix: { class: audio_mix, in:{ in0:delay.out, in1:splitL.out, gain0:bal.out, gain1:bal.inv_out }, args:{ }}, + + merge: { class: audio_merge, in:{ in0:mix.out, in1:splitR.out }, args:{}}, + aout: { class: audio_out, in:{ in:merge.out }, args:{ default:{dev_label:"main"} } }, + }, - presets: { - a: { splitL:hi, splitR:lo }, - b: { splitL:lo, splitR:hi } - } + presets: { + a: { splitL:hi, splitR:lo }, + b: { splitL:lo, splitR:hi } + } - } + }, + + score_follow: { + "midi_fname": "~/src/currawong/audio/workshop/beck1/record_4/midi.mid", + "srate": 48000, + "out_dir": "~/temp/score_follow_test" + + cfg: { + "score_csv_fname": "~/src/currawong/projects/score_follow/cm_score.csv", + "search_area_locN": 10, + "key_wnd_locN": 7, + } + + } } diff --git a/src/cwtest/main.cpp b/src/cwtest/main.cpp index 1e5c66d..db46c6e 100644 --- a/src/cwtest/main.cpp +++ b/src/cwtest/main.cpp @@ -30,6 +30,8 @@ #include "cwFlow.h" #include "cwPianoScore.h" #include "cwIoPresetSelApp.h" +#include "cwCmInterface.h" +#include "cwScoreFollower.h" #if defined(cwWEBSOCK) #include "cwWebSock.h" @@ -350,6 +352,16 @@ cw::rc_t objectTest( const cw::object_t* cfg, const cw::object_t* args, int argc return cw::kOkRC; } +cw::rc_t vectOpTest( const cw::object_t* cfg, const cw::object_t* args, int argc, const char* argv[] ) +{ + int v1[] = { 1,2,1,2,1,2,1,2,1,2 }; + int v0[ 10 ]; + + cw::vop::deinterleave( v0, v1, 5, 2 ); + cw::vop::print(v0,10,"%i "); + return cw::kOkRC; +} + cw::rc_t timeTest( const cw::object_t* cfg, const cw::object_t* args, int argc, const char* argv[] ) { return cw::time::test(); } cw::rc_t threadTest( const cw::object_t* cfg, const cw::object_t* args, int argc, const char* argv[] ) { return cw::threadTest(); } cw::rc_t kbTest1Test( const cw::object_t* cfg, const cw::object_t* args, int argc, const char* argv[] ) { cw::kbTest1(); return cw::kOkRC; } @@ -394,6 +406,8 @@ cw::rc_t flowTest( const cw::object_t* cfg, const cw::object_t* args return cw::flow::test(flow_proc_dict,args); } +cw::rc_t scoreFollowTest( const cw::object_t* cfg, const cw::object_t* args, int argc, const char* argv[] ) { return cw::score_follower::test(args); } + #if defined(cwWEBSOCK) cw::rc_t websockSrvTest( const cw::object_t* cfg, const cw::object_t* args, int argc, const char* argv[] ) { return cw::websockSrvTest(cfg); } @@ -718,6 +732,7 @@ int main( int argc, const char* argv[] ) { "fileSys", fileSysTest }, { "numbCvt", numbCvtTest }, { "object", objectTest }, + { "vop", vectOpTest }, { "time", timeTest }, { "thread", threadTest }, { "kbTest1", kbTest1Test }, @@ -777,6 +792,7 @@ int main( int argc, const char* argv[] ) { "flow_pv", flowTest }, { "flow_spec_dist", flowTest }, { "preset_sel", ioPresetSelTest }, + { "score_follow", scoreFollowTest }, { "stub", stubTest }, { nullptr, nullptr } };