{
  
  base_dir:    "~/src/caw/examples/io",                  // Base project directory. See 'sine_file_01' below.
  io_dict:     "~/src/caw/src/caw/cfg/io.cfg"            // Runtime configuration file.
  proc_dict:   "~/src/caw/src/libcw/flow/proc_dict.cfg", // Processor class definition file.
  udp_dict:    "~/src/caw/src/libcw/flow/udp_dict.cfg",  // User defined proc files 
    
  programs: {

    ex_00_rt_sine: {

      dur_limit_secs:5.0,

      network: {
      
        procs: {
	  osc: { class:sine_tone, args:{ hz:500.0 }},
	  aout:{ class:audio_out, in:{ in:osc.out }, args:{ dev_label:"main"} }
	}
      }
    }

    // Demonstrate a simple two processor network.
    ex_01_sine_file: {

      non_real_time_fl:true,
      dur_limit_secs:5.0,

      network: {

        procs: {
          osc: { class: sine_tone },
          af:  { class: audio_file_out, in: { in:osc.out } args:{  fname:"$/out.wav"} }
        } 
      }          
    }


    // Demonstrate a simple signal processing network
    ex_02_mod_sine: {

      non_real_time_fl:true,
      dur_limit_secs:5.0,

      network: {

        procs: {
          lfo:   { class: sine_tone, args:{ hz:3, dc:440, gain:110 }}
          sh:    { class: sample_hold,            in:{ in:lfo.out } }
          osc:   { class: sine_tone, preset:mono, in:{ hz:sh.out } },         
          af:    { class: audio_file_out,         in: { in:osc.out } args:{  fname:"$/out.wav"} }
        }
      }
    }


    // Demonstrate applying a preset at initialization time.
    ex_03_presets: {

      non_real_time_fl:true,
      dur_limit_secs:5.0,
      preset: "a",

       network: {

        procs: {
          lfo:   { class: sine_tone, args:{ hz:3, dc:440, gain:110 }}
          sh:    { class: sample_hold,    in:{ in:lfo.out } }
          osc:   { class: sine_tone,      in:{ hz:sh.out } },         
          af:    { class: audio_file_out, in: { in:osc.out } args:{  fname:"$/out.wav"} }
        }

        presets:
        {
	  a: { lfo: { hz:1.0, dc:880 }, osc: { gain:0.95 } },
	  b: { lfo: { hz:2.0, dc:220 }, osc: { gain:0.75 } },
	  c: { lfo: a880 },  // apply a the sine_tone class preset 'a880'
	  d: [ a,b,0.5 ]     // apply a dual preset by interpolating midway between preset 'a' and 'b'.
          
        }
      }
    }

    // Demonstrate the `print` processor and event programming.
    ex_04_program: {
    
        non_real_time_fl:true,
        dur_limit_secs: 10.0,
	
	network {
	  procs: {
	      tmr:   { class: timer,                               args:{ period_ms:1000.0 }},
	      cnt:   { class: counter,  in: { trigger:tmr.out },   args:{ min:0, max:3, inc:1, init:0, mode:modulo } },
	      print: { class: print,    in: { in:cnt.out, eol_fl:cnt.out }, args:{ text:["my","count"] }}
	  }
	}
      }

    // Demonstrate 'mult' inputs.
    ex_05_mult_inputs: {
    
        non_real_time_fl:true,
        dur_limit_secs: 10.0,
	
	network: {
	  procs: {
	      tmr:   { class: timer,                               args:{ period_ms:1000.0 }},
	      cnt:   { class: counter,  in: { trigger:tmr.out },   args:{ min:0, max:3, inc:1, init:0, mode:modulo } },
              numb:  { class: number,                              args:{ in:3 }},
              sum:   { class: add,      in: { in0:cnt.out, in1:numb.out } },
	      print: { class: print,    in: { in0:cnt.out, in1:sum.out, eol_fl:sum.out }, args:{ text:["cnt","add","count"] }}
	  }
	}
      }

      
   // Demonstrate different forms of the in-stmt
   ex_06_mult_conn: {
   
     non_real_time_fl:true,
     dur_limit_secs: 5.0,

     network: {
       procs: {
         // Create an oscillator with a single audio output containing 6 channels.
	 // Each of the channels is a different frequency.
         osc:    { class: sine_tone, args: { ch_cnt:6, hz:[110,220,440,880,1760, 3520] }},
	 
	 // Split the single audio signal into three signals
         split:  { class: audio_split, in:{ in:osc.out }, args: { select:[ 0,0, 1,1, 2,2 ] } },
         
         // Create merge.in0,in1,in2 by iterating across all outputs of 'split'.
         merge_a: { class: audio_merge, in:{ in_:split.out_ } },
         af_a:    { class: audio_file_out, in:{ in:merge_a.out },  args:{ fname:"$/out_a.wav" }}
      
        // Create merge.in0,in1 and connect them to split.out0 and split.out1
        merge_b:  { class: audio_merge, in:{ in_:split.out0_2 } },
        af_b:     { class: audio_file_out, in:{ in:merge_b.out },  args:{ fname:"$/out_b.wav" }}
      
        // Create merge.in0,in1 and connect them both to split.out1
        merge_c:  { class: audio_merge, in:{ in0_2:split.out1 } },
        af_c:     { class: audio_file_out, in:{ in:merge_c.out },  args:{ fname:"$/out_c.wav" }}
         
       }
     } 
   }


      // Demonstrate creating processors with explicit sfx-ids and connecting to them with a single in-stmt.
      ex_07_proc_suffix: {
        non_real_time_fl:true,
        dur_limit_secs: 5.0,

        network: {
          procs: {
            osc:    { class: sine_tone, args: { ch_cnt:6, hz:[110,220,440,880,1760, 3520] }},
            split:  { class: audio_split, in:{ in:osc.out }, args: { select:[ 0,0, 1,1, 2,2 ] } },

	    // Create 3 audio gain controls with explicit sfx-ids
            g0: { class:audio_gain, in:{ in:split0.out0 }, args:{ gain:0.9} },
            g1: { class:audio_gain, in:{ in:split0.out1 }, args:{ gain:0.5} },
            g2: { class:audio_gain, in:{ in:split0.out2 }, args:{ gain:0.1} },

	    // Create audio-merge inputs and connect them to 3 consecutive gain controls
	    // by iterating the in-stmt over the source proc sfx-id.
            merge: { class: audio_merge, in:{ in_:g_.out } },
            af:    { class: audio_file_out, in:{ in:merge.out },  args:{ fname:"$/out_a.wav" }}


         }
       } 
     }

   // Demonstrate instantiating 'mult' variables from the an 'args' statement.
    ex_08_mix: {

      non_real_time_fl:true,
      dur_limit_secs:5.0,
      
      network: {

        procs: {
          osc0:  { class: sine_tone, args: { hz:110 } },
	  osc1:  { class: sine_tone, args: { hz:220 } },
	  gain:  { class: number,    args: { in:0.5f } },

	  // Instantiate gain:0 and gain:1 to control the input gain of in:0 and in:1.
	  mix:   { class: audio_mix, in: { in_:osc_.out }, args:{ igain0:[0.8, 0], igain1:[0, 0.2] } },
          af:    { class: audio_file_out, in: { in:mix.out } args:{  fname:"$/out.wav"} }
        } 
      }          
    }


   // Demonstrate a network with a polyphonic subnet.
   ex_09_homog_poly: {
   
    non_real_time_fl:true,
     dur_limit_secs: 5.0,

     network: {

        procs: {

          g_list:  { class: list, args: { in:0, list:[ 110f,220f,440f ]}},
	  dc_list: { class: list, args: { in:0, list:[ 220f,440f,880f ]}},
	  
          osc_poly: {
	    class: poly,
	    
	    // Create 3 instances of 'network' and run them in concurrently.
	    args: { count:3, parallel_fl:true },  
	   
	    network: {
	      procs: {
	        lfo:  { class: sine_tone,   in:{ _.dc:_.dc_list.value_, _.gain:_.g_list.value_ }  args: { ch_cnt:1, hz:3 }},
	        sh:   { class: sample_hold, in:{ in:lfo.out }},
	        osc:  { class: sine_tone,   in:{ hz: sh.out }},
	      }
	    }       	    
	  }

          // Iterate over the instances of `osc_poly.osc_.out` to create one `audio_merge`
	  // input for every output from the polyphonic network.
	  merge: { class: audio_merge,    in:{ in_:osc_poly.osc_.out}, args:{ gain:1, out_gain:0.5 }},
	  af:    { class: audio_file_out, in:{ in:merge.out }          args:{ fname:"$/out.wav"} }
        }
      }
    }

   // Demonstrate a network with poly network with different subnets.
   ex_10_hetero_poly: {
   
    non_real_time_fl:true,
     dur_limit_secs: 5.0,

     network: {

        procs: {

          g_list:  { class: list, args: { in:0, list:[ 110f,220f,440f ]}},
	  dc_list: { class: list, args: { in:0, list:[ 220f,440f,880f ]}},
	  
          osc_poly: {
	    class: poly,
	    
	    args: { parallel_fl:true },  
	   
	    network: [
	    
	      // network 0
	      {
	        procs: {
	          lfo:  { class: sine_tone,   in:{ _.dc:_.dc_list.value_, _.gain:_.g_list.value_ }  args: { ch_cnt:1, hz:3 }},
	          sh:   { class: sample_hold, in:{ in:lfo.out }},
	          osc:  { class: sine_tone,   in:{ hz: sh.out }},
	        }
	      },
	      
	      // network 1
	      {
	        procs: {
		  oscil:  { class: sine_tone,   args:{ hz:55 }},
		}
	      }
	    ]       	    
	  }

          // Iterate over the instances of `osc_poly.osc_.out` to create one `audio_merge`
	  // input for every output from the polyphonic network.
	  merge: { class: audio_merge,    in:{ in0:osc_poly.osc.out, in1:osc_poly.oscil1.out}, args:{ gain:1, out_gain:0.5 }},
	  af:    { class: audio_file_out, in:{ in:merge.out }          args:{ fname:"$/out.wav"} }
        }
      }
    }


    ex_11_feedback: {
          non_real_time_fl:true,
          max_cycle_count:   10,

          network: {
            procs: {
	      a:   { class: number,  log:{out:0},  args:{ in:1 }},
	      b:   { class: number,  log:{out:0 }, args:{ in:2 }},
	      
	      add: { class: add,  in: { in0:a.out, in1:b.out }, out: { out:b.in }, 
	                          log:{out:0} }
	    }
	  }
	},


    ex_11a_feedback: {
          non_real_time_fl:true,
          max_cycle_count:    10,
	  print_network_fl: true,

          network: {
            procs: {
	      a:   { class: number,  log:{out:0}, args:{ in:1 }},
	      b:   { class: reg,     in:{ in:a.in }, log:{out:0} },
	      
	      add: { class: add,  in: { in0:a.out, in1:b.out }, out: { out:b.in }, 
	                          log:{out:0},   args:{ otype:int }}
	    }
	  }
	},

     ex_12_user_defined_proc : {
          non_real_time_fl: true,
          dur_limit_secs:   5,
	  
          network: {
            procs: {
	      sub_osc: { class: mod_osc  args:{ hz:220, hz_mod_hz:3, hz_mod_depth:55, amp_mod_hz:2, amp_mod_depth:0.5 }},	      
	      af:      { class: audio_file_out, in:{ in:sub_osc.mo_out }
	                        args:{ fname:"$/out.wav"}}	     
	    }
	  }
       }



    sample_gen_13: {
      non_real_time_fl:false,
      dur_limit_secs: 30.0,
      
      network: {
        procs: {

	  tempo:    { class:number, args:{ in:2000.0 } },
	  note_dur: { class:number, args:{ in:1000.0 } },

	  tmrA: { class: timer,   in:{ period_ms:tempo.out } },
	  cntA: { class: counter, in:{ trigger:tmrA.out }, args:{init:1, min:1, max:128, inc:7, repeat_fl:false, out_type:uint }},

	  tmrB: { class: timer,  in:{ delay_ms:note_dur.out, period_ms:tempo.out } },
	  zero: { class: number, in:{ trigger:tmrB.out },      args:{ in:0 }},

	  stop_cnt: { class: counter, in:{ trigger:zero.out }, args:{min:0, max:19, inc:1, repeat_fl:false } },
	  stop: { class: halt, in:{ in:stop_cnt.upr_lim }},

	  vel: { class: number, in:{ in0:cntA.out, in1:zero.out }, args:{ out_type:uint }},

	  log: { class:print, in:{ in0:stop_cnt.out, in1:vel.out, eol_fl:vel.out },args:{ text:[ "i", "d1", ""] }},

	  

          note_msg: { class:midi_msg, in:{d1:vel.out, trigger:vel.out }, args:{ch:0, status:144, d0:60}},
	  damp_msg: { class:midi_msg,                                    args:{ch:0, status:176, d0:64}},
	  mmerge:   { class:midi_merge, in:{ in0:note_msg.out, in1:damp_msg.out }},
          mout:     { class:midi_out    in:{ in:mmerge.out} , args:{ dev_label:"MIDIFACE 2x2", port_label:"MIDIFACE 2x2 Midi Out 1" }}

	  ain:   { class: audio_in,                           args:{ dev_label:"main" }},
	  split: { class: audio_split,    in:{ in:ain.out }   args:{ select: [0,0, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1] }},
	  mark:  { class: audio_marker,   in:{ in:split.out0, trigger:vel.out }},
	  af:    { class: audio_file_out, in:{ in:mark.out }, args:{ fname:"~/temp/samples1.wav"}},	  
	  aout:  { class: audio_out,      in:{ in:ain.out },  args:{ dev_label:"main"}},
	  
	}
      }
    },

    sample_gen_14: {

      non_real_time_fl:false,

      network: {
        procs: {
	  tempo: { class: number, args:{ in:1500.0 } },
	  tmrA:  { class: timer,   in:{ period_ms:tempo.out } },
	  cntA:  { class: counter, in:{ trigger:tmrA.out },              args:{ init:1, min:1, max:128, inc:7, repeat_fl:false, out_type:uint }},
	  log:   { class: print,   in:{ in0:cntA.out, eol_fl:cntA.out }, args:{ text:["x",""] } },
	  stop:  { class: halt,    in:{ in:cntA.upr_lim } }

	}
      }
    },

    sample_gen_15: {
       non_real_time_fl:false,
       network: {
         procs: {
	   mf:   { class: midi_file, args:{ csv_fname:"~/temp/wt3/21_sample.csv" }},
	   mout: { class: midi_out  in:{ in:mf.out }, args:{ dev_label:"MIDIFACE 2x2", port_label:"MIDIFACE 2x2 Midi Out 1" }},
	   stop: { class: halt,     in:{ in:mf.done_fl }}		       

	   ain:   { class: audio_in,                           args:{ dev_label:"main" }},
	   split: { class: audio_split,    in:{ in:ain.out }   args:{ select: [0,0, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1] }},
	   af:    { class: audio_file_out, in:{ in:split.out0 }, args:{ fname:"~/temp/wt3/wav/21_samples.wav"}},	  
	   aout:  { class: audio_out,      in:{ in:ain.out },  args:{ dev_label:"main"}},

	 }
       }    		   
    },

    midi_voice_16: {
       non_real_time_fl:false,
       network: {
         procs: {
	   mf:   { class: midi_file, args:{ csv_fname:"~/temp/temp_midi.csv" }},
	   voc:  { class: midi_voice, in: { in:mf.out } },	   
	   stop: { class: halt,       in: { in:mf.done_fl }}

	   af:    { class: audio_file_out, in:{ in:voc.out }, args:{ fname:"~/temp/wt/wav/samples.wav"}},	  

	 }
       }    		   
    },


    audio_mix_17: {

      network: {
      
        procs: {
	  oscA: { class:sine_tone, args:{ hz:100.0 }},
	  oscB: { class:sine_tone, args:{ hz:101.0 }},
	  amix: { class:audio_mix, in{ in0:oscA.out, in1:oscB.out }}
	  aout:{ class:audio_out, in:{ in:amix.out }, args:{ dev_label:"main"} }
	}
      }
    }

    poly_voice_18: {
      non_real_time_fl:false,
      dur_limit_secs:10,
      
      network: {
        procs: {

          midi_in: { class:midi_in },

          vctl: { class: poly_voice_ctl, in:{ in:midi_in.out }, args:{ voice_cnt:3  } },

	  voice_poly: {
	    class: poly,
	    args: { count:3 }

	    network: {
	      procs: {
	        voc: { class:midi_voice, in:{ _.in:_.vctl.out_ } out:{ _.done_fl:_.vctl.done_fl_ } },
	      }
	    }
	  }

          asil: { class: audio_silence, args:{ ch_cnt:6 }}, 
	  amix: { class: audio_mix, in:{ in_:voice_poly.voc_.out } },
	  amrg: { class: audio_merge,    in:{ in0:asil.out, in1:amix.out } },

	  aout: { class: audio_out, in:{ in:amrg.out }, args:{ dev_label:"main"}}
	}
      }
    }

    midi_split_19: {
      non_real_time_fl:false,
      dur_limit_secs:10,
      
      network: {
        procs: {

          midi_in: { class:midi_in },
	  ms:      { class:midi_split, in: { in:midi_in.out } },

	  map:     { class: list, in:{in:ms.d0}, args: { cfg_fname:"/home/kevin/temp/map.cfg"}},

	  //mm:      { class:midi_msg, in: {ch:ms.ch, status:ms.status, d1:map.out, trigger:map.out } args:{ d0:60 } },
	  
	  log:     { class: print,     in: { in0:ms.ch, in1:ms.status, in2:ms.d0, in3:map.out, eol_fl:map.out }, args:{ text:["ch","st","d0","d1",""] } },


	}  
      }    
    }
    
    piano_voice_20: {
      non_real_time_fl:false,
      dur_limit_secs:30,
      
      network: {
        procs: {

          midi_in: { class:midi_in },
          vctl: { class: poly_voice_ctl, in:{ in:midi_in.out }, args:{ voice_cnt:3  } },

	  voice_poly: {
	    class: poly,
	    args: { count:3 }

	    network: {
	      procs: {
	        voc: { class:piano_voice, in:{ _.in:_.vctl.out_ },
		                          out:{ _.done_fl:_.vctl.done_fl_ },
					  args:{ wtb_dir:"~/temp/temp_5.json", wtb_instr:"piano", test_pitch:60 } },
	      }
	    }
	  }

          asil: { class: audio_silence, args:{ ch_cnt:6 }}, 
	  amix: { class: audio_mix,   in:{ in_:voice_poly.voc_.out } args:{ igain_:1.0} },
	  asel: { class: audio_split, in:{ in:amix.out }, args:{ select:[0,1] }},
	  amrg: { class: audio_merge, in:{ in0:asil.out, in1:asel.out0, in2:asel.out1 }, args:{ out_gain:2.0 } },
	  aout: { class: audio_out,   in:{ in:amrg.out }, args:{ dev_label:"main"}}
	}
      }
    }

    // Play stereo audio out channels 7&8 of the Scarlett.
    audio_test_21: {
      non_real_time_fl:false,
      dur_limit_secs:10,
      network: {
        procs:  {
	  asil: { class:audio_silence, args:{ ch_cnt:6 }}
	  osc: { class:sine_tone, args:{ hz:440.0, ch_cnt:2 }},
	  amrg: { class:audio_merge, in:{ in0:asil.out, in1:osc.out }, args:{ out_gain:1 } },
	  amtr: { class:audio_meter, in:{ in:amrg.out }, args:{ rpt_ms:500 }},
	  aout:{ class:audio_out, in:{ in:amrg.out }, args:{ dev_label:"main"} }

	}
      }
    }

    piano_voice_22: {
      non_real_time_fl:false,
      //dur_limit_secs:300,
      
      network: {
        procs: {


	  mf:   { class: midi_file, args:{ csv_fname:"~/temp/all_midi.csv" }},
	  stop: { class: halt,     in:{ in:mf.done_fl }}		       
          vctl: { class: poly_voice_ctl, in:{ in:mf.out }, args:{ voice_cnt:3  } },

	  voice_poly: {
	    class: poly,
	    args: { count:3 }

	    network: {
	      procs: {
	        voc: { class:piano_voice, in:{ _.in:_.vctl.out_ },
		                          out:{ _.done_fl:_.vctl.done_fl_ },
					  args:{ wtb_fname:"~/temp/temp_5.json", wtb_instr:"piano" } },
	      }
	    }
	  }

          asil: { class: audio_silence, args:{ ch_cnt:6 }}, 
	  amix: { class: audio_mix,   in:{ in_:voice_poly.voc_.out }     args:{ igain_:1.0 }},
	  //amrg: { class: audio_merge, in:{ in0:asil.out, in1:amix.out }, args:{ out_gain:1.0 } },
	  aout: { class: audio_out,   in:{ in:amix.out }, args:{ dev_label:"main"}}
	}
      }
    }

    sample_gen_23: {
       non_real_time_fl:false,
       network: {
         procs: {
	   mf:   { class: midi_file, args:{ csv_fname:"~/temp/wt1/21_sample.csv" }},
	   mout: { class: midi_out  in:{ in:mf.out }, args:{ dev_label:"MIDIFACE 2x2", port_label:"MIDIFACE 2x2 Midi Out 1" }},
	   stop: { class: halt,     in:{ in:mf.done_fl }}		       

	   ain:   { class: audio_in,                           args:{ dev_label:"main" }},
	   split: { class: audio_split,    in:{ in:ain.out }   args:{ select: [0,0, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1] }},


	   //af:    { class: audio_file_out, in:{ in:split.out0 }, args:{ bits:0, fname:"~/temp/test.wav"}},	  

	   asil: { class: audio_silence, args:{ ch_cnt:6 }}, 
	   amrg: { class: audio_merge, in:{ in0:asil.out, in1:split.out0 }, args:{ out_gain:1.0 } },	   
	   aout: { class: audio_out,   in:{ in:amrg.out }, args:{ dev_label:"main"}}
	 }
       }    		   
    },


  }
}