[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