{

  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,

      circQueueEleCnt: 65536,
      circQueueFl: false,

      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: 64,
	 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 },
         ]


    }
    
}
