[sdiy] arduino timing
Paul Cunningham
paul at cometway.com
Tue Mar 15 05:43:24 CET 2011
can someone with realtime embedded experience help me here?
i've dragged out the Clock Locker Miduino project that i built last
year and have been working on the code a little bit. if you aren't
familiar with it from my previous post about it, here is a video i made:
http://www.youtube.com/watch?v=MN_LT-X7l9s
basically it's a little arduino based box that sends MIDI Clock in
sync with analog outputs. it's got a big knob to change the tempo and
a tri-color LED to indicate the timing. pretty simple.
my experience with writing real-time software has never been an exact
science, and although i'm not expecting a timing miracle from the
arduino, i'd like to learn more about approaches i can take to make
the timing more accurate and controllable.
by accurate, i'm talking about the calculations necessary on my part
which might be necessary to lock in at 120 bpm for example. my loop()
looks more or less like this and isn't trying to do anything fancy:
void loop()
{
delay_ms = getDelayMS();
delay_counter = millis();
if (playing && ((delay_counter - prev_counter) > delay_ms))
{
prev_counter = delay_counter;
if (clock_counter > 95)
{
clock_counter = 0;
}
Serial.write((byte) MIDI_CLOCK);
clock_counter++;
}
}
this is the gist of what's happening, though there is more in the loop
(not displayed here) which handles reading switches, the knob, sending
MIDI song position, and animating the LED. obviously this represents
additional overhead in my loop timing, but since my getDelayMS() is
just reading a value from the Big Knob, setting it has so far just
been a "feel" thing.
instead of just reading a number from the Big Knob and using that for
the delay, i'd like to read an actual tempo from an array so i can
dial in specific tempos, but this requires code that needs to be more
realtime friendly.
what approaches do you think i should consider given the arduino
platform to attain this level of functionality? for the time being,
i'm just winging it, and i'm sure i can get close enough to what i
need via trial-and-error, but it seems there's probably a more
academic path i should consider. i'd like to avoid having to profile
every line of code in the loop if possible.
i know, for example, that to get 120bpm (4/4) the delay_ms needs to be
around 21. that's basically 60000 (milliseconds per minute) / 120
(beats per minute) / 24 (midi clocks per beat) which works out to
20.833333333333333. that of course doesn't factor in my loop overhead,
which isn't a constant.
thanks for your help! -pc
More information about the Synth-diy
mailing list