The Csound Blog By Jacob Joaquin http://csound.noisepages.com/ jacobjoaquin@gmail.com Key map: s d g h j z x cv b n m, -g -odac sr = 44100 kr = 4410 ksmps = 10 nchnls = 1 0dbfs = 1.0 ; Instrument numbers # define NewKeyMap # 1 # # define Listener # 2 # # define Synth # 3 # ; Master section # define master_tuning # 2 # ; Tune synth # define master_amp # 0.2 # ; Amplitude ; Auto-mapper # define record_table # 100 # ; Table for storing the key map records # define record_parameters # 3 # ; Number of parameters per record ; Record field offsets # define offset_key # 0 # ; ASCII key # define offset_freq # 1 # ; Frequency # define offset_fn # 2 # ; F-table ; Auto-mapper chn_k "record_count", 2 ; Number of records in record table chnset 0, "record_count" ; Initialize to 0 ; Wave tables, used for timbre of synth itemp ftgen 1, 0, 8192, 10, 1 itemp ftgen 2, 0, 8192, 10, 1, 0.5 itemp ftgen 3, 0, 8192, 10, 1, 0.1, 0.2 itemp ftgen 4, 0, 8192, 10, 1, 0, 0.333 itemp ftgen 5, 0, 8192, 10, 1, 0.25, 0.1, 0.05 ; Create and initialize record_table itemp ftgen $record_table, 0, $record_parameters * -1, 10, 0 ; ASCII codes for keys i_z strchar "z" i_s strchar "s" i_x strchar "x" i_d strchar "d" i_c strchar "c" i_v strchar "v" i_g strchar "g" i_b strchar "b" i_h strchar "h" i_n strchar "n" i_j strchar "j" i_m strchar "m" i_comma strchar "," ; Create records for each key map event_i "i", $NewKeyMap, 0, 1, i_z, cpspch(8.00), 2 event_i "i", $NewKeyMap, 0, 1, i_s, cpspch(8.01), 3 event_i "i", $NewKeyMap, 0, 1, i_x, cpspch(8.02), 4 event_i "i", $NewKeyMap, 0, 1, i_d, cpspch(8.03), 5 event_i "i", $NewKeyMap, 0, 1, i_c, cpspch(8.04), 1 event_i "i", $NewKeyMap, 0, 1, i_v, cpspch(8.05), 2 event_i "i", $NewKeyMap, 0, 1, i_g, cpspch(8.06), 3 event_i "i", $NewKeyMap, 0, 1, i_b, cpspch(8.07), 4 event_i "i", $NewKeyMap, 0, 1, i_h, cpspch(8.08), 5 event_i "i", $NewKeyMap, 0, 1, i_n, cpspch(8.09), 1 event_i "i", $NewKeyMap, 0, 1, i_j, cpspch(8.10), 2 event_i "i", $NewKeyMap, 0, 1, i_m, cpspch(8.11), 3 event_i "i", $NewKeyMap, 0, 1, i_comma, cpspch(9.00), 4 ; Turn on listener event_i "i", $Listener, 0, -1 ; Creates a new key map record instr $NewKeyMap ikey = p4 ; ASCII code of key ifreq = p5 ; Frequency itimbre = p6 ; F-table of single cycle wave irecord_count chnget "record_count" ; Get the number of records irecord_count = irecord_count + 1 ; A new record will be added chnset irecord_count, "record_count" ; Update chn "record_count" ; Create a temporary record table itemp ftgen 0, 0, -1 * irecord_count * $record_parameters, 10, 0 ; Copy existing records to temporary table ito_copy = $record_parameters * (irecord_count - 1) i_index = 0 loop_start: iread tab_i i_index, $record_table tabw_i iread, i_index, itemp loop_lt i_index, 1, ito_copy, loop_start ; Create a new blank record table idest ftgen $record_table, 0, -1 * irecord_count * $record_parameters, 10, 0 ; Copy temporary table back over to the new record table tableicopy $record_table, itemp ; Write the new record to the record table i_index = (irecord_count - 1) * $record_parameters tabw_i ikey, i_index + $offset_key, $record_table tabw_i ifreq, i_index + $offset_freq, $record_table tabw_i itimbre, i_index + $offset_fn, $record_table turnoff endin ; Listens for keyboard input, and triggers the synth if a pressed key ; exists in the record table. instr $Listener ; Sense input from keyboard kres, k_keydown sensekey ktrigger changed k_keydown ; Get the number of records in record table irecord_count chnget "record_count" ; Triggering engine if ktrigger == 1 && k_keydown == 1then ; Check key press against each record in record table kindex = 0 loop_start: krecord = kindex * $record_parameters k_key tab krecord + $offset_key, $record_table kfreq tab krecord + $offset_freq, $record_table ktimbre tab krecord + $offset_fn, $record_table ; Trigger synth if key press matches a record if kres == k_key then event "i", $Synth, 0, 0.75, 0.5, kfreq, ktimbre endif loop_lt kindex, 1, irecord_count, loop_start endif endin ; Simple sine wave synth instr $Synth idur = p3 ; Duration iamp = p4 ; Amplitude ifreq = p5 * $master_tuning ; Frequency itimbre = p6 ; F-table of stored single cycle wave irnd random 0.999, 1.001 ; Random frequency varations a1 oscil iamp, ifreq * irnd, itimbre ; Table oscillator aenv linseg 0, 0.005, 1, idur - 0.05, 0 ; Envelope out a1 * aenv * $master_amp ; Output endin e [10 * 60] ; Run for 10 minutes