From e0d0c775716803c35ab0800692c2009004c681c6 Mon Sep 17 00:00:00 2001 From: Guillaume Riou Date: Mon, 31 Mar 2014 13:16:47 -0400 Subject: First commit. --- squelette_synth_midi.ino | 97 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 squelette_synth_midi.ino diff --git a/squelette_synth_midi.ino b/squelette_synth_midi.ino new file mode 100644 index 0000000..963101a --- /dev/null +++ b/squelette_synth_midi.ino @@ -0,0 +1,97 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define CONTROL_RATE 256 + +int tableChange =0; +Oscil nco(SAW256_DATA), nco_det(SAW256_DATA); +Oscil lfo(SIN256_DATA); +ADSR adsr; +int noteOnn = 1; +float lastFreq = 0.0; +int noteOnBuffer[4]; +int bufferIndex = 0; +LowPassFilter lpf; + +void handleNoteOn(byte channel, byte note, byte velocity){ + //If velocity is 0, the noteOn message is equivalent to a noteOff message. + if(velocity == 0){ + handleNoteOff(channel,note,velocity); + return; + } + + for(int i = 3; i> 0 ; i --){ + noteOnBuffer[i] = noteOnBuffer[i-1]; + } + + noteOnBuffer[0] = note; + jouerNote(note); +} + +void jouerNote(byte note){ + noteOnn = 1; + lastFreq = mtof(note); + nco.setFreq(lastFreq); + + adsr.noteOn(); +} + +void handleNoteOff(byte channel, byte note, byte velocity){ + int i =0; + while(i<3 && noteOnBuffer[i] != note){ + i ++; + } + while(i < 3){ + noteOnBuffer[i] = noteOnBuffer[i+1]; + i+=1; + } + if(i < 4){ + noteOnBuffer[3] = -1; + } + if(noteOnBuffer[0] != -1){ + jouerNote(noteOnBuffer[0]); + }else{ + noteOnn = 0; + adsr.noteOff(); + } +} + +void setup(){ + MIDI.setHandleNoteOn(handleNoteOn); + MIDI.setHandleNoteOff(handleNoteOff); + nco.setFreq(400); + startMozzi(CONTROL_RATE); + MIDI.begin(); + lfo.setFreq(1); + for(int i = 0; i<3; i++){ + noteOnBuffer[i] = -1; + } + adsr.setADLevels(255,210); + adsr.setTimes(188,345,65000,345); + adsr.setSustainLevel(255); + lpf.setResonance(156); +} + +void updateControl(){ + int lfoNext = lfo.next(); + nco_det.setFreq(lastFreq+(lfoNext*0.02f)); + MIDI.read(); + adsr.update(); + lpf.setCutoffFreq(255*adsr.next()>>8); +} + +int updateAudio(){ + //adsr.next(); + return (int)(adsr.next()*(lpf.next((nco.next()+nco_det.next())>>2)))>>4; +} + +void loop(){ + audioHook(); +} -- cgit v1.3