2299 lines
81 KiB
INI
2299 lines
81 KiB
INI
{
|
|
|
|
a:1,
|
|
b:2,
|
|
c:[1.23,4.56,7.89],
|
|
|
|
|
|
datasets: {
|
|
dataL: [
|
|
{ name: mnist, inDir: "~/src/datasets/mnist" }
|
|
]
|
|
|
|
}
|
|
|
|
test: {
|
|
|
|
|
|
variadicTpl: {},
|
|
|
|
thread: {},
|
|
kbTest1: {},
|
|
kbTest2: {},
|
|
kbTest3: {},
|
|
|
|
spscBuf: {},
|
|
spscQueueTmpl: {},
|
|
|
|
nbmpscQueue: {
|
|
blkN: 4,
|
|
blkByteN: 1024,
|
|
testDurMs: 10000,
|
|
threadN: 10,
|
|
out_fname: "~/temp/temp.txt"
|
|
}
|
|
|
|
websockSrv: {
|
|
|
|
physRootDir: "~/src/cwtest/src/libcw/html/websockSrvTest", // path to 'dfltHtmlPageFn'
|
|
dfltHtmlPageFn: "test_websocket.html", // websockets enabled HTML/JS app
|
|
port: 5687, // websocket port
|
|
rcvBufByteN: 128, // incoming msg's larger than this will be broken into multiple parts
|
|
xmtBufByteN: 128, // outgoing msg's larger than this will be broken into multiple parts
|
|
queueBlkCnt: 3, // count of memory blocks in the non-blocking queue (See: cwNbMpScQueue)
|
|
queueBlkByteCnt: 4096, // size of each non-blocking memory block
|
|
timeOutMs: 50, // milliseconds to block waiting for incoming websock messages
|
|
},
|
|
|
|
uiTest: {
|
|
ui: {
|
|
physRootDir: "~/src/cwtest/src/libcw/html/uiTest",
|
|
dfltPageFn: "index.html",
|
|
port: 5687,
|
|
rcvBufByteN: 2048,
|
|
xmtBufByteN: 2048,
|
|
queueBlkCnt: 8,
|
|
queueBlkByteCnt: 8192,
|
|
extraLogsFl: true,
|
|
fmtBufByteN: 4096,
|
|
websockTimeOutMs: 50, // max time out while blocking for a websock event
|
|
uiCfgFn: "ui.cfg", // default UI resource description
|
|
idleMsgPeriodMs: 50
|
|
},
|
|
|
|
listEle: {
|
|
|
|
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" }
|
|
},
|
|
}
|
|
},
|
|
|
|
}
|
|
},
|
|
|
|
serialSrv: {},
|
|
|
|
midiDeviceReport: {},
|
|
|
|
// Test the MIDI file input device. See cwMidiDeviceTest.cpp
|
|
// Compares the time between MIDI events in a file to the time between
|
|
// the same events from the file device.
|
|
midiDevice: {
|
|
appNameStr: "test_app",
|
|
fileDevName: "file_dev",
|
|
fileDevReadAheadMicros: 3000,
|
|
parseBufByteCnt: 1024,
|
|
enableBufFl:true,
|
|
bufferMsgCnt:4096,
|
|
filterRtSenseFl:true
|
|
|
|
testFileLabel: "file_0", //
|
|
testFileEnableFl: true,
|
|
|
|
file_ports: [
|
|
|
|
{ "label":"file_0",
|
|
"file": "/home/kevin/src/cwtest/src/cwtest/cfg/gutim_full/data1/beck1/record_4/midi.mid",
|
|
"enable_fl": true },
|
|
|
|
{ "label":"file_1",
|
|
"file": "/home/kevin/src/cwtest/src/cwtest/cfg/gutim_full/data1/beck1/record_5/midi.mid"
|
|
"enable_fl": false }
|
|
]
|
|
},
|
|
|
|
midifile:
|
|
{
|
|
csv: { midiFn:"~/src/cwtest/src/cwtest/cfg/gutim_full/scriabin/scriabin_etude_op8_2_f_sh_minor.mid",
|
|
csvFn:"~/src/cwtest/src/cwtest/cfg/gutim_full/scriabin/scriabin_etude_op8_2_f_sh_minor.csv" }
|
|
|
|
csv: { midiFn:"~/src/cwtest/src/cwtest/cfg/gutim_full/scriabin/scriabin_etude_op8_3_b_minor.mid",
|
|
csvFn:"~/src/cwtest/src/cwtest/cfg/gutim_full/scriabin/scriabin_etude_op8_3_b_minor.csv" }
|
|
|
|
csv: { midiFn:"~/src/cwtest/src/cwtest/cfg/gutim_full/scriabin/scriabin_etude_op8_9_g_sh_minor.mid",
|
|
csvFn:"~/src/cwtest/src/cwtest/cfg/gutim_full/scriabin/scriabin_etude_op8_9_g_sh_minor.csv" }
|
|
|
|
csv: { midiFn:"~/src/cwtest/src/cwtest/cfg/gutim_full/scriabin/scriabin_etude_op42_7_f_minor.mid",
|
|
csvFn:"~/src/cwtest/src/cwtest/cfg/gutim_full/scriabin/scriabin_etude_op42_7_f_minor.csv" }
|
|
|
|
csv: { midiFn:"~/src/cwtest/src/cwtest/cfg/gutim_full/scriabin/scriabin_etude_op65_1_allegro fantastico.mid",
|
|
csvFn:"~/src/cwtest/src/cwtest/cfg/gutim_full/scriabin/scriabin_etude_op65_1_allegro fantastico.csv" }
|
|
|
|
csv: { midiFn:"~/src/cwtest/src/cwtest/cfg/gutim_full/scriabin/scriabin_etude_op65_2_allegretto.mid",
|
|
csvFn:"~/src/cwtest/src/cwtest/cfg/gutim_full/scriabin/scriabin_etude_op65_2_allegretto.csv" }
|
|
|
|
csv: { midiFn:"~/src/cwtest/src/cwtest/cfg/gutim_full/scriabin/scriabin_etude_op65_3_molta_vivace.mid",
|
|
csvFn:"~/src/cwtest/src/cwtest/cfg/gutim_full/scriabin/scriabin_etude_op65_3_molta_vivace.csv" }
|
|
|
|
|
|
csv: { midiFn:"~/src/cwtest/src/cwtest/cfg/gutim_full/scriabin/scriabin_etude_op56_4.mid",
|
|
csvFn:"~/src/cwtest/src/cwtest/cfg/gutim_full/scriabin/scriabin_etude_op56_4.csv" }
|
|
|
|
csv: { midiFn:"~/src/cwtest/src/cwtest/cfg/gutim_full/scriabin/scriabin_etude_op49_1.mid",
|
|
csvFn:"~/src/cwtest/src/cwtest/cfg/gutim_full/scriabin/scriabin_etude_op49_1.csv" }
|
|
|
|
csv: { midiFn:"~/src/cwtest/src/cwtest/cfg/gutim_full/scriabin/scriabin_prelude_op74_1.mid",
|
|
csvFn:"~/src/cwtest/src/cwtest/cfg/gutim_full/scriabin/scriabin_prelude_op74_1.csv" }
|
|
|
|
csv: { midiFn:"~/src/cwtest/src/cwtest/cfg/gutim_full/scriabin/scriabin_prelude_op74_2.mid",
|
|
csvFn:"~/src/cwtest/src/cwtest/cfg/gutim_full/scriabin/scriabin_prelude_op74_2.csv" }
|
|
|
|
csv: { midiFn:"~/src/cwtest/src/cwtest/cfg/gutim_full/scriabin/scriabin_prelude_op74_3.mid",
|
|
csvFn:"~/src/cwtest/src/cwtest/cfg/gutim_full/scriabin/scriabin_prelude_op74_3.csv" }
|
|
|
|
csv: { midiFn:"~/src/cwtest/src/cwtest/cfg/gutim_full/scriabin/scriabin_prelude_op74_4.mid",
|
|
csvFn:"~/src/cwtest/src/cwtest/cfg/gutim_full/scriabin/scriabin_prelude_op74_4.csv" }
|
|
|
|
csv: { midiFn:"~/src/cwtest/src/cwtest/cfg/gutim_full/scriabin/scriabin_prelude_op74_5.mid",
|
|
csvFn:"~/src/cwtest/src/cwtest/cfg/gutim_full/scriabin/scriabin_prelude_op74_5.csv" }
|
|
|
|
|
|
csv: { midiFn:"~/src/cwtest/src/cwtest/cfg/gutim_full/scriabin/scriabin_prelude_op67_1.mid",
|
|
csvFn:"~/src/cwtest/src/cwtest/cfg/gutim_full/scriabin/scriabin_prelude_op67_1.csv" }
|
|
|
|
csv: { midiFn:"~/src/cwtest/src/cwtest/cfg/gutim_full/scriabin/scriabin_prelude_op67_2.mid",
|
|
csvFn:"~/src/cwtest/src/cwtest/cfg/gutim_full/scriabin/scriabin_prelude_op67_2.csv" }
|
|
|
|
csv: { midiFn:"~/src/cwtest/src/cwtest/cfg/gutim_full/scriabin/scriabin_sonate_7_op64.mid",
|
|
csvFn:"~/src/cwtest/src/cwtest/cfg/gutim_full/scriabin/scriabin_sonate_7_op64.csv" }
|
|
|
|
csv: { midiFn:"~/src/cwtest/src/cwtest/cfg/gutim_full/scriabin/scriabin_prelude_op48_3.mid",
|
|
csvFn:"~/src/cwtest/src/cwtest/cfg/gutim_full/scriabin/scriabin_prelude_op48_3.csv" }
|
|
|
|
|
|
|
|
}
|
|
|
|
midifile1:
|
|
{
|
|
// rpt_beg_end: print the first and last 'msg' count msgs in 'midi_fname'.
|
|
rpt_beg_end: {
|
|
midi_fname: "~/temp/shiau_uen/record_5/midi.mid",
|
|
msg_cnt: 10,
|
|
note_on_only_fl: true,
|
|
},
|
|
rpt_beg_end: {
|
|
midi_fname: "~/temp/shiau_uen/record_7/midi.mid",
|
|
msg_cnt: 5,
|
|
note_on_only_fl: true,
|
|
},
|
|
rpt_beg_end: {
|
|
midi_fname: "~/temp/shiau_uen/record_11/midi.mid",
|
|
msg_cnt: 5,
|
|
note_on_only_fl: true,
|
|
},
|
|
rpt_beg_end: {
|
|
midi_fname: "~/temp/shiau_uen/record_13/midi.mid",
|
|
msg_cnt: 5,
|
|
note_on_only_fl: true,
|
|
},
|
|
rpt_beg_end: {
|
|
midi_fname: "~/temp/shiau_uen/record_17/midi.mid",
|
|
msg_cnt: 5,
|
|
note_on_only_fl: true,
|
|
},
|
|
rpt_beg_end: {
|
|
midi_fname: "~/temp/shiau_uen/record_23/midi.mid",
|
|
msg_cnt: 5,
|
|
note_on_only_fl: true,
|
|
},
|
|
}
|
|
|
|
midifile0:
|
|
{
|
|
// rpt: Print a MIDI file report for the listed midi files.
|
|
// rpt: { midiFn:"~/media/audio/midi/988-v25.mid" }
|
|
// rpt: { midiFn:"~/src/currawong/audio/workshop/demare2/record_5/midi.mid"}
|
|
|
|
// csv: Convert MIDI files to CSV files
|
|
// csv: { midiFn:"~/src/currawong/audio/workshop/demare2/record_5/midi.mid", csvFn: "midi.csv" }
|
|
// csv: { midiFn:"~/src/currawong/site/web_part_selection/GUTIM part 1 no colors, single system all sections correcting staves distance.mid",
|
|
// csvFn: "~/temp/midi.csv" }
|
|
|
|
// batch_convert: Convert all the MIDI files in
|
|
// <io_dir>/<session_dir>/record_<take_number>/midi.mid to CSV files.
|
|
batch_convert: {
|
|
io_dir: "~/src/currawong/audio/workshop",
|
|
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
|
|
},
|
|
|
|
batch_convert: {
|
|
io_dir: "~/src/currawong/audio/workshop",
|
|
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
|
|
},
|
|
|
|
batch_convert: {
|
|
io_dir: "~/src/currawong/audio/workshop",
|
|
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
|
|
},
|
|
|
|
batch_convert: {
|
|
io_dir: "~/src/currawong/audio/workshop",
|
|
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
|
|
},
|
|
|
|
},
|
|
|
|
audioDevTest: {
|
|
srate: 48000,
|
|
bufN: 3,
|
|
framesPerCycle: 512,
|
|
inDev: "MBox USB Audio",
|
|
outDev: "MBox USB Audio",
|
|
meterMs: 50,
|
|
amHz: 1,
|
|
amMaxGain: 0.8
|
|
},
|
|
|
|
audioDevFileTest: {
|
|
//inAudioFname: "~/temp/temp_sine_100_hz.wav",
|
|
inAudioFname: "~/temp/piano_0.wav",
|
|
outAudioFname: "~/temp/test.wav",
|
|
framesPerCycle:1024,
|
|
cycleCnt:100,
|
|
},
|
|
|
|
audioDevAlsa: {},
|
|
audioDevRpt: {}, // print a list of audio device
|
|
|
|
audiofile:
|
|
{
|
|
rpt: { fn:"~/src/cwtest/src/cwtest/cfg/main_cfg_data/audio_32_float.wav", begIdx: 0, frmCnt: 10 }
|
|
},
|
|
|
|
afop:
|
|
{
|
|
// Generate sine signals
|
|
sine: { enable_fl:true, fn:"~/temp/temp_sine_100_hz.wav", srate: 48000, bits: 0, hz: 100, gain: 0.5, secs: 10.0 },
|
|
sine: { enable_fl:true, fn:"~/temp/temp_sine_1000_hz.wav", srate: 48000, bits: 0, hz: 1000, gain: 0.5, secs: 10.0 },
|
|
|
|
// Mix audio files
|
|
mix: { enable_fl:true, outFn: "~/temp/temp_mix.wav", outBits: 0,
|
|
srcL: [
|
|
{ gain: 0.6, src:"~/temp/temp_sine_100_hz.wav" },
|
|
{ gain: 0.4, src:"~/temp/temp_sine_1000_hz.wav" }
|
|
]}
|
|
|
|
// Cut sections of audio files into separate audio files.
|
|
select_to_file: { enable_fl:true,
|
|
outDir: "~/temp",
|
|
markerFn: "~/temp/select_marker.txt" // write an Audacity marker file with beg/end fade in/out times
|
|
outBits:32,
|
|
fadeInSec: 0.1,
|
|
fadeInPreFl: true, // start selection at 'begSec-fadeInSec' else start at 'begSec'
|
|
fadeOutSec: 0.1,
|
|
fadeOutPostFl: true, // end selection at 'endSec+fadeOutSec' else end end at 'endSec'
|
|
srcFn: "~/temp/temp_mix.wav"
|
|
|
|
selectL: [
|
|
{ begSec: 1.0, endSec: 2.0, dst: "temp_cut0.wav", /* src:"src.wav" */ },
|
|
{ begSec: 3.0, endSec: 4.0, dst: "temp_cut1.wav", /* src:"src.wav" */ },
|
|
]}
|
|
|
|
// Extract a section of source audio, apply fade in/out ramps, and mix it into a destination file.
|
|
cut_and_mix:
|
|
{
|
|
enable_fl: true,
|
|
dstFn: "~/temp/test_xfade.wav",
|
|
dstBits: 32,
|
|
|
|
srcDir: "~/temp",
|
|
crossFadeSec: 0.5,
|
|
|
|
argL: [
|
|
// Include "srcBegFadeSec" and "srcEndFadeSec" to set the begin/end cross-fade duration.
|
|
{ srcBegSec: 1.0, srcEndSec: 2.0, srcFn: "temp_sine_100_hz.wav", dstBegSec:0.0, gain:1.0 },
|
|
{ srcBegSec: 3.0, srcEndSec: 4.0, srcFn: "temp_sine_1000_hz.wav", dstBegSec:0.5, gain:1.0 }
|
|
]
|
|
},
|
|
|
|
// Given a set of overlapping source files of identical length solo a given source during a specified time interval.
|
|
parallel_mix:
|
|
{
|
|
enable_fl: true,
|
|
dstFn: "~/temp/test_pmix.wav",
|
|
dstBits: 32,
|
|
|
|
srcDir: "~/temp",
|
|
|
|
argL: [
|
|
{ srcBegSec: 0.0, srcEndSec: 1.0, srcFn: "temp_sine_100_hz.wav", fadeOutSec:0.5, gain:1.0 },
|
|
{ srcBegSec: 0.5, srcEndSec: 3.0, srcFn: "temp_sine_1000_hz.wav", fadeOutSec:0.5, gain:1.0 }
|
|
{ srcBegSec: 2.5, srcEndSec: 5.0, srcFn: "temp_mix.wav", fadeOutSec:0.5, gain:1.0 }
|
|
]
|
|
},
|
|
|
|
// Convolve an audio file with an impulse response
|
|
convolve:
|
|
{
|
|
enable_fl: true,
|
|
dstFn: "~/temp/temp_convolve.wav",
|
|
dstBits: 32,
|
|
srcFn: "~/temp/test_pmix.wav",
|
|
irFn: "~/src/cwtest/src/cwtest/cfg/main_cfg_data/freeverb3_IR_theater.wav",
|
|
irScale: 0.25,
|
|
|
|
},
|
|
|
|
// Synthesize a signal.
|
|
generate:
|
|
{
|
|
enable_fl: true,
|
|
dstFn: "~/temp/temp_click.wav",
|
|
dstBits: 32,
|
|
dstSrate: 48000,
|
|
dstSecs: 711.0, // file duration in secs
|
|
op: "click", // select the operation
|
|
|
|
sine: { gain:0.7, hertz:440.0 },
|
|
click: { gain:0.8, decay:0.9, msL:[ 61000,117000,181000,241500,280500,312000,357300,419800,480000,535500,584200,646100,678000,709500 ] }
|
|
},
|
|
|
|
// This is the interface to the Currawong online transform audition demo.
|
|
transform_app:
|
|
{
|
|
srcDir: "~/temp/kc_record/xform_only/cut", // location of 'wet' source files
|
|
dryFn: "~/temp/kc_record/xform_only/cut/concert.wav", // dry source file
|
|
|
|
dstPreFn: "~/temp/test_xform_app.wav", // the output file prior to reverb
|
|
dstRevFn: "~/temp/test_xform_app_rev.wav", // the output file with reverb
|
|
|
|
dstBits: 32,
|
|
|
|
irEnableFl: false,
|
|
irScale: 0.25,
|
|
irFn: null, //"~/media/audio/IR/freeverb3/101-cup.wav"
|
|
|
|
|
|
argL: [
|
|
{ srcBegSec: 0.0, srcEndSec: 4.2, srcFn: "a.wav", fadeOutSec:0.5, wetGain:0.3 },
|
|
{ srcBegSec: 4.2, srcEndSec: 8.6, srcFn: "b.wav", fadeOutSec:0.5, wetGain:0.3 },
|
|
{ srcBegSec: 8.6, srcEndSec: 15.67, srcFn: "c.wav", fadeOutSec:0.5, wetGain:0.3 },
|
|
{ srcBegSec: 15.67, srcEndSec: 17.98, srcFn: "d.wav", fadeOutSec:0.0, wetGain:0.3 },
|
|
|
|
]
|
|
},
|
|
|
|
|
|
},
|
|
|
|
|
|
audio_file_proc: {
|
|
srcFn: "/home/kevin/src/currawong/audio/GUTIM_All_20200711_96k_float.wav",
|
|
dstFn: "/home/kevin/temp/audio_out.wav",
|
|
cfg: "tremelo",
|
|
|
|
recordChN: 0,
|
|
recorder: {
|
|
enableFl: true,
|
|
frameN: 1024,
|
|
sigN: 10,
|
|
filename: "~/temp/temp.csv",
|
|
colLabelL: [ "mean0", "mean1", "db0", "db1", "db2", "db3", "db4" ]
|
|
}
|
|
|
|
tremelo: {
|
|
wndSmpN: 1024,
|
|
hopSmpN: 1024,
|
|
program: "tremelo",
|
|
args: {
|
|
hz: 1.0
|
|
depth: 1.0
|
|
}
|
|
}
|
|
|
|
pvoc: {
|
|
wndSmpN: 512,
|
|
hopSmpN: 512,
|
|
program: "pvoc",
|
|
args: {
|
|
procSmpN: 512,
|
|
wndSmpN: 2048,
|
|
hopSmpN: 512
|
|
}
|
|
}
|
|
}
|
|
|
|
pvoc_file_proc: {
|
|
srcFn: "/home/kevin/temp/audio.wav",
|
|
dstFn: "/home/kevin/temp/audio_out.wav",
|
|
program: "spec_dist",
|
|
|
|
recordChN: 2,
|
|
|
|
recorder: {
|
|
enableFl: false,
|
|
frameN: 1024,
|
|
sigN: 10,
|
|
filename: "~/temp/temp.csv",
|
|
colLabelL: [ "mean0", "mean1", "db0", "db1", "db2", "db3", "db4", "db5", "db6" ]
|
|
}
|
|
|
|
pvoc_template: {
|
|
wndSmpN: 2048, // required FT window size in samples
|
|
hopSmpN: 512, // required Sample offset between successive FT windows
|
|
procSmpN: 512, // required Output samples for each FT frame processed
|
|
presetLabel: preset_1, // required
|
|
inGain: 1.0, // optional
|
|
outGain: 1.0, // optional
|
|
|
|
function: pvoc_template,
|
|
|
|
args:
|
|
{
|
|
foo: 1,
|
|
blah: 2,
|
|
}
|
|
|
|
|
|
}
|
|
|
|
spec_dist: {
|
|
wndSmpN: 2048,
|
|
hopSmpN: 512,
|
|
procSmpN: 512,
|
|
inGain: 1.0, // optional
|
|
outGain: 1.0, // optional
|
|
|
|
function: spec_dist,
|
|
|
|
args: {
|
|
ceiling: 30.0,
|
|
expo: 2.0,
|
|
thresh: 54.0,
|
|
upr: -0.7,
|
|
lwr: 2.0,
|
|
mix: 0.0
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// Create a server to listen on a known port
|
|
sockMgrSrvTest: {
|
|
protocol: tcp, // tcp | udp
|
|
//nicDev: // optional NIC device
|
|
localPort: 5688,
|
|
},
|
|
|
|
sockMgrClientTest: {
|
|
//nicDev: // optional NIC device
|
|
protocol: tcp,
|
|
localPort: 5687,
|
|
remoteAddr: "127.0.0.1", // localhost
|
|
remotePort: 5688,
|
|
|
|
}
|
|
|
|
|
|
// Interactive send/recv tester
|
|
socketUdp: {
|
|
localPort: 5687,
|
|
remoteAddr: "127.0.0.1", // localhost
|
|
remotePort: 5688
|
|
},
|
|
|
|
socketTcpClient: {
|
|
localPort: 5687,
|
|
remoteAddr: "127.0.0.1", // localhost
|
|
remotePort: 5688
|
|
dgramFl: false,
|
|
serverFl: false,
|
|
timeOutMs: 100
|
|
},
|
|
|
|
socketTcpServer: {
|
|
localPort: 5688,
|
|
remoteAddr: "127.0.0.1", // localhost
|
|
remotePort: 5687,
|
|
dgramFl: false,
|
|
serverFl: true,
|
|
timeOutMs: 100
|
|
},
|
|
|
|
socketSrvUdp: {
|
|
localPort: 5688,
|
|
remoteAddr: "127.0.0.1", // localhost
|
|
remotePort: 5687,
|
|
},
|
|
|
|
socketSrvTcp: {
|
|
localPort: 5688,
|
|
remoteAddr: "127.0.0.1", // localhost
|
|
remotePort: 5687,
|
|
},
|
|
|
|
socketMdns: {},
|
|
dnssd: {},
|
|
eucon: {},
|
|
|
|
|
|
|
|
dirEntry: {
|
|
path: "~/src/cwtest/src/cwtest/cfg/test",
|
|
attrL: [ "file","dir","link","hidden","cur_dir","parent_dir","full_path","recurse","recurse_links"]
|
|
},
|
|
|
|
io: {
|
|
ui: {
|
|
enableFl: true,
|
|
asyncFl:false,
|
|
physRootDir: "/home/kevin/src/cwtest/src/libcw/html/ioTest",
|
|
dfltPageFn: "index.html",
|
|
port: 5687,
|
|
rcvBufByteN: 2048,
|
|
xmtBufByteN: 2048,
|
|
fmtBufByteN: 4096,
|
|
uiCfgFn: "ui.cfg" // default UI resource description
|
|
queueBlkCnt: 8,
|
|
queueBlkByteCnt: 32768,
|
|
idleMsgPeriodMs: 50, // period without messages before an idle message is generated
|
|
extraLogsFl: false,
|
|
},
|
|
|
|
|
|
serial: {
|
|
enableFl: false,
|
|
pollPeriodMs: 50,
|
|
recvBufByteN: 512,
|
|
|
|
array: [
|
|
{
|
|
enableFl: true,
|
|
asyncFl: false,
|
|
label: "port1", // User label
|
|
device: "/dev/ttyACM0", // Serial device name
|
|
baud: 115200,
|
|
bits: 8,
|
|
stop: 1,
|
|
parity: no
|
|
}
|
|
],
|
|
},
|
|
|
|
midi: {
|
|
enableFl: true,
|
|
asyncFl: true,
|
|
parseBufByteCnt: 1024,
|
|
appNameStr: "cwtest",
|
|
fileDevName: "file_dev",
|
|
fileDevReadAheadMicros: 3000,
|
|
testFileLabel: "file_0",
|
|
testFileEnableFl: false
|
|
enableBufFl:true,
|
|
bufferMsgCnt:4096,
|
|
filterRtSenseFl:true
|
|
|
|
file_ports: [
|
|
|
|
{ "label":"file_0",
|
|
//"file": "/home/kevin/src/cwtest/src/cwtest/cfg/gutim_full/data1/beck1/record_4/midi.mid",
|
|
"enable_fl": false },
|
|
]
|
|
|
|
},
|
|
|
|
|
|
audio: {
|
|
enableFl: true,
|
|
meterMs: 50, // audio meter filter length and meter callback period
|
|
threadTimeOutMs: 50, // audio thread cond var time out
|
|
|
|
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
|
|
}
|
|
],
|
|
|
|
deviceL: [
|
|
{
|
|
// System device name
|
|
//device: "Scarlett 18i20 USB USB Audio",
|
|
//device: "USB Audio CODEC USB Audio",
|
|
//device: "HDA Intel PCH CS4208 Analog",
|
|
device: "MBox USB Audio"
|
|
//device: "sof-hda-dsp"
|
|
|
|
activeFl: true, // (req)
|
|
meterFl: true, // (opt)
|
|
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: {
|
|
|
|
enableFl: true,
|
|
asyncFl: false,
|
|
maxSocketCnt: 10,
|
|
recvBufByteCnt: 4096,
|
|
threadTimeOutMs: 50,
|
|
|
|
socketL: [
|
|
{
|
|
enableFl: true, // (req)
|
|
asyncFl: false, // (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)
|
|
asyncFl: false, // (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 ],
|
|
}
|
|
]
|
|
|
|
|
|
}
|
|
},
|
|
|
|
|
|
io_minimal: {
|
|
|
|
},
|
|
|
|
audio_midi: {
|
|
record_dir: "/home/kevin/temp/shiau_uen",
|
|
//record_dir: "/home/kevin/src/currawong/audio/video_trailer/beck",
|
|
//record_dir: "/home/kevin/src/currawong/audio/workshop/beck2",
|
|
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: [4 5 ],
|
|
audio_out_ch_map: [0, 1 ]
|
|
|
|
midi_play_record: {
|
|
max_midi_msg_count: 32768,
|
|
midi_timer_period_micro_sec: 15000,
|
|
all_off_delay_ms: 0, // delay after stop time to turn off all notes
|
|
log_in_flag: false,
|
|
log_out_flag: false,
|
|
half_pedal_flag: false,
|
|
min_damper_down_time_ms: 0,
|
|
|
|
midi_device_list: [
|
|
// piano
|
|
{
|
|
enableFl: true,
|
|
label: "piano",
|
|
|
|
//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: "iRig MIDI 2",
|
|
//midi_out_port: "iRig MIDI 2 MIDI 1",
|
|
|
|
//midi_out_device: "PipeWire-RT-Event",
|
|
//midi_out_port: "input",
|
|
|
|
midi_out_device: "Fastlane",
|
|
midi_out_port: "Fastlane MIDI A",
|
|
|
|
force_damper_down_fl: false,
|
|
force_damper_down_threshold: 35,
|
|
force_damper_down_velocity: 127,
|
|
|
|
// do not play damper values that are in this range
|
|
damper_dead_band_enable_fl: false,
|
|
damper_dead_band_min_value: 1,
|
|
damper_dead_band_max_value: 30,
|
|
|
|
|
|
// 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 ] ,
|
|
|
|
//scale_chord_notes_enable_fl: true,
|
|
//scale_chord_notes_factor: 0.5,
|
|
|
|
}
|
|
//{ midi_out_device: "PipeWire-RT-Event", midi_out_port: "input" },
|
|
],
|
|
}
|
|
|
|
|
|
io: {
|
|
callbackMutexTimeOutMs: 100,
|
|
}
|
|
|
|
ui: {
|
|
enableFl: true,
|
|
asyncFl:false,
|
|
physRootDir: "/home/kevin/src/cwtest/src/libcw/html/audio_midi",
|
|
dfltPageFn: "index.html",
|
|
port: 5687,
|
|
rcvBufByteN: 2048,
|
|
xmtBufByteN: 2048,
|
|
fmtBufByteN: 4096,
|
|
websockTimeOutMs: 50, // max time out while blocking for a websock event
|
|
idleMsgPeriodMs: 50, // period without messages before an idle message is generated
|
|
uiCfgFn: "ui.cfg", // default UI resource description
|
|
queueBlkCnt: 8,
|
|
queueBlkByteCnt: 32768,
|
|
idleMsgPeriodMs: 50, // period without messages before an idle message is generated
|
|
extraLogsFl: false,
|
|
},
|
|
|
|
|
|
serial:
|
|
{
|
|
enableFl: false,
|
|
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: {
|
|
enableFl: true,
|
|
asyncFl: true,
|
|
parseBufByteCnt: 1024,
|
|
appNameStr: "cwtest",
|
|
fileDevName: "file_dev",
|
|
fileDevReadAheadMicros: 3000,
|
|
testFileLabel: "file_0",
|
|
testFileEnableFl: false
|
|
enableBufFl:true,
|
|
bufferMsgCnt:4096,
|
|
filterRtSenseFl:true
|
|
|
|
file_ports: [
|
|
|
|
{ "label":"file_0",
|
|
//"file": "/home/kevin/src/cwtest/src/cwtest/cfg/gutim_full/data1/beck1/record_4/midi.mid",
|
|
"enable_fl": false },
|
|
]
|
|
|
|
},
|
|
|
|
audio: {
|
|
enableFl: true,
|
|
meterMs: 50, // audio meter filter length and meter callback period
|
|
threadTimeOutMs: 50, // audio thread cond var time out
|
|
|
|
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
|
|
}
|
|
],
|
|
|
|
deviceL: [
|
|
{
|
|
// System device name
|
|
//device: "Scarlett 18i20 USB USB Audio",
|
|
//device: "USB Audio CODEC USB Audio",
|
|
//device: "HDA Intel PCH CS4208 Analog",
|
|
//device: "ICUSBAUDIO7D USB Audio",
|
|
device: "MBox USB Audio",
|
|
|
|
activeFl: true, // (req)
|
|
meterFl: true, // (opt)
|
|
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: {
|
|
enableFl: false,
|
|
asyncFl: false,
|
|
maxSocketCnt: 10,
|
|
recvBufByteCnt: 4096,
|
|
threadTimeOutMs: 50,
|
|
socketL: [],
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
b23Tree:
|
|
{
|
|
},
|
|
|
|
|
|
mnist: {
|
|
desc: "Print the MNIST images to an SVG/HTML file.",
|
|
inDir: "~/src/datasets/mnist",
|
|
outHtmlFn: "~/temp/image_svg_0.html"
|
|
},
|
|
|
|
|
|
dataset_wtr: {
|
|
outFn: "~/temp/temp.ds"
|
|
},
|
|
|
|
dataset_rdr: {
|
|
inFn: "~/temp/temp.ds",
|
|
cacheByteN: 146,
|
|
},
|
|
|
|
dataset_adapter: {
|
|
inFn: "~/temp/temp.ds",
|
|
cacheByteN: 154,
|
|
batchN: 3,
|
|
},
|
|
|
|
|
|
dataset: {
|
|
desc: "Read MNIST native file -> write dataset file -> read datasetfile -> write SVG file",
|
|
inDir: "~/src/datasets/mnist",
|
|
dsFn: "~/temp/temp_dataset.ds",
|
|
outHtmlFn: "~/temp/image_svg.html",
|
|
batchN: 3500,
|
|
cacheByteN: 2800000
|
|
},
|
|
|
|
|
|
svg: {
|
|
desc:"Create an SVG/HTML test file.",
|
|
notes:"If no CSS file name is given then the style information will be written inline.",
|
|
outHtmlFn: "~/temp/test_svg.html",
|
|
outCssFn: "~/temp/test_svg.css"
|
|
},
|
|
|
|
|
|
|
|
|
|
// Convert the the 'am' files in 'inDir' to MIDI and CSV files
|
|
// named 'midi.mid' and 'midi.csv'.
|
|
// The 'beg_loc' and 'end_loc' will be written to a file named 'meta.cfg'.
|
|
// All output files are written in the same directory as the 'am' files.
|
|
am_to_midi_file: [
|
|
|
|
{ enable_fl: false, player_name: "beck", prefix_label:"beck_1", sess_numb:1, beg_loc: 4232, end_loc: 4707, dir: "~/src/cwtest/src/cwtest/cfg/gutim_full/data/beck1" },
|
|
{ enable_fl: false, player_name: "beck", prefix_label:"beck_2", sess_numb:2, beg_loc: 4232, end_loc: 4707, dir: "~/src/cwtest/src/cwtest/cfg/gutim_full/data/beck2" },
|
|
{ enable_fl: false, player_name: "taka", prefix_label:"taka_1", sess_numb:1, beg_loc: 4232, end_loc: 4707, dir: "~/src/cwtest/src/cwtest/cfg/gutim_full/data/taka1" },
|
|
{ enable_fl: false, player_name: "taka", prefix_label:"taka_2", sess_numb:2, beg_loc: 4232, end_loc: 4707, dir: "~/src/cwtest/src/cwtest/cfg/gutim_full/data/taka2" },
|
|
{ enable_fl: false, player_name: "ding", prefix_label:"ding_1", sess_numb:1, beg_loc: 120, end_loc: 146, dir: "~/temp/shiau_uen/segment_0" },
|
|
{ enable_fl: false, player_name: "ding", prefix_label:"ding_1", sess_numb:1, beg_loc: 888, end_loc: 929, dir: "~/temp/shiau_uen/segment_1" },
|
|
{ enable_fl: false, player_name: "ding", prefix_label:"ding_1", sess_numb:1, beg_loc: 2287, end_loc: 2454, dir: "~/temp/shiau_uen/segment_2" },
|
|
{ enable_fl: false, player_name: "ding", prefix_label:"ding_1", sess_numb:1, beg_loc: 3765, end_loc: 3883, dir: "~/temp/shiau_uen/segment_3" },
|
|
{ enable_fl: false, player_name: "ding", prefix_label:"ding_1", sess_numb:1, beg_loc: 5407, end_loc: 5462, dir: "~/temp/shiau_uen/segment_4" },
|
|
{ enable_fl: true, player_name: "ding", prefix_label:"ding_1", sess_numb:1, beg_loc: 6608, end_loc: 6677, dir: "~/temp/shiau_uen/segment_5" }
|
|
],
|
|
|
|
|
|
flow_proc_dict: {
|
|
|
|
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."}
|
|
}
|
|
}
|
|
|
|
audio_in: {
|
|
vars: {
|
|
dev_label: { type:string, doc:"Audio device label." },
|
|
out: { type:audio, doc:"Audio output" },
|
|
}
|
|
}
|
|
|
|
audio_out: {
|
|
vars: {
|
|
dev_label: { type:string, doc:"Audio device label." },
|
|
in: { type:audio, srcFl:true, doc:"Audio input." }
|
|
}
|
|
}
|
|
|
|
audioFileIn: {
|
|
vars: {
|
|
fname: { type:string, doc:"Audio file name." },
|
|
out:{ type:audio, doc:"Audio file output" },
|
|
eofFl:{ type:bool, eofFl: true, doc:"Set the system 'halt' flag when the audio is completely read."},
|
|
}
|
|
}
|
|
|
|
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)."},
|
|
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." },
|
|
}
|
|
}
|
|
|
|
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." },
|
|
}
|
|
|
|
presets:
|
|
{
|
|
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."}
|
|
}
|
|
}
|
|
|
|
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." },
|
|
}
|
|
}
|
|
|
|
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." },
|
|
}
|
|
}
|
|
|
|
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." },
|
|
}
|
|
}
|
|
|
|
|
|
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."},
|
|
out: { type:audio, doc:"Audio output" },
|
|
}
|
|
|
|
presets: {
|
|
a: { hz:220 },
|
|
b: { hz:880 },
|
|
}
|
|
}
|
|
|
|
pv_analysis: {
|
|
vars: {
|
|
in: { type:audio, srcFl:true, doc:"Audio input." },
|
|
hopSmpN: { type:uint, value: 128, doc:"Hop sample count." },
|
|
wndSmpN: { type:uint, value: 512, doc:"Window sample count." },
|
|
hzFl: { type:bool, value: false, doc:"Calculate frequency via the method of phase changeof each bin." },
|
|
out: { type:spectrum, doc:"Spectrum output." }
|
|
}
|
|
}
|
|
|
|
pv_synthesis: {
|
|
vars: {
|
|
in: { type:spectrum, srcFl:true, doc:"Spectrum input." },
|
|
out: { type:audio, doc:"Audio output." }
|
|
}
|
|
}
|
|
|
|
spec_dist: {
|
|
vars: {
|
|
in: { type:spectrum, srcFl:true, doc:"Spectrum input." },
|
|
|
|
ceiling: { type:real, value: 30.0, doc:"Ceiling parameter."},
|
|
expo: { type:real, value: 2.0, doc:"Exponent parameter."},
|
|
thresh: { type:real, value: 54.0, doc:"Threshold parameter."},
|
|
upr: { type:real, value: -0.7, doc:"Upper slope parameter."},
|
|
lwr: { type:real, value: 2.0, doc:"Lower slope parameter."},
|
|
mix: { type:real, value: 0.0, doc:"Basic/Bump Mix parameter."},
|
|
|
|
out: { type:spectrum, doc:"Spectrum output." },
|
|
|
|
}
|
|
|
|
presets: {
|
|
|
|
dry: {
|
|
|
|
}
|
|
|
|
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
|
|
thresh: 60.0
|
|
upr: [ -1.1, -0.99],
|
|
lwr: 2.0
|
|
mix: 0.0
|
|
}
|
|
|
|
b: {
|
|
ceiling: 20.0
|
|
expo: 2.0
|
|
thresh: [ 77.0, 74.0 ],
|
|
upr: -0.5
|
|
lwr: [ 3.0, 2.0 ],
|
|
mix: 0.0
|
|
}
|
|
|
|
c: {
|
|
ceiling: 20.0
|
|
expo: 2.0
|
|
thresh: 80.0
|
|
upr: -0.5
|
|
lwr: 5.0
|
|
mix: 0.0
|
|
}
|
|
|
|
d: {
|
|
ceiling: 20.0
|
|
expo: 2.0
|
|
thresh: 70.0
|
|
upr: [ -3.9, 04.5]
|
|
lwr: 4.0
|
|
mix: 0.0
|
|
}
|
|
|
|
f_1: {
|
|
ceiling: 20.0
|
|
expo: 2.0
|
|
thresh: 50.0
|
|
upr: -3.0
|
|
lwr: 1.0
|
|
mix: 0.0
|
|
}
|
|
|
|
f_2: {
|
|
ceiling: 20.0
|
|
expo: 2.0
|
|
thresh: 60.0
|
|
upr: -3.0
|
|
lwr: 1.0
|
|
mix: 0.0
|
|
}
|
|
|
|
f_3: {
|
|
ceiling: 20.0
|
|
expo: 2.0
|
|
thresh: 55.0
|
|
upr: -3.0
|
|
lwr: 1.0
|
|
mix: 0.0
|
|
}
|
|
|
|
f_4: {
|
|
ceiling: 20.0
|
|
expo: 2.0
|
|
thresh: 55.0
|
|
upr: -5.0
|
|
lwr: 1.0
|
|
mix: 0.0
|
|
}
|
|
|
|
g: {
|
|
ceiling: 40.0
|
|
expo: 8.0
|
|
thresh: [60.0 64.0]
|
|
upr: -0.7
|
|
lwr: 8.0
|
|
mix: 1.0
|
|
}
|
|
|
|
g_a: {
|
|
ceiling: 40.0
|
|
expo: 2.0
|
|
thresh: [50.0 54.0]
|
|
upr: -0.7
|
|
lwr: 2.0
|
|
mix: 1.0
|
|
}
|
|
|
|
g_1_a: {
|
|
ceiling: 20.0
|
|
expo: 2.0
|
|
thresh: [50.0 54.0]
|
|
upr: -0.7
|
|
lwr: 8.0
|
|
mix: 1.0
|
|
}
|
|
|
|
g_1_d: {
|
|
ceiling: [60.0 64.0]
|
|
expo: [ 7.0 5.0]
|
|
thresh: [40.0 34.0]
|
|
upr: [-0.4 -0.3]
|
|
lwr: [ 7.0 5.0]
|
|
mix: 1.0
|
|
}
|
|
}
|
|
}
|
|
|
|
compressor: {
|
|
vars: {
|
|
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
|
|
}
|
|
|
|
dry: {
|
|
|
|
}
|
|
|
|
a: {
|
|
igain: 6.0
|
|
ogain: 1.0
|
|
}
|
|
|
|
b: {
|
|
igain: 10.0
|
|
ogain: 1.0
|
|
}
|
|
|
|
c: {
|
|
igain: 11.0
|
|
ogain: 1.0
|
|
}
|
|
|
|
d: {
|
|
igain: 9.0
|
|
ogain: 1.0
|
|
}
|
|
|
|
f_1: {
|
|
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
|
|
}
|
|
|
|
g_1_a: {
|
|
igain: 10.0
|
|
ogain: 0.25
|
|
}
|
|
|
|
g_1_d: {
|
|
igain: 10.0
|
|
ogain: 0.25
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
flow_test: {
|
|
flow_proc_fname: "~/src/cwtest/src/cwtest/cfg/flow_proc_dict.cfg",
|
|
framesPerCycle:64,
|
|
maxCycleCount:15000,
|
|
multiPriPresetProbFl: false, // Use probability to select primary multi-preset
|
|
multiSecPresetProbFl: true, // Use probability to select secondary multi-preset
|
|
multiPresetInterpFl: false, // Interpolate between two selected multi-presets
|
|
printNetworkFl: true, // print the network instance
|
|
printClassDictFl: false, // print the class description dictionary
|
|
|
|
network: {
|
|
|
|
procs: {
|
|
srcFn: { class: audioFileIn, argLabel:"default", args:{ default:{fname:"/home/kevin/temp/temp_sine_100_hz.wav", eofFl:false, on_off:true } } },
|
|
wet_in_gain: { class: audio_gain, in:{ in:srcFn.out }, args:{}},
|
|
|
|
sd_poly: {
|
|
class: poly,
|
|
args: { default:{ count:3 }}
|
|
|
|
network: {
|
|
|
|
procs: {
|
|
|
|
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 },
|
|
|
|
|
|
}
|
|
presets:{}
|
|
|
|
}
|
|
}
|
|
|
|
|
|
xfade_ctl: { class: xfade_ctl, in:{ srateSrc:sd_poly.cmp.out }, args:{ default:{ net:sd_poly, durMs:1000 }} },
|
|
|
|
wet_out_gain: { class: audio_gain, in:{ in_:sd_poly.cmp_.out, gain_:xfade_ctl.gain_ }, args:{}},
|
|
dstFn: { class: audioFileOut, in:{ in:wet_out_gain.out }, args:{ default:{fname:"/home/kevin/temp/audio_flow_out.wav"} } },
|
|
}
|
|
}
|
|
}
|
|
|
|
flow_pv: {
|
|
framesPerCycle:64,
|
|
maxCycleCount:15000,
|
|
|
|
network: {
|
|
srcFn: { class: audioFileIn, argLabel:"default", args:{ default:{fname:"/home/kevin/temp/audio.wav", eofFl:true } } },
|
|
pva: { class: pv_analysis, in:{ in:srcFn.out }, args:{ default:{ wndSmpN:512, hopSmpN:64, hzFl:false } } },
|
|
pvs: { class: pv_synthesis, in:{ in:pva.out }, args:{ default:{ } } },
|
|
dstFn: { class: audioFileOut, in:{ in:pvs.out }, args:{ default:{fname:"/home/kevin/temp/audio_flow_out.wav"} } },
|
|
}
|
|
|
|
}
|
|
|
|
|
|
flow_spec_dist: {
|
|
framesPerCycle: 64, // time-domain audio cycles frame per cycle
|
|
maxCycleCount: 0, // 0 disables maxCycleCount
|
|
printNetworkFl: false, // print the network instance
|
|
printClassDictFl: false, // print the class description dictionary
|
|
|
|
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 }
|
|
}
|
|
},
|
|
|
|
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] },
|
|
aout: { class: audioFileOut, in:{ in:cmp.out }, args:{ default:{fname:"/home/kevin/temp/kc_compare/b.wav"} } },
|
|
}
|
|
|
|
}
|
|
|
|
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"
|
|
|
|
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,
|
|
|
|
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",
|
|
|
|
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_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: "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
|
|
|
|
},
|
|
|
|
// 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 ] ,
|
|
|
|
},
|
|
{
|
|
|
|
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: {
|
|
|
|
panel: {
|
|
|
|
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" }
|
|
}
|
|
|
|
}
|
|
}
|
|
},
|
|
|
|
},
|
|
|
|
ui: {
|
|
physRootDir: "~/src/cwtest/src/libcw/html/preset_sel",
|
|
dfltPageFn: "index.html",
|
|
port: 5687,
|
|
rcvBufByteN: 2048,
|
|
xmtBufByteN: 2048,
|
|
fmtBufByteN: 4096,
|
|
websockTimeOutMs: 50, // max time out while blocking for a websock event
|
|
uiCfgFn: "ui.cfg" // default UI resource description
|
|
},
|
|
|
|
serial: {
|
|
pollPeriodMs: 50,
|
|
recvBufByteN: 512,
|
|
|
|
array: [
|
|
{
|
|
enable_flag: false,
|
|
label: "port1", // User label
|
|
device: "/dev/ttyUSB0", // Serial device name
|
|
baud: 115200,
|
|
bits: 8,
|
|
stop: 1,
|
|
parity: "no",
|
|
}
|
|
]
|
|
|
|
},
|
|
|
|
|
|
midi: {
|
|
parserBufByteN: 1024,
|
|
},
|
|
|
|
audio: {
|
|
meterMs: 50, // audio meter filter length and meter callback period
|
|
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)
|
|
srate: 48000, // (req) Sample rate used by all devices in this group
|
|
dspFrameCnt: 64 // (req) Size of DSP processing buffers
|
|
}
|
|
],
|
|
|
|
deviceL: [
|
|
{
|
|
// System device name
|
|
device: "Scarlett 18i20 USB USB Audio",
|
|
//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
|
|
}
|
|
]
|
|
},
|
|
|
|
socket: {
|
|
maxSocketCnt: 10,
|
|
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
|
|
|
|
|
|
// 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]}} }
|
|
|
|
|
|
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 } }}
|
|
|
|
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 },
|
|
|
|
wet_out_gain: { class: audio_gain, in:{ in:cmp.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:{}},
|
|
|
|
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:{} },
|
|
|
|
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"} } },
|
|
}
|
|
|
|
// 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]}} }
|
|
|
|
// 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 },
|
|
pvs: { class: pv_synthesis, in:{ in:sd.out }, },
|
|
cmp: { class: compressor, in:{ in:pvs.out }, preset:kc },
|
|
|
|
wet_out_gain: { class: audio_gain, in:{ in:cmp.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:{}},
|
|
|
|
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:{} },
|
|
|
|
//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"} } },
|
|
|
|
// 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 } }}
|
|
|
|
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 },
|
|
|
|
wet_out_gain: { class: audio_gain, in:{ in:cmp.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:{}},
|
|
|
|
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:{} },
|
|
|
|
//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"} } },
|
|
}
|
|
|
|
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"} } },
|
|
|
|
// 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 } },
|
|
|
|
// 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]} }},
|
|
|
|
// 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"} } },
|
|
},
|
|
|
|
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"} } },
|
|
},
|
|
|
|
presets: {
|
|
a: { splitL:hi, splitR:lo },
|
|
b: { splitL:lo, splitR:hi }
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
piano_score:{
|
|
//filename: "/home/kevin/src/currawong/projects/score_proc/data/play_file.cfg",
|
|
//filename: "/home/kevin/src/cwtest/src/cwtest/cfg/gutim_full/data/beck1/record_5/play_score.csv"
|
|
//filename: "/home/kevin/src/cwtest/src/cwtest/cfg/gutim_full/data/score/20231028/temp.csv"
|
|
filename: "/home/kevin/src/currawong/projects/perf_meas_workshop_0/foo.csv"
|
|
}
|
|
|
|
|
|
gutim_reg: {
|
|
dir: "~/temp/cw_reg/reg.csv"
|
|
|
|
},
|
|
|
|
|
|
|
|
score_follow: {
|
|
srate: 48000,
|
|
|
|
|
|
score_csv_fname: "/home/kevin/src/currawong/projects/score_proc/temp.csv",
|
|
score_parse_warn_fl: false, // print score parse warnings
|
|
score_warn_fl: false, //print SF score warnings
|
|
score_report_fl: false, // Generate an SF score report
|
|
out_score_rpt_fname: "score_report.txt",
|
|
dyn_tbl_report_fl: false, // Print the dynamics table report
|
|
|
|
score_wnd_locN: 10, // score follower score search window
|
|
midi_wnd_locN: 7, // score folloer MIDI sequence length
|
|
track_print_fl: false, // print output from the sfTrack unit
|
|
|
|
// if true score follower backtracking overwrites previous result records with new alignments
|
|
// otherwise new result records are generated for new alignments.
|
|
track_results_backtrack_fl: false,
|
|
|
|
print_rt_events_fl: false, // print real-time score following output events from cwScoreFollowTest.cpp
|
|
pre_test_fl: false, // Add a single random note prior to the first note in the sequence
|
|
show_muid_fl: false, // Show muid in the MIDI note representation of the SVG output.
|
|
|
|
meas_enable_fl: true, // enable performance measurements
|
|
meas_setup_report_fl: false, // generate a performance measurement config. report (locations of sets,'calcs' and sections)
|
|
|
|
out_dir: "~/temp/score_follow_test_2",
|
|
|
|
// each of these files will be written to the dir: <out_dir>/<perf_label>
|
|
write_perf_meas_json_fl: false,
|
|
out_perf_meas_json_fname: "perf_meas.json",
|
|
|
|
write_svg_file_fl: false,
|
|
out_svg_fname: "sf_results.html",
|
|
|
|
write_sf_analysis_csv_fl: false,
|
|
out_sf_analysis_csv_fname: "sf_analysis.csv",
|
|
|
|
write_midi_csv_fl: false,
|
|
out_midi_csv_fname: "midi.csv",
|
|
|
|
|
|
dyn_ref: [
|
|
{ mark: "silent", level:0, vel:1 },
|
|
{ mark:"pppp-", level:1, vel:3 },
|
|
{ mark:"pppp", level:2, vel:5 },
|
|
{ mark:"pppp+", level:3, vel:7 },
|
|
{ mark:"ppp-", level:4, vel:10 },
|
|
{ mark:"ppp", level:5, vel:15 },
|
|
{ mark:"ppp+", level:6, vel:20 },
|
|
{ mark:"pp-", level:7, vel:25 },
|
|
{ mark:"pp", level:8, vel:30 },
|
|
{ mark:"pp+", level:9, vel:35 },
|
|
{ mark:"p-", level:10, vel:40 },
|
|
{ mark:"p", level:11, vel:45 },
|
|
{ mark:"p+", level:12, vel:50 },
|
|
{ mark:"mp-", level:13, vel:55 },
|
|
{ mark:"mp", level:14, vel:60 },
|
|
{ mark:"mp+", level:15, vel:65 },
|
|
{ mark:"mf-", level:16, vel:70 },
|
|
{ mark:"mf", level:17, vel:75 },
|
|
{ mark:"mf+", level:18, vel:80 },
|
|
{ mark:"f-", level:19, vel:85 },
|
|
{ mark:"f", level:20, vel:90 },
|
|
{ mark:"f+", level:21, vel:95 },
|
|
{ mark:"ff", level:22, vel:100 },
|
|
{ mark:"ff+", level:23, vel:105 },
|
|
{ mark:"fff", level:24, vel:115 },
|
|
{ mark:"fff+", level:25, vel:120 },
|
|
{ mark:"ffff", level:26, vel:125 },
|
|
]
|
|
|
|
|
|
// Generate the 'play_score.csv' by syncing a performed MIDI file to
|
|
// the score. This allows the file to be played back via cwIoPresetSelApp.
|
|
gen_synced_perf_files:
|
|
{
|
|
enable_fl: true,
|
|
jobL: [
|
|
{ dir:"~/src/cwtest/src/cwtest/cfg/gutim_full/data1/beck1" },
|
|
{ dir:"~/src/cwtest/src/cwtest/cfg/gutim_full/data1/beck2" },
|
|
{ dir:"~/src/cwtest/src/cwtest/cfg/gutim_full/data1/taka1" },
|
|
{ dir:"~/src/cwtest/src/cwtest/cfg/gutim_full/data1/taka2" },
|
|
],
|
|
out_fname: "play_score.csv",
|
|
},
|
|
|
|
perfL: [
|
|
|
|
{
|
|
enable_fl: false,
|
|
player: JS,
|
|
perf_date: "20230904",
|
|
take: 1,
|
|
label: full_midi,
|
|
start_loc: 0,
|
|
end_loc:7825,
|
|
midi_fname: "~/src/cwtest/src/cwtest/cfg/gutim_full/GUTIM_20230904.mid"
|
|
},
|
|
{
|
|
enable_fl: false,
|
|
player: SD,
|
|
perf_date: "20230514",
|
|
take: 5,
|
|
label: shiau_uen_5,
|
|
start_loc: 120,
|
|
end_loc: 146,
|
|
midi_fname: "~/temp/shiau_uen/record_5/midi.mid",
|
|
},
|
|
{
|
|
enable_fl: false,
|
|
player: SD,
|
|
perf_date: "20230514",
|
|
take: 7,
|
|
label: shiau_uen_7,
|
|
start_loc: 888,
|
|
end_loc: 929,
|
|
midi_fname: "~/temp/shiau_uen/record_7/midi.mid",
|
|
},
|
|
{
|
|
enable_fl: false,
|
|
player: SD,
|
|
perf_date: "20230514",
|
|
take: 11,
|
|
label: shiau_uen_11,
|
|
start_loc: 2287,
|
|
end_loc: 2454,
|
|
midi_fname: "~/temp/shiau_uen/record_11/midi.mid",
|
|
},
|
|
{
|
|
enable_fl: false,
|
|
player: SD,
|
|
perf_date: "20230514",
|
|
take: 13,
|
|
label: shiau_uen_13,
|
|
start_loc: 3765,
|
|
end_loc:3883,
|
|
midi_fname: "~/temp/shiau_uen/record_13/midi.mid",
|
|
},
|
|
{
|
|
enable_fl: false,
|
|
player: SD,
|
|
perf_date: "20230514",
|
|
take: 17,
|
|
label: shiau_uen_17,
|
|
start_loc: 5407,
|
|
end_loc:5462,
|
|
midi_fname: "~/temp/shiau_uen/record_17/midi.mid",
|
|
},
|
|
{
|
|
enable_fl: false,
|
|
player: SD,
|
|
perf_date: "20230514",
|
|
take: 23,
|
|
label: shiau_uen_23,
|
|
start_loc: 6628,
|
|
end_loc: 6677,
|
|
midi_fname: "~/temp/shiau_uen/record_23/midi.mid",
|
|
}
|
|
]
|
|
|
|
}
|
|
|
|
svg_midi_file: {
|
|
"src_file_type": "midi",
|
|
"src_fname": "~/temp/shiau_uen/record_5/midi.mid",
|
|
|
|
//"src_file_type": "piano_score",
|
|
//"src_fname": "~/src/cwtest/src/cwtest/cfg/gutim_full/score/temp.csv",
|
|
//"src_fname": "/home/kevin/src/cwtest/src/cwtest/cfg/preset_sel/score/20220423/temp.csv"
|
|
|
|
"out_fname": "~/temp/score_follow_test/midi_svg.html"
|
|
"midi_state_args": {
|
|
"cache_enable_fl": true,
|
|
"cache_block_msg_count": 128,
|
|
"pedal_up_midi_value": 64,
|
|
"pedal_half_min_midi_value": 40,
|
|
"pedal_half_max_midi_value": 50
|
|
}
|
|
}
|
|
|
|
svg_score: {
|
|
"piano_score_fname":"~/src/cwtest/src/cwtest/cfg/gutim_full/score/temp.csv",
|
|
"cm_score_fname":"~/src/cwtest/src/cwtest/cfg/gutim_full/cm_score.csv",
|
|
"css_fname":"~/src/cwtest/src/cwtest/cfg/gutim_full/score/svg/score.css",
|
|
"out_fname":"~/src/cwtest/src/cwtest/cfg/gutim_full/score/svg/score.html"
|
|
"midi_state_args": {
|
|
"cache_enable_fl": true,
|
|
"cache_block_msg_count": 128,
|
|
"pedal_up_midi_value": 64,
|
|
"pedal_half_min_midi_value": 43,
|
|
"pedal_half_max_midi_value": 45
|
|
}
|
|
},
|
|
|
|
midi_state: {
|
|
"midi_fname": "~/src/currawong/audio/workshop/beck1/record_4/midi.mid",
|
|
"cache_enable_fl": true,
|
|
"args": {
|
|
"cache_enable_fl": true,
|
|
"cache_block_msg_count": 128,
|
|
"pedal_up_midi_value": 64,
|
|
"pedal_half_min_midi_value": 43,
|
|
"pedal_half_max_midi_value": 45
|
|
}
|
|
},
|
|
|
|
csv: {
|
|
fname: "~/src/cwtest/src/cwtest/cfg/gutim_full/cm_score.csv",
|
|
titleL: [ "status","d0","d1" ]
|
|
// titleL: []
|
|
},
|
|
|
|
score_test: {
|
|
score_fname: "/home/kevin/src/currawong/projects/score_proc/temp.csv"
|
|
srate: 48000,
|
|
|
|
parse_fl: true, // do score parsing
|
|
parse_report_fl: true, // report parse
|
|
parse_warn_fl: false, // show parser warnings
|
|
score_fl: true, // do sfscore processing
|
|
score_report_fl: false, // report sfscore
|
|
score_warn_fl: false, // show score warnings
|
|
match_fl: false, // score match test
|
|
track_fl: false, // score track test
|
|
|
|
dyn_ref: [
|
|
{ mark: "silent", level:0, vel:1 },
|
|
{ mark:"pppp-", level:1, vel:3 },
|
|
{ mark:"pppp", level:2, vel:5 },
|
|
{ mark:"pppp+", level:3, vel:7 },
|
|
{ mark:"ppp-", level:4, vel:10 },
|
|
{ mark:"ppp", level:5, vel:15 },
|
|
{ mark:"ppp+", level:6, vel:20 },
|
|
{ mark:"pp-", level:7, vel:25 },
|
|
{ mark:"pp", level:8, vel:30 },
|
|
{ mark:"pp+", level:9, vel:35 },
|
|
{ mark:"p-", level:10,vel:40 },
|
|
{ mark:"p", level:11,vel:45 },
|
|
{ mark:"p+", level:12, vel:50 },
|
|
{ mark:"mp-", level:13, vel:55 },
|
|
{ mark:"mp", level:14, vel:60 },
|
|
{ mark:"mp+", level:15, vel:65 },
|
|
{ mark:"mf-", level:16, vel:70 },
|
|
{ mark:"mf", level:17, vel:75 },
|
|
{ mark:"mf+", level:18, vel:80 },
|
|
{ mark:"f-", level:19, vel:85 },
|
|
{ mark:"f", level:20, vel:90 },
|
|
{ mark:"f+", level:21, vel:95 },
|
|
{ mark:"ff", level:22, vel:100 },
|
|
{ mark:"ff+", level:23, vel:105 },
|
|
{ mark:"fff", level:24, vel:115 },
|
|
{ mark:"fff+", level:25, vel:120 },
|
|
{ mark:"ffff", level:26, vel:125 },
|
|
]
|
|
|
|
sfmatch: {
|
|
|
|
// Generate an example performance
|
|
gen_perf_example:
|
|
{
|
|
enable_fl: false,
|
|
beg_loc_idx: 0,
|
|
loc_cnt: 10
|
|
}
|
|
|
|
maxScWndN: 10, // max size of the score alignment window
|
|
maxMidiWndN: 7, // max counf of the performance (MIDI) alignment window
|
|
init_score_loc: 120, // initial score location
|
|
beg_perf_idx: 0, // first perf. index
|
|
perf_cnt: 7, // must be <= maxMidiWndN
|
|
|
|
// init_score_loc = 0
|
|
perf0 [
|
|
{ muid:0 smpIdx:0 pitch:65 vel:44 },
|
|
{ muid:1 smpIdx:3600 pitch:63 vel:64 },
|
|
{ muid:2 smpIdx:7200 pitch:45 vel:65 },
|
|
{ muid:3 smpIdx:10800 pitch:30 vel:66 },
|
|
{ muid:4 smpIdx:14400 pitch:37 vel:67 },
|
|
{ muid:5 smpIdx:18000 pitch:65 vel:112 },
|
|
{ muid:6 smpIdx:21600 pitch:87 vel:100 },
|
|
{ muid:7 smpIdx:21600 pitch:36 vel:88 },
|
|
{ muid:8 smpIdx:21600 pitch:46 vel:30 },
|
|
{ muid:9 smpIdx:193028 pitch:85 vel:30 },
|
|
{ muid:10 smpIdx:330171 pitch:100 vel:88 },
|
|
{ muid:11 smpIdx:638742 pitch:80 vel:100 },
|
|
]
|
|
|
|
// init_score_loc = 120
|
|
perf: [
|
|
{ muid:0 smpIdx:0 pitch:68 vel:44 },
|
|
{ muid:1 smpIdx:3600 pitch:35 vel:64 },
|
|
{ muid:2 smpIdx:7200 pitch:77 vel:65 },
|
|
{ muid:3 smpIdx:10800 pitch:42 vel:66 },
|
|
{ muid:4 smpIdx:14400 pitch:49 vel:67 },
|
|
{ muid:5 smpIdx:18000 pitch:75 vel:112 },
|
|
{ muid:6 smpIdx:21600 pitch:75 vel:100 },
|
|
{ muid:7 smpIdx:21600 pitch:46 vel:88 },
|
|
{ muid:8 smpIdx:21600 pitch:52 vel:30 },
|
|
{ muid:9 smpIdx:193028 pitch:58 vel:30 },
|
|
{ muid:10 smpIdx:330171 pitch:84 vel:88 },
|
|
{ muid:11 smpIdx:638742 pitch:50 vel:100 },
|
|
]
|
|
|
|
},
|
|
|
|
sftrack: {
|
|
maxScWndN: 10, // max size of the score alignment window
|
|
maxMidiWndN: 7, // max counf of the performance (MIDI) alignment window
|
|
|
|
report_midi_file_fl: false,
|
|
report_track_fl: true,
|
|
print_fl: false,
|
|
backtrack_fl: true
|
|
|
|
perf:{
|
|
enable_fl:true,
|
|
loc_idx: 120,
|
|
midi_fname:"/home/kevin/temp/shiau_uen/record_5/midi.mid"
|
|
}
|
|
}
|
|
},
|
|
|
|
translate_frags:
|
|
{
|
|
//
|
|
//
|
|
// translate_frags IS OBSOLETE. SEE projects/translate_frags.py
|
|
//
|
|
//
|
|
|
|
cur_frag_fname: "~/src/cwtest/src/cwtest/cfg/gutim_full/preset_select/m1_458.txt",
|
|
cur_score_fname: "~/src/cwtest/src/cwtest/cfg/gutim_full/score/temp.csv",
|
|
new_score_fname: "~/src/currawong/projects/score_proc/temp.csv",
|
|
out_frag_fname: "~/src/cwtest/src/cwtest/cfg/gutim_full/preset_select/m1_458_trans.txt",
|
|
cur_score_rpt_fname "~/temp/piano_score_preset_sel_rpt.txt"
|
|
new_score_rpt_fname "~/temp/sfscore_preset_sel_rpt.txt"
|
|
|
|
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: 50.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
|
|
},
|
|
|
|
srate: 48000,
|
|
|
|
dyn_ref: [
|
|
{ mark: "silent", level:0, vel:1 },
|
|
{ mark:"pppp-", level:1, vel:3 },
|
|
{ mark:"pppp", level:2, vel:5 },
|
|
{ mark:"pppp+", level:3, vel:7 },
|
|
{ mark:"ppp-", level:4, vel:10 },
|
|
{ mark:"ppp", level:5, vel:15 },
|
|
{ mark:"ppp+", level:6, vel:20 },
|
|
{ mark:"pp-", level:7, vel:25 },
|
|
{ mark:"pp", level:8, vel:30 },
|
|
{ mark:"pp+", level:9, vel:35 },
|
|
{ mark:"p-", level:10, vel:40 },
|
|
{ mark:"p", level:11, vel:45 },
|
|
{ mark:"p+", level:12, vel:50 },
|
|
{ mark:"mp-", level:13, vel:55 },
|
|
{ mark:"mp", level:14, vel:60 },
|
|
{ mark:"mp+", level:15, vel:65 },
|
|
{ mark:"mf-", level:16, vel:70 },
|
|
{ mark:"mf", level:17, vel:75 },
|
|
{ mark:"mf+", level:18, vel:80 },
|
|
{ mark:"f-", level:19, vel:85 },
|
|
{ mark:"f", level:20, vel:90 },
|
|
{ mark:"f+", level:21, vel:95 },
|
|
{ mark:"ff", level:22, vel:100 },
|
|
{ mark:"ff+", level:23, vel:105 },
|
|
{ mark:"fff", level:24, vel:115 },
|
|
{ mark:"fff+", level:25, vel:120 },
|
|
{ mark:"ffff", level:26, vel:125 },
|
|
]
|
|
|
|
|
|
}
|
|
|
|
}
|