aboutsummaryrefslogtreecommitdiffstats
path: root/squelette_synth_midi.ino
diff options
context:
space:
mode:
Diffstat (limited to 'squelette_synth_midi.ino')
-rw-r--r--squelette_synth_midi.ino151
1 files changed, 86 insertions, 65 deletions
diff --git a/squelette_synth_midi.ino b/squelette_synth_midi.ino
index 963101a..6e5edf2 100644
--- a/squelette_synth_midi.ino
+++ b/squelette_synth_midi.ino
@@ -7,91 +7,112 @@
#include <tables/sin256_int8.h>
#include <ADSR.h>
#include <LowPassFilter.h>
+#include "pitchbendArray.h"
+
#define CONTROL_RATE 256
-int tableChange =0;
-Oscil <SAW256_NUM_CELLS, AUDIO_RATE> nco(SAW256_DATA), nco_det(SAW256_DATA);
+
+int tableChange = 0;
+
+Oscil <SAW256_NUM_CELLS, AUDIO_RATE> ncoOne(SAW256_DATA),
+ncoTwo(SAW256_DATA), ncoThree(SAW256_DATA);
Oscil <SIN256_NUM_CELLS, CONTROL_RATE> lfo(SIN256_DATA);
ADSR <CONTROL_RATE> adsr;
int noteOnn = 1;
-float lastFreq = 0.0;
+float lastFreq = 0;
int noteOnBuffer[4];
int bufferIndex = 0;
+float pbAmount = 0.0;
+float lastMidiNote = 0.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 handlePitchBend(byte channel, byte lsb, byte msb) {
+
+ pbAmount = pgm_read_float_near(PB_ARRAY+msb);
+ jouerNote(lastMidiNote);
+}
+
+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((float)note);
}
-void jouerNote(byte note){
- noteOnn = 1;
- lastFreq = mtof(note);
- nco.setFreq(lastFreq);
-
- adsr.noteOn();
+void jouerNote(float note) {
+ float totalNote = note + pbAmount;
+ lastFreq = Q16n16_to_float(Q16n16_mtof(float_to_Q16n16(totalNote)));
+ ncoOne.setFreq(lastFreq);
+ lastMidiNote = note;
+ 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 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((float)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 setup() {
+ MIDI.setHandleNoteOn(handleNoteOn);
+ MIDI.setHandleNoteOff(handleNoteOff);
+ MIDI.setHandlePitchBend(handlePitchBend);
+ ncoOne.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 lfoNext = 0;
+void updateControl() {
+ lfoNext = lfo.next();
+ ncoTwo.setFreq(lastFreq + (lfoNext * 0.02f));
+ //version tarrée à virgule fixe.
+ //ncoThree.setFreq((float)(((Q15n0_to_Q15n16((mozziAnalogRead(5)-512))*(float_to_Q15n16(0.004))>>23)*float_to_Q15n16(lastFreq))>>23));
+ 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;
+int updateAudio() {
+ //adsr.next();
+ return (int) (adsr.next()*(lpf.next((ncoOne.next() + ncoTwo.next() + ncoThree.next()) >> 2))) >> 2;
}
-void loop(){
- audioHook();
+void loop() {
+ audioHook();
}
+