I'm trying to do the same thing. I'm very new to coding but I've been plugging away at it and I think I'm starting to understand the syntax. All of the code that I've seen that has tried to implement stepper motors with MIDI have been written with what I think is a modified Arduino firmware called usbMIDI. I also think that the only way to really be able to play 'notes' is messing with the timers. Please forgive me, I don't have all the proper terminology yet... but here is my first attempt at trying to make a sketch that doesn't require a modified firmware. It might be impossible, I really don't know. What i've got so far is really quite large too, I'm not sure what the exact limit is to the size here but any feedback would be really deeply appreciated. I left a lot of notes just for myself to remember things I learned, and how I got places, etc...
#include<MIDI.h>
#include<Stepper.h>
#include<float_notes.h>
// LED pin
int ledPin = 13;
//how many steps per revolution for your stepper?
const int stepsPerRevolution = 200;
//assign outputs to the motor driver (my motor is named MrHappy)
Stepper MrHappy(stepsPerRevolution, 3,5,6,9);
// Are we currently playing a note?
bool playing = false;
//The desired delay between motor steps to achieve the requested note/frequency
float desired_delay = 0.0;
//The current delay between motor steps
float curr_delay = 0.0;
//The last note that was received - used to decide when to turn off the motor
byte last_note = 0.0;
//The speed at which the controller will glide from one note to the next
//units is the number of microseconds to add to curr_delay per iteration
//until it reaches desired delay
int const glide = 10;
//convert a midi note to the number of microseconds we need to delay
float note2microseconds(byte note)
//******************************************
//***************HELP!!!!!!!!!!**************
// {
// return 1.0 / notes[note] * 1000000.0;
// }
//should i replace [note] with [byte note]?
//*******************************************
//*******************************************
void OnNoteOn(byte channel, byte pitch, byte velocity) {
//
{
last_note = note;
//set the desired delay by converting the MIDI note
desired_delay = note2microseconds(note);
//if we're not currently playing, then we should try to accelerate
//into the requested note
if(!playing)
curr_delay = desired_delay + 600;
playing = true;
digitalWrite(ledPin, HIGH);
}
//Called when we recieve a MIDI note-off event
void OnNoteOff(byte channel, byte note, byte velocity)
{
//only turns off the last requested note
if(note == last_note)
{
playing = false;
digitalWrite(ledPin, LOW);
}
}
/////////////////SETUP!
////////////////////////
////////////////////////
////////////////////////
////////////////////////
void setup()
{
pinMode(ledPin, OUTPUT);
//get that serial party started at a baudrate that synthesizers like
Serial.begin(31250);
//I AM NOT SURE ABOUT THS BIT- WHICH ONE IS BETTER TO USE?
MIDI.begin(MIDI_CHANNEL_OMNI);
//Connect the HandleNoteOn function to the lib, so it is called upon
//reception of a NoteOn.
MIDI.setHandleNoteOff(OnNoteOff); //
MIDI.setHandleNoteOn(OnNoteOn); //PUT THE NAME OF THE FUNCTION
digitalWrite(ledPin,HIGH); //little LED lights up when he is ready
//pinMode(3, OUTPUT); //digital out to first stepper driver is on pin 3
//pinMode(5, OUTPUT); //digital out to second stepper driver is on pin 5
//pinMode(6, OUTPUT); //digital out of third stepper driver is on pin 6
//pinMode(9, OUTPUT); //you get the idea...
//pinMode(13, OUTPUT); //...
//WOOPS AGAIN! THIS WENT AWAY WHEN WE STARTED USING THE STEPPER LIB
}
void loop() {
//call MIDI.read as fast as you can to avoid that latency. QUICK!
MIDI.read();
}
also, here is my .h file i made from a code i found written for this usbMIDI firmware. I am unfamiliar with that whole syntax but I am certain that this is the really important part... I am wondering if it has to do with the [note] definition that I couldn't identify as well.
float notes[] = {
8.1757989156, // 0
8.6619572180, // 1
9.1770239974, // 2
10.3008611535, // 3
10.3008611535, // 4
10.9133822323, // 5
11.5623257097, // 6
12.2498573744, // 7
12.9782717994, // 8
13.7500000000, // 9
14.5676175474, // 10
15.4338531643, // 11
16.3515978313, // 12
17.3239144361, // 13
18.3540479948, // 14
19.4454364826, // 15
20.6017223071, // 16
21.8267644646, // 17
23.1246514195, // 18
24.4997147489, // 19
25.9565435987, // 20
27.5000000000, // 21
29.1352350949, // 22
30.8677063285, // 23
32.7031956626, // 24
34.6478288721, // 25
36.7080959897, // 26
38.8908729653, // 27
41.2034446141, // 28
43.6535289291, // 29
46.2493028390, // 30
48.9994294977, // 31
51.9130871975, // 32
55.0000000000, // 33
58.2704701898, // 34
61.7354126570, // 35
65.4063913251, // 36
69.2956577442, // 37
73.4161919794, // 38
77.7817459305, // 39
82.4068892282, // 40
87.3070578583, // 41
92.4986056779, // 42
97.9988589954, // 43
103.8261743950, // 44
110.0000000000, // 45
116.5409403795, // 46
123.4708253140, // 47
130.8127826503, // 48
138.5913154884, // 49
146.8323839587, // 50
155.5634918610, // 51
164.8137784564, // 52
174.6141157165, // 53
184.9972113558, // 54
195.9977179909, // 55
207.6523487900, // 56
220.0000000000, // 57
233.0818807590, // 58
246.9416506281, // 59
261.6255653006, // 60
277.1826309769, // 61
293.6647679174, // 62
311.1269837221, // 63
329.6275569129, // 64
349.2282314330, // 65
369.9944227116, // 66
391.9954359817, // 67
415.3046975799, // 68
440.0000000000, // 69
466.1637615181, // 70
493.8833012561, // 71
523.2511306012, // 72
554.3652619537, // 73
587.3295358348, // 74
622.2539674442, // 75
659.2551138257, // 76
698.4564628660, // 77
739.9888454233, // 78
783.9908719635, // 79
830.6093951599, // 80
880.0000000000, // 81
932.3275230362, // 82
987.7666025122, // 83
1046.5022612024, // 84
1108.7305239075, // 85
1174.6590716696, // 86
1244.5079348883, // 87
1318.5102276515, // 88
1396.9129257320, // 89
1479.9776908465, // 90
1567.9817439270, // 91
1661.2187903198, // 92
1760.0000000000, // 93
1864.6550460724, // 94
1975.5332050245, // 95
2093.0045224048, // 96
2217.4610478150, // 97
2349.3181433393, // 98
2489.0158697766, // 99
2637.0204553030, // 100
2793.8258514640, // 101
2959.9553816931, // 102
3135.9634878540, // 103
3322.4375806396, // 104
3520.0000000000, // 105
3729.3100921447, // 106
3951.0664100490, // 107
4186.0090448096, // 108
4434.9220956300, // 109
4698.6362866785, // 110
4978.0317395533, // 111
5274.0409106059, // 112
5587.6517029281, // 113
5919.9107633862, // 114
5919.9107633862, // 115
6644.8751612791, // 116
7040.0000000000, // 117
7458.6201842894, // 118
7902.1328200980, // 119
8372.0180896192, // 120
8869.8441912599, // 121
9397.2725733570, // 122
9956.0634791066, // 123
10548.0818212118, // 124
11175.3034058561, // 125
11839.8215267723, // 126
12543.8539514160 // 127
};
Finally, OnNoteOn and OnNoteOff don't seem to be attached to any definition and I believe that it is also part of the usbMIDI firmware. Is there a syntactically graceful way to replace that with the if, then statements from the void(OnNoteOn) piece from before the setup?
Thank YOU!