diff --git a/config.h b/config.h index 3481c77..35c9b0a 100644 --- a/config.h +++ b/config.h @@ -34,8 +34,9 @@ #define TEENSY_AUDIO_BOARD 1 #define VOLUME 0.3 #define DEFAULT_MIDI_CHANNEL MIDI_CHANNEL_OMNI -#define AUDIO_MEM 4 +#define AUDIO_MEM 300 #define SAMPLE_RATE 44100 +#define REDUCE_LOUDNESS 0 #if !defined(__MK66FX1M0__) // check for Teensy-3.6 #define NVOCIES 11 // No? @@ -85,4 +86,3 @@ #define EEPROM_MASTER_VOLUME_ADDR 2 #define EEPROM_VOLUME_RIGHT_ADDR 3 #define EEPROM_VOLUME_LEFT_ADDR 4 - diff --git a/mdaEPiano.cpp b/mdaEPiano.cpp index f93c094..843db9a 100644 --- a/mdaEPiano.cpp +++ b/mdaEPiano.cpp @@ -118,7 +118,6 @@ mdaEPiano::mdaEPiano() // mdaEPiano::mdaEPiano(audioMasterCallback audioMaster) voice[v].env = 0.0f; voice[v].dec = 0.99f; //all notes off } - notes[0] = EVENTS_DONE; volume = 0.2f; muff = 160.0f; sustain = activevoices = 0; @@ -335,61 +334,57 @@ float mdaEPiano::getParameter(int32_t index) { void mdaEPiano::process(int16_t *outputs_r, int16_t *outputs_l, int32_t sampleFrames) { - int32_t event = 0, frame = 0, frames, v; + int16_t v; float x, l, r, od = overdrive; int32_t i; + int16_t frame; - while (frame < sampleFrames) + for (frame = 0; frame < sampleFrames; frame++) { - frames = notes[event++]; - if (frames > sampleFrames) frames = sampleFrames; - frames -= frame; - frame += frames; - - while (--frames >= 0) + VOICE *V = voice; + l = r = 0.0f; + for (v = 0; v < activevoices; v++) { - VOICE *V = voice; - l = r = 0.0f; + V->frac += V->delta; //integer-based linear interpolation + V->pos += V->frac >> 16; + V->frac &= 0xFFFF; + if (V->pos > V->end) V->pos -= V->loop; + //i = waves[V->pos]; + //i = (i << 7) + (V->frac >> 9) * (waves[V->pos + 1] - i) + 0x40400000; //not working on intel mac !?! + //x = V->env * (*(float *)&i - 3.0f); //fast int->float + //x = V->env * (float)i / 32768.0f; + i = waves[V->pos] + ((V->frac * (waves[V->pos + 1] - waves[V->pos])) >> 16); + //x = V->env * (float)i / 32768.0f; - for (v = 0; v < activevoices; v++) - { - V->frac += V->delta; //integer-based linear interpolation - V->pos += V->frac >> 16; - V->frac &= 0xFFFF; - if (V->pos > V->end) V->pos -= V->loop; - //i = waves[V->pos]; - //i = (i << 7) + (V->frac >> 9) * (waves[V->pos + 1] - i) + 0x40400000; //not working on intel mac !?! - //x = V->env * (*(float *)&i - 3.0f); //fast int->float - //x = V->env * (float)i / 32768.0f; - i = waves[V->pos] + ((V->frac * (waves[V->pos + 1] - waves[V->pos])) >> 16); - x = V->env * (float)i / 32768.0f; - - V->env = V->env * V->dec; //envelope - - if (x > 0.0f) { - x -= od * x * x; //overdrive - if (x < -V->env) x = -V->env; - } //+= 0.5f * x * x; } - - l += V->outl * x; - r += V->outr * x; - - V++; - } - tl += tfrq * (l - tl); //treble boost - tr += tfrq * (r - tr); - r += treb * (r - tr); - l += treb * (l - tl); - - lfo0 += dlfo * lfo1; //LFO for tremolo and autopan - lfo1 -= dlfo * lfo0; - l += l * lmod * lfo1; - r += r * rmod * lfo1; //worth making all these local variables? - - outputs_r[sampleFrames - frames] = static_cast(r * 0x8000); - outputs_l[sampleFrames - frames] = static_cast(l * 0x8000); + V->env = V->env * V->dec; //envelope + + //if(x>0.0f) { x -= od * x * x; if(x < -V->env) x = -V->env; } //+= 0.5f * x * x; } //overdrive + + //l += V->outl * x; + //r += V->outr * x; + + V++; } + /* + tl += tfrq * (l - tl); //treble boost + tr += tfrq * (r - tr); + r += treb * (r - tr); + l += treb * (l - tl); + + lfo0 += dlfo * lfo1; //LFO for tremolo and autopan + lfo1 -= dlfo * lfo0; + l += l * lmod * lfo1; + r += r * rmod * lfo1; //worth making all these local variables? + + outputs_l[v] = int16_t(l * 0xFFFF) >> REDUCE_LOUDNESS; + outputs_r[v] = int16_t(r * 0xFFFF) >> REDUCE_LOUDNESS; + */ + + outputs_l[v] = i >> REDUCE_LOUDNESS; + outputs_r[v] = i >> REDUCE_LOUDNESS; + } + /* if (frame < sampleFrames) { if (activevoices == 0 && programs[curProgram].param[4] > 0.5f) @@ -397,16 +392,20 @@ void mdaEPiano::process(int16_t *outputs_r, int16_t *outputs_l, int32_t sampleFr lfo0 = -0.7071f; //reset LFO phase - good idea? lfo1 = 0.7071f; } - int32_t note = notes[event++]; - int32_t vel = notes[event++]; - noteOn(note, vel); } - } + */ if (fabs(tl) < 1.0e-10) tl = 0.0f; //anti-denormal if (fabs(tr) < 1.0e-10) tr = 0.0f; for (v = 0; v < activevoices; v++) if (voice[v].env < SILENCE) voice[v] = voice[--activevoices]; - notes[0] = EVENTS_DONE; //mark events buffer as done + + /* + for (v = 0; v < sampleFrames; v++) + { + outputs_r[v] = int16_t(o0[v] * 0xFFFF) >> REDUCE_LOUDNESS; + outputs_l[v] = int16_t(o1[v] * 0xFFFF) >> REDUCE_LOUDNESS; + } + */ } void mdaEPiano::noteOn(int32_t note, int32_t velocity) @@ -439,7 +438,7 @@ void mdaEPiano::noteOn(int32_t note, int32_t velocity) if (note > 60) l += stretch * (float)k; //stretch s = size; - //if(velocity > 40) s += (VstInt32)(sizevel * (float)(velocity - 40)); - no velocity to hardness in ePiano + //if(velocity > 40) s += (int32_t)(sizevel * (float)(velocity - 40)); - no velocity to hardness in ePiano k = 0; while (note > (kgrp[k].high + s)) k += 3; //find keygroup @@ -489,20 +488,15 @@ void mdaEPiano::noteOn(int32_t note, int32_t velocity) bool mdaEPiano::processMidiMessage(uint8_t type, uint8_t data1, uint8_t data2) { float* param = programs[curProgram].param; - int32_t npos = 0; switch (type) { case 0x80: //note off - notes[npos++] = 0; //delta - notes[npos++] = data1 & 0x7F; //note - notes[npos++] = 0; //vel + noteOn(data1 & 0x7F, 0); break; case 0x90: //note on - notes[npos++] = 0; //delta - notes[npos++] = data1 & 0x7F; //note - notes[npos++] = data2 & 0x7F; //vel + noteOn(data1 & 0x7F, data2 & 0x7F); break; case 0xB0: //controller @@ -527,9 +521,7 @@ bool mdaEPiano::processMidiMessage(uint8_t type, uint8_t data1, uint8_t data2) sustain = data2 & 0x40; if (sustain == 0) { - notes[npos++] = 0; - notes[npos++] = SUSTAIN; //end all sustained notes - notes[npos++] = 0; + noteOn(SUSTAIN, 0); //end all sustained notes } break; @@ -551,11 +543,6 @@ bool mdaEPiano::processMidiMessage(uint8_t type, uint8_t data1, uint8_t data2) default: break; } - if (npos > EVENTBUFFER) - npos -= 3; //discard events if buffer full!! - - notes[npos] = EVENTS_DONE; - return (true); } @@ -639,4 +626,3 @@ bool mdaEPiano::processMidiMessage(uint8_t type, uint8_t data1, uint8_t data2) return 1; } */ - diff --git a/mdaEPiano.h b/mdaEPiano.h index 1ac6853..2a6f5d5 100644 --- a/mdaEPiano.h +++ b/mdaEPiano.h @@ -4,6 +4,7 @@ #define __mdaEPiano__ #include +#include #include #include "config.h" @@ -97,8 +98,6 @@ private: float Fs, iFs; #define EVENTBUFFER 120 - #define EVENTS_DONE 99999999 - int32_t notes[EVENTBUFFER + 8]; //list of delta|note|velocity for current block ///global internal variables KGRP kgrp[34];