Added config.h

Some more fixes for porting to Teensy.
master
Holger Wirtz 6 years ago
parent ed76eaeece
commit e8f37a99be
  1. 17
      MicroMDAPiano.ino
  2. 78
      config.h
  3. 106
      mdaEPiano.cpp
  4. 10
      mdaEPiano.h
  5. 4
      mdaEPianoData.h
  6. 97
      midinotes.h

@ -1,9 +1,22 @@
#include "mdaEPianoData.h"
void setup() { void setup() {
// put your setup code here, to run once: Serial.begin(38400);
delay(500);
Serial.println("START");
Serial.println(sizeof(epianoData),DEC);
uint32_t i;
for(i=0;i<sizeof(epianoData)/sizeof(uint16_t); i++)
{
Serial.print(i,DEC);
Serial.print(F(" "));
Serial.println(epianoData[i], DEC);
}
} }
void loop() { void loop() {
// put your main code here, to run repeatedly: Serial.println("LOOP");
delay(10000);
} }

@ -0,0 +1,78 @@
/*
MicroMDAEpiano
MicroMDAEpiano is a port of the MDAEpiano sound engine
(http://mda.smartelectronix.com/synths.htm) for the Teensy-3.5/3.6 with audio
shield.
(c)2018 H. Wirtz <wirtz@parasitstudio.de>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "midinotes.h"
// ATTENTION! For better latency you have to redefine AUDIO_BLOCK_SAMPLES from
// 128 to 64 in <ARDUINO-IDE-DIR>/cores/teensy3/AudioStream.h
// Initial values
#define USE_ONBOARD_USB_HOST 1
#define TEENSY_AUDIO_BOARD 1
#define VOLUME 0.6
#define DEFAULT_MIDI_CHANNEL MIDI_CHANNEL_OMNI
#define AUDIO_MEM 2
#define SAMPLE_RATE 44100
#if !defined(__MK66FX1M0__) // check for Teensy-3.6
#define MAX_NOTES 11 // No?
#undef USE_ONBOARD_USB_HOST
#else
#define MAX_NOTES 16 // Yes
#endif
// Debug output
#define SERIAL_SPEED 38400
#define DEBUG 1
#define SHOW_MIDI_EVENT 1
#define SHOW_XRUN 1
#define SHOW_CPU_LOAD_MSEC 5000
// Use these with the Teensy Audio Shield
//#define SDCARD_CS_PIN 10
//#define SDCARD_MOSI_PIN 7
//#define SDCARD_SCK_PIN 14
// Use these with the Teensy 3.5 & 3.6 SD card
#define SDCARD_CS_PIN BUILTIN_SDCARD
#define SDCARD_MOSI_PIN 11 // not actually used
#define SDCARD_SCK_PIN 13 // not actually used
// Encoder with button
#define ENC1_PIN_A 14
#define ENC1_PIN_B 15
#define BUT1_PIN 16
#define INITIAL_ENC1_VALUE 0
// EEPROM address
#define EEPROM_OFFSET 0
#define EEPROM_DATA_LENGTH 5
#define EEPROM_CRC32_ADDR EEPROM.length()-sizeof(uint32_t)
#define EEPROM_BANK_ADDR 0
#define EEPROM_VOICE_ADDR 1
#define EEPROM_MASTER_VOLUME_ADDR 2
#define EEPROM_VOLUME_RIGHT_ADDR 3
#define EEPROM_VOLUME_LEFT_ADDR 4

@ -4,12 +4,12 @@
#include <stdio.h> #include <stdio.h>
#include <math.h> #include <math.h>
AudioEffect *createEffectInstance(audioMasterCallback audioMaster) // AudioEffect *createEffectInstance(audioMasterCallback audioMaster)
{ //{
return new mdaEPiano(audioMaster); // return new mdaEPiano(audioMaster);
} //}
mdaEPiano::mdaEPiano(audioMasterCallback audioMaster) : AudioEffectX(audioMaster, NPROGS, NPARAMS) mdaEPiano::mdaEPiano() // mdaEPiano::mdaEPiano(audioMasterCallback audioMaster) : AudioEffectX(audioMaster, NPROGS, NPARAMS)
{ {
Fs = 44100.0f; iFs = 1.0f/Fs; //just in case... Fs = 44100.0f; iFs = 1.0f/Fs; //just in case...
@ -17,7 +17,7 @@ mdaEPiano::mdaEPiano(audioMasterCallback audioMaster) : AudioEffectX(audioMaster
if(programs) if(programs)
{ {
//fill patches... //fill patches...
VstInt32 i=0; int32_t i=0;
fillpatch(i++, "Default", 0.500f, 0.500f, 0.500f, 0.500f, 0.500f, 0.650f, 0.250f, 0.500f, 0.50f, 0.500f, 0.146f, 0.000f); fillpatch(i++, "Default", 0.500f, 0.500f, 0.500f, 0.500f, 0.500f, 0.650f, 0.250f, 0.500f, 0.50f, 0.500f, 0.146f, 0.000f);
fillpatch(i++, "Bright", 0.500f, 0.500f, 1.000f, 0.800f, 0.500f, 0.650f, 0.250f, 0.500f, 0.50f, 0.500f, 0.146f, 0.500f); fillpatch(i++, "Bright", 0.500f, 0.500f, 1.000f, 0.800f, 0.500f, 0.650f, 0.250f, 0.500f, 0.50f, 0.500f, 0.146f, 0.500f);
fillpatch(i++, "Mellow", 0.500f, 0.500f, 0.000f, 0.000f, 0.500f, 0.650f, 0.250f, 0.500f, 0.50f, 0.500f, 0.246f, 0.000f); fillpatch(i++, "Mellow", 0.500f, 0.500f, 0.000f, 0.000f, 0.500f, 0.650f, 0.250f, 0.500f, 0.50f, 0.500f, 0.246f, 0.000f);
@ -29,6 +29,7 @@ mdaEPiano::mdaEPiano(audioMasterCallback audioMaster) : AudioEffectX(audioMaster
setProgram(0); setProgram(0);
} }
/*
if(audioMaster) if(audioMaster)
{ {
setNumInputs(0); setNumInputs(0);
@ -37,8 +38,8 @@ mdaEPiano::mdaEPiano(audioMasterCallback audioMaster) : AudioEffectX(audioMaster
isSynth(); isSynth();
setUniqueID('MDAe'); /// setUniqueID('MDAe'); ///
} }
*/
waves = epianoData; waves = (short*)epianoData;
//Waveform data and keymapping //Waveform data and keymapping
kgrp[ 0].root = 36; kgrp[ 0].high = 39; //C1 kgrp[ 0].root = 36; kgrp[ 0].high = 39; //C1
@ -88,10 +89,10 @@ mdaEPiano::mdaEPiano(audioMasterCallback audioMaster) : AudioEffectX(audioMaster
kgrp[32].pos = 414487; kgrp[32].end = 422408; kgrp[32].loop = 2169; kgrp[32].pos = 414487; kgrp[32].end = 422408; kgrp[32].loop = 2169;
//extra xfade looping... //extra xfade looping...
for(VstInt32 k=0; k<28; k++) for(int32_t k=0; k<28; k++)
{ {
VstInt32 p0 = kgrp[k].end; int32_t p0 = kgrp[k].end;
VstInt32 p1 = kgrp[k].end - kgrp[k].loop; int32_t p1 = kgrp[k].end - kgrp[k].loop;
float xf = 1.0f; float xf = 1.0f;
float dxf = -0.02f; float dxf = -0.02f;
@ -106,7 +107,7 @@ mdaEPiano::mdaEPiano(audioMasterCallback audioMaster) : AudioEffectX(audioMaster
} }
//initialise... //initialise...
for(VstInt32 v=0; v<NVOICES; v++) for(int32_t v=0; v<NVOICES; v++)
{ {
voice[v].env = 0.0f; voice[v].env = 0.0f;
voice[v].dec = 0.99f; //all notes off voice[v].dec = 0.99f; //all notes off
@ -121,13 +122,13 @@ mdaEPiano::mdaEPiano(audioMasterCallback audioMaster) : AudioEffectX(audioMaster
guiUpdate = 0; guiUpdate = 0;
update(); update();
suspend(); // suspend();
} }
void mdaEPiano::update() //parameter change void mdaEPiano::update() //parameter change
{ {
float * param = programs[curProgram].param; float * param = programs[curProgram].param;
size = (VstInt32)(12.0f * param[2] - 6.0f); size = (int32_t)(12.0f * param[2] - 6.0f);
treb = 4.0f * param[3] * param[3] - 1.0f; //treble gain treb = 4.0f * param[3] * param[3] - 1.0f; //treble gain
if(param[3] > 0.5f) tfrq = 14000.0f; else tfrq = 5000.0f; //treble freq if(param[3] > 0.5f) tfrq = 14000.0f; else tfrq = 5000.0f; //treble freq
@ -142,7 +143,7 @@ void mdaEPiano::update() //parameter change
if(param[6] < 0.25f) velsens -= 0.75f - 3.0f * param[6]; if(param[6] < 0.25f) velsens -= 0.75f - 3.0f * param[6];
width = 0.03f * param[7]; width = 0.03f * param[7];
poly = 1 + (VstInt32)(31.9f * param[8]); poly = 1 + (int32_t)(31.9f * param[8]);
fine = param[9] - 0.5f; fine = param[9] - 0.5f;
random = 0.077f * param[10] * param[10]; random = 0.077f * param[10] * param[10];
stretch = 0.0f; //0.000434f * (param[11] - 0.5f); parameter re-used for overdrive! stretch = 0.0f; //0.000434f * (param[11] - 0.5f); parameter re-used for overdrive!
@ -152,11 +153,12 @@ void mdaEPiano::update() //parameter change
void mdaEPiano::resume() void mdaEPiano::resume()
{ {
Fs = getSampleRate(); //Fs = getSampleRate();
Fs=44100;
iFs = 1.0f / Fs; iFs = 1.0f / Fs;
dlfo = 6.283f * iFs * (float)exp(6.22f * programs[curProgram].param[5] - 2.61f); //lfo rate dlfo = 6.283f * iFs * (float)exp(6.22f * programs[curProgram].param[5] - 2.61f); //lfo rate
DECLARE_VST_DEPRECATED (wantEvents) (); //DECLARE_VST_DEPRECATED (wantEvents) ();
} }
@ -166,14 +168,14 @@ mdaEPiano::~mdaEPiano () //destroy any buffers...
} }
void mdaEPiano::setProgram(VstInt32 program) void mdaEPiano::setProgram(int32_t program)
{ {
curProgram = program; curProgram = program;
update(); update();
} }
void mdaEPiano::setParameter(VstInt32 index, float value) void mdaEPiano::setParameter(int32_t index, float value)
{ {
programs[curProgram].param[index] = value; programs[curProgram].param[index] = value;
update(); update();
@ -184,7 +186,7 @@ void mdaEPiano::setParameter(VstInt32 index, float value)
} }
void mdaEPiano::fillpatch(VstInt32 p, char *name, float p0, float p1, float p2, float p3, float p4, void mdaEPiano::fillpatch(int32_t p, char *name, float p0, float p1, float p2, float p3, float p4,
float p5, float p6, float p7, float p8, float p9, float p10,float p11) float p5, float p6, float p7, float p8, float p9, float p10,float p11)
{ {
strcpy(programs[p].name, name); strcpy(programs[p].name, name);
@ -196,17 +198,17 @@ void mdaEPiano::fillpatch(VstInt32 p, char *name, float p0, float p1, float p2,
programs[p].param[10]= p10; programs[p].param[11] = p11; programs[p].param[10]= p10; programs[p].param[11] = p11;
} }
/*
float mdaEPiano::getParameter(VstInt32 index) { return programs[curProgram].param[index]; } float mdaEPiano::getParameter(int32_t index) { return programs[curProgram].param[index]; }
void mdaEPiano::setProgramName(char *name) { strcpy(programs[curProgram].name, name); } void mdaEPiano::setProgramName(char *name) { strcpy(programs[curProgram].name, name); }
void mdaEPiano::getProgramName(char *name) { strcpy(name, programs[curProgram].name); } void mdaEPiano::getProgramName(char *name) { strcpy(name, programs[curProgram].name); }
void mdaEPiano::setBlockSize(VstInt32 blockSize) { AudioEffectX::setBlockSize(blockSize); } void mdaEPiano::setBlockSize(int32_t blockSize) { AudioEffectX::setBlockSize(blockSize); }
bool mdaEPiano::getEffectName(char* name) { strcpy(name, "ePiano"); return true; } bool mdaEPiano::getEffectName(char* name) { strcpy(name, "ePiano"); return true; }
bool mdaEPiano::getVendorString(char* text) { strcpy(text, "mda"); return true; } bool mdaEPiano::getVendorString(char* text) { strcpy(text, "mda"); return true; }
bool mdaEPiano::getProductString(char* text) { strcpy(text, "mda ePiano"); return true; } bool mdaEPiano::getProductString(char* text) { strcpy(text, "mda ePiano"); return true; }
bool mdaEPiano::getOutputProperties(VstInt32 index, VstPinProperties* properties) bool mdaEPiano::getOutputProperties(int32_t index, VstPinProperties* properties)
{ {
if(index<NOUTS) if(index<NOUTS)
{ {
@ -220,7 +222,7 @@ bool mdaEPiano::getOutputProperties(VstInt32 index, VstPinProperties* properties
} }
bool mdaEPiano::getProgramNameIndexed(VstInt32 category, VstInt32 index, char* text) bool mdaEPiano::getProgramNameIndexed(int32_t category, int32_t index, char* text)
{ {
if ((unsigned int)index < NPROGS) if ((unsigned int)index < NPROGS)
{ {
@ -231,7 +233,7 @@ bool mdaEPiano::getProgramNameIndexed(VstInt32 category, VstInt32 index, char* t
} }
bool mdaEPiano::copyProgram(VstInt32 destination) bool mdaEPiano::copyProgram(int32_t destination)
{ {
if(destination<NPROGS) if(destination<NPROGS)
{ {
@ -242,7 +244,7 @@ bool mdaEPiano::copyProgram(VstInt32 destination)
} }
VstInt32 mdaEPiano::canDo(char* text) int32_t mdaEPiano::canDo(char* text)
{ {
if(strcmp(text, "receiveVstEvents") == 0) return 1; if(strcmp(text, "receiveVstEvents") == 0) return 1;
if(strcmp(text, "receiveVstMidiEvent") == 0) return 1; if(strcmp(text, "receiveVstMidiEvent") == 0) return 1;
@ -250,7 +252,7 @@ VstInt32 mdaEPiano::canDo(char* text)
} }
void mdaEPiano::getParameterName(VstInt32 index, char *label) void mdaEPiano::getParameterName(int32_t index, char *label)
{ {
switch (index) switch (index)
{ {
@ -273,7 +275,7 @@ void mdaEPiano::getParameterName(VstInt32 index, char *label)
} }
void mdaEPiano::getParameterDisplay(VstInt32 index, char *text) void mdaEPiano::getParameterDisplay(int32_t index, char *text)
{ {
char string[16]; char string[16];
float * param = programs[curProgram].param; float * param = programs[curProgram].param;
@ -301,7 +303,7 @@ void mdaEPiano::getParameterDisplay(VstInt32 index, char *text)
} }
void mdaEPiano::getParameterLabel(VstInt32 index, char *label) void mdaEPiano::getParameterLabel(int32_t index, char *label)
{ {
switch(index) switch(index)
{ {
@ -314,22 +316,22 @@ void mdaEPiano::getParameterLabel(VstInt32 index, char *label)
} }
void mdaEPiano::guiGetDisplay(VstInt32 index, char *label) void mdaEPiano::guiGetDisplay(int32_t index, char *label)
{ {
getParameterName(index, label); getParameterName(index, label);
strcat(label, " = "); strcat(label, " = ");
getParameterDisplay(index, label + strlen(label)); getParameterDisplay(index, label + strlen(label));
getParameterLabel(index, label + strlen(label)); getParameterLabel(index, label + strlen(label));
} }
*/
void mdaEPiano::process(float **inputs, float **outputs, int32_t sampleFrames)
void mdaEPiano::process(float **inputs, float **outputs, VstInt32 sampleFrames)
{ {
float* out0 = outputs[0]; float* out0 = outputs[0];
float* out1 = outputs[1]; float* out1 = outputs[1];
VstInt32 event=0, frame=0, frames, v; int32_t event=0, frame=0, frames, v;
float x, l, r, od=overdrive; float x, l, r, od=overdrive;
VstInt32 i; int32_t i;
while(frame<sampleFrames) while(frame<sampleFrames)
{ {
@ -379,8 +381,8 @@ void mdaEPiano::process(float **inputs, float **outputs, VstInt32 sampleFrames)
{ {
if(activevoices == 0 && programs[curProgram].param[4] > 0.5f) if(activevoices == 0 && programs[curProgram].param[4] > 0.5f)
{ lfo0 = -0.7071f; lfo1 = 0.7071f; } //reset LFO phase - good idea? { lfo0 = -0.7071f; lfo1 = 0.7071f; } //reset LFO phase - good idea?
VstInt32 note = notes[event++]; int32_t note = notes[event++];
VstInt32 vel = notes[event++]; int32_t vel = notes[event++];
noteOn(note, vel); noteOn(note, vel);
} }
} }
@ -392,13 +394,13 @@ void mdaEPiano::process(float **inputs, float **outputs, VstInt32 sampleFrames)
} }
void mdaEPiano::processReplacing(float **inputs, float **outputs, VstInt32 sampleFrames) void mdaEPiano::processReplacing(float **inputs, float **outputs, int32_t sampleFrames)
{ {
float* out0 = outputs[0]; float* out0 = outputs[0];
float* out1 = outputs[1]; float* out1 = outputs[1];
VstInt32 event=0, frame=0, frames, v; int32_t event=0, frame=0, frames, v;
float x, l, r, od=overdrive; float x, l, r, od=overdrive;
VstInt32 i; int32_t i;
while(frame<sampleFrames) while(frame<sampleFrames)
{ {
@ -452,8 +454,8 @@ void mdaEPiano::processReplacing(float **inputs, float **outputs, VstInt32 sampl
{ {
if(activevoices == 0 && programs[curProgram].param[4] > 0.5f) if(activevoices == 0 && programs[curProgram].param[4] > 0.5f)
{ lfo0 = -0.7071f; lfo1 = 0.7071f; } //reset LFO phase - good idea? { lfo0 = -0.7071f; lfo1 = 0.7071f; } //reset LFO phase - good idea?
VstInt32 note = notes[event++]; int32_t note = notes[event++];
VstInt32 vel = notes[event++]; int32_t vel = notes[event++];
noteOn(note, vel); noteOn(note, vel);
} }
} }
@ -465,11 +467,11 @@ void mdaEPiano::processReplacing(float **inputs, float **outputs, VstInt32 sampl
} }
void mdaEPiano::noteOn(VstInt32 note, VstInt32 velocity) void mdaEPiano::noteOn(int32_t note, int32_t velocity)
{ {
float * param = programs[curProgram].param; float * param = programs[curProgram].param;
float l=99.0f; float l=99.0f;
VstInt32 v, vl=0, k, s; int32_t v, vl=0, k, s;
if(velocity > 0) if(velocity > 0)
{ {
@ -492,13 +494,13 @@ void mdaEPiano::noteOn(VstInt32 note, VstInt32 velocity)
if(note > 60) l += stretch * (float)k; //stretch if(note > 60) l += stretch * (float)k; //stretch
s = size; 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; k = 0;
while(note > (kgrp[k].high + s)) k += 3; //find keygroup while(note > (kgrp[k].high + s)) k += 3; //find keygroup
l += (float)(note - kgrp[k].root); //pitch l += (float)(note - kgrp[k].root); //pitch
l = 32000.0f * iFs * (float)exp(0.05776226505 * l); l = 32000.0f * iFs * (float)exp(0.05776226505 * l);
voice[vl].delta = (VstInt32)(65536.0f * l); voice[vl].delta = (int32_t)(65536.0f * l);
voice[vl].frac = 0; voice[vl].frac = 0;
if(velocity > 48) k++; //mid velocity sample if(velocity > 48) k++; //mid velocity sample
@ -540,12 +542,13 @@ void mdaEPiano::noteOn(VstInt32 note, VstInt32 velocity)
} }
VstInt32 mdaEPiano::processEvents(VstEvents* ev) int32_t mdaEPiano::processEvents()
{ {
float * param = programs[curProgram].param; float * param = programs[curProgram].param;
VstInt32 npos=0; int32_t npos=0;
for (VstInt32 i=0; i<ev->numEvents; i++) /*
for (int32_t i=0; i<ev->numEvents; i++)
{ {
if((ev->events[i])->type != kVstMidiType) continue; if((ev->events[i])->type != kVstMidiType) continue;
VstMidiEvent* event = (VstMidiEvent*)ev->events[i]; VstMidiEvent* event = (VstMidiEvent*)ev->events[i];
@ -596,7 +599,7 @@ VstInt32 mdaEPiano::processEvents(VstEvents* ev)
default: //all notes off default: //all notes off
if(midiData[1]>0x7A) if(midiData[1]>0x7A)
{ {
for(VstInt32 v=0; v<NVOICES; v++) voice[v].dec=0.99f; for(int32_t v=0; v<NVOICES; v++) voice[v].dec=0.99f;
sustain = 0; sustain = 0;
muff = 160.0f; muff = 160.0f;
} }
@ -615,6 +618,7 @@ VstInt32 mdaEPiano::processEvents(VstEvents* ev)
event++; //? event++; //?
} }
notes[npos] = EVENTS_DONE; notes[npos] = EVENTS_DONE;
*/
return 1; return 1;
} }

@ -53,15 +53,15 @@ struct KGRP //keygroup
int32_t loop; int32_t loop;
}; };
class mdaEPiano : public AudioEffectX class mdaEPiano //: public AudioEffectX
{ {
public: public:
mdaEPiano(audioMasterCallback audioMaster); mdaEPiano(); // mdaEPiano(audioMasterCallback audioMaster);
~mdaEPiano(); ~mdaEPiano();
virtual void process(float **inputs, float **outputs, int32_t sampleframes); virtual void process(float **inputs, float **outputs, int32_t sampleframes);
virtual void processReplacing(float **inputs, float **outputs, int32_t sampleframes); virtual void processReplacing(float **inputs, float **outputs, int32_t sampleframes);
virtual int32_t processEvents(VstEvents* events); virtual int32_t processEvents(); // virtual int32_t processEvents(VstEvents* events);
virtual void setProgram(int32_t program); virtual void setProgram(int32_t program);
virtual void setProgramName(char *name); virtual void setProgramName(char *name);
@ -74,7 +74,7 @@ public:
virtual void setBlockSize(int32_t blockSize); virtual void setBlockSize(int32_t blockSize);
virtual void resume(); virtual void resume();
virtual bool getOutputProperties (int32_t index, VstPinProperties* properties); virtual bool getOutputProperties (int32_t index); // virtual bool getOutputProperties (int32_t index, VstPinProperties* properties);
virtual bool getProgramNameIndexed (int32_t category, int32_t index, char* text); virtual bool getProgramNameIndexed (int32_t category, int32_t index, char* text);
virtual bool copyProgram (int32_t destination); virtual bool copyProgram (int32_t destination);
virtual bool getEffectName (char* name); virtual bool getEffectName (char* name);
@ -112,6 +112,8 @@ private:
float treb, tfrq, tl, tr; float treb, tfrq, tl, tr;
float tune, fine, random, stretch, overdrive; float tune, fine, random, stretch, overdrive;
float muff, muffvel, sizevel, velsens, volume, modwhl; float muff, muffvel, sizevel, velsens, volume, modwhl;
uint8_t curProgram;
}; };
#endif #endif

@ -1,4 +1,6 @@
short epianoData[] = { #include <Arduino.h>
const int16_t epianoData[] PROGMEM = {
-7,-23,-28,-16,-30,-17,-28,-16,-31,-15,-34,-12,-35,-6,-42,4,-58,44,-227,-1690, -7,-23,-28,-16,-30,-17,-28,-16,-31,-15,-34,-12,-35,-6,-42,4,-58,44,-227,-1690,
-1412,-1295,-1059,-908,-685,-518,-308,-152,31,182,368,531,731,948,1195,1439,1694,1950,2228,2487, -1412,-1295,-1059,-908,-685,-518,-308,-152,31,182,368,531,731,948,1195,1439,1694,1950,2228,2487,
2742,2988,3225,3428,3624,3790,3969,4108,4253,4382,4495,4591,4647,4689,4737,4794,4846,4920,5003,5077, 2742,2988,3225,3428,3624,3790,3969,4108,4253,4382,4495,4591,4647,4689,4737,4794,4846,4920,5003,5077,

@ -0,0 +1,97 @@
/*************************************************
* MIDI note values
*************************************************/
#ifndef _MIDINOTES_H
#define _MIDINOTES_H
#define MIDI_A0 21
#define MIDI_AIS0 22
#define MIDI_B0 23
#define MIDI_C1 24
#define MIDI_CIS1 25
#define MIDI_D1 26
#define MIDI_DIS1 27
#define MIDI_E1 28
#define MIDI_F1 29
#define MIDI_FIS1 30
#define MIDI_G1 31
#define MIDI_GIS1 32
#define MIDI_A1 33
#define MIDI_AIS1 34
#define MIDI_B1 35
#define MIDI_C2 36
#define MIDI_CIS2 37
#define MIDI_D2 38
#define MIDI_DIS2 39
#define MIDI_E2 40
#define MIDI_F2 41
#define MIDI_FIS2 42
#define MIDI_G2 43
#define MIDI_GIS2 44
#define MIDI_A2 45
#define MIDI_AIS2 46
#define MIDI_B2 47
#define MIDI_C3 48
#define MIDI_CIS3 49
#define MIDI_D3 50
#define MIDI_DIS3 51
#define MIDI_E3 52
#define MIDI_F3 53
#define MIDI_FIS3 54
#define MIDI_G3 55
#define MIDI_GIS3 56
#define MIDI_A3 57
#define MIDI_AIS3 58
#define MIDI_B3 59
#define MIDI_C4 60
#define MIDI_CIS4 61
#define MIDI_D4 62
#define MIDI_DIS4 63
#define MIDI_E4 64
#define MIDI_F4 65
#define MIDI_FIS4 66
#define MIDI_G4 67
#define MIDI_GIS4 68
#define MIDI_A4 69
#define MIDI_AIS4 70
#define MIDI_B4 71
#define MIDI_C5 72
#define MIDI_CIS5 73
#define MIDI_D5 74
#define MIDI_DIS5 75
#define MIDI_E5 76
#define MIDI_F5 77
#define MIDI_FIS5 78
#define MIDI_G5 79
#define MIDI_GIS5 80
#define MIDI_A5 81
#define MIDI_AIS5 82
#define MIDI_B5 83
#define MIDI_C6 84
#define MIDI_CIS6 85
#define MIDI_D6 86
#define MIDI_DIS6 87
#define MIDI_E6 88
#define MIDI_F6 89
#define MIDI_FIS6 90
#define MIDI_G6 91
#define MIDI_GIS6 92
#define MIDI_A6 93
#define MIDI_AIS6 94
#define MIDI_B6 95
#define MIDI_C7 96
#define MIDI_CIS7 97
#define MIDI_D7 98
#define MIDI_DIS7 99
#define MIDI_E7 100
#define MIDI_F7 101
#define MIDI_FIS7 102
#define MIDI_G7 103
#define MIDI_GIS7 104
#define MIDI_A7 105
#define MIDI_AIS7 106
#define MIDI_B7 107
#define MIDI_C8 108
#endif
Loading…
Cancel
Save