.module KS; {------------------------------------------------------------------------ KS v0.1 by Xjn (Christian Oncken) www.urbanjazznaturals.com/xjn www.mp3.com/xjn www.booyaka.com/~oncken BASED ON: Ethan's KSGen availiable on the groups page, and Noah's template and midi code. Slam the two together and this is what you get! controllers are 1, 2, and 3. ------------------------------------------------------------------------} .include <..\template\system.k>; .include <..\template\midi.k>; .include <..\template\setup.dsp>; .include <..\KSGen\KSGen.k>; .global handle_MIDI_controller; .global newsound; .global killsound; .external process_midi; .global a_KSParams; .global p_KSParams; .global v_GenData; .external KSGen; { signal processing variables here } { internal variables } .var last_input; .var last_outputL; .var last_outputR; .init last_outputL:0; .init last_outputR:0; { parameters here } .var/dm CP1; {Control point 1} .var/dm CP2; {Control point 2} .var/dm CP3; {Control point 3} .var/dm CP4; {uhhhh... } .var/dm a_KSParams[5]; .var/dm p_KSParams; .var/dm v_GenData; .var/dm store; .var/dm freq; .var/dm freqTab[84]; .const L = 1000; {length of wavetable} .var/dm/circ noise1[L]; {circular queue for wavetable} .var/dm/circ gen1[L]; {circular queue for wavetable} .var/dm/circ gen2[L]; {circular queue for wavetable} .var/dm ptr_gen1; .var/dm ptr_gen2; { do any dynamic memory/variable initializing you need to here } init_params: .init freqTab:; i0 = ^freqTab; L0 = 0; m0 = 1; .init noise1:; {init} i7 = ^noise1; L7 = %noise1; m7 = 1; i3 = ^gen1; L3 = %gen1; m3 = 1; i4 = ^gen2; L4 = %gen2; m4 = 1; dm(ptr_gen1) = i3; dm(a_KSParams +1) = i3; cntr = L7; do fill until ce; ax0 = dm(i7, m7); dm(i3, m3) = ax0; fill: dm(i4, m4) = ax0; ax0 = 1; dm(CP1) = ax0; ax0 = 400; dm(freq) = ax0; ax0 = 0x4000; dm(CP2) = ax0; ax0 = 0x4000; dm(CP3) = ax0; nop; nop; nop; rts; { command loop - check for incoming data on serial port } main_loop: ar = dm (CHAR_WAITING_FLAG); { check serial port for MIDI data } none = pass ar; if ne jump main_loop; call process_midi; { if MIDI byte received } jump main_loop; { SPORT0 interrupt handler -- this is called at 44.1KHz } input_samples: ena sec_reg; { use shadow register bank } my0 = dm(rx_buf +1); { read a/d converters } my1 = dm(rx_buf +2); { leave left/right values in my0,my1 } {----------------------KS------------------------} M0 = 0; M1 = 1; M6 = 0; M7 = 1; ax0 = dm(CP1); dm(a_KSParams) = ax0; i1 = dm(a_KSParams +1); ax0 = i1; dm(a_KSParams +1) = ax0; ax0 = dm(freq); dm(a_KSParams +2) = ax0; ax0 = dm(CP2); dm(a_KSParams +3) = ax0; ax0 = dm(CP3); dm(a_KSParams +4) = ax0; i0 = ^a_KSParams; dm(p_KSParams) = i0; call KSGen; mr1 = dm(v_GenData); ax0 = mr1; my0 = ax0; {output} my1 = ax0; {in mono for now...} {--------------------------------END------------------------------------} dm(tx_buf+ 1)=my0; { write d/a converters } dm(tx_buf+ 2)=my1; { write left/right values from my0, my1 } { save output value (for possible feedback) } dm(last_outputL)=mr0; dm(last_outputR)=mr1; thatwasfun: rti; { Use MIDI note number.....euh ---------------------------- } newsound: ax1 = dm(midi_ch); ax0 = dm(midi_onnote); i0 = ^freqTab; {ok... get the frequency of the note } L0 = 0; ay0 = 83; m0 = ay0; ar = ay0 - ax0; if lt jump toohigh; m0 = ax0; toohigh: modify(i0, m0); m0 = 0; ax1 = dm(i0, m0); dm(freq) = ax1; {store it in freq} {now reinitialize the noise buffer...} i7 = ^noise1; L7 = %noise1; i3 = ^gen1; L3 = %gen1; m0 = 1; m7 = 1; cntr = L7; do refill until ce; ax0 = dm(i7, m7); dm(i3, m0) = ax0; refill: dm(i4, m7) = ax0; i3 = ^gen1; dm(a_KSParams +1) = i3; rts; { remove a sound from the sound queue ---------------------------------- } killsound: i3 = ^gen1; dm(a_KSParams +1) = i3; rts; { Here is where MIDI messages are used to set variables in your Effect! } handle_MIDI_controller: ax1 = dm(midi_cont); ar = dm(midi_val); ay1 = 1;none = ax1-ay1;if eq jump set_CP1; ay1 = 2;none = ax1-ay1;if eq jump set_CP2; ay1 = 3;none = ax1-ay1;if eq jump set_CP3; ay1 = 4;none = ax1-ay1;if eq jump set_CP4; rts; set_CP1: ar = dm(midi_val); sr = lshift ar by -6 (lo); dm(CP1) = sr0; rts; set_CP2: ax0 = dm(midi_val); ay0 = 64; ar = ax0 - ay0; mx0 = ar; my0 = 0x0100; mr = mx0 * my0 (ss); dm(CP2) = mr0; rts; set_CP3: ax0 = dm(midi_val); ay0 = 64; ar = ax0 - ay0; mx0 = ar; my0 = 0x0100; mr = mx0 * my0 (ss); dm(CP3) = mr0; rts; set_CP4: ar = dm(midi_val); dm(CP4) = ar; rts; .endmod;