@ -22,6 +22,60 @@ Here a few examples on the usage of Clock library for MIDI devices, keep in mind
If you dont want to build a MIDI interface and you are going to use your arduino only with your PC, you can use a Serial-to-Midi bridge and connects your arduino via USB cable to your conputer to use it as a MIDI tool [like this one](http://projectgus.github.io/hairless-midiserial/).
If you dont want to build a MIDI interface and you are going to use your arduino only with your PC, you can use a Serial-to-Midi bridge and connects your arduino via USB cable to your conputer to use it as a MIDI tool [like this one](http://projectgus.github.io/hairless-midiserial/).
### A Simple MIDI Sync Box sketch example
Here is a example on how to create a simple MIDI Sync Box
```c++
#include<uClock.h>
// MIDI clock, start and stop byte definitions - based on MIDI 1.0 Standards.
#define MIDI_CLOCK 0xF8
#define MIDI_START 0xFA
#define MIDI_STOP 0xFC
// The callback function wich will be called by Clock each Pulse of 96PPQN clock resolution.
void ClockOut96PPQN(uint32_t * tick) {
// Send MIDI_CLOCK to external gears
Serial.write(MIDI_CLOCK);
}
// The callback function wich will be called when clock starts by using Clock.start() method.
void onClockStart() {
Serial.write(MIDI_START);
}
// The callback function wich will be called when clock stops by using Clock.stop() method.
void onClockStop() {
Serial.write(MIDI_STOP);
}
void setup() {
// Initialize serial communication at 31250 bits per second, the default MIDI serial speed communication:
Serial.begin(31250);
// Inits the clock
uClock.init();
// Set the callback function for the clock output to send MIDI Sync message.
uClock.setClock96PPQNOutput(ClockOut96PPQN);
// Set the callback function for MIDI Start and Stop messages.
uClock.setOnClockStartOutput(onClockStart);
uClock.setOnClockStopOutput(onClockStop);
// Set the clock BPM to 126 BPM
uClock.setTempo(126);
// Starts the clock, tick-tac-tick-tac...
uClock.start();
}
// Do it whatever to interface with Clock.stop(), Clock.start(), Clock.setTempo() and integrate your environment...
void loop() {
}
```
### Acid Step Sequencer
### Acid Step Sequencer
A clone of Roland TB303 step sequencer main engine, here is a example with no user interface for interaction. If you're looking for a user interactable TB303 sequencer engine clone with user interface please take a look here https://github.com/midilab/uClock/tree/development/examples/AcidStepSequencer.
A clone of Roland TB303 step sequencer main engine, here is a example with no user interface for interaction. If you're looking for a user interactable TB303 sequencer engine clone with user interface please take a look here https://github.com/midilab/uClock/tree/development/examples/AcidStepSequencer.
@ -34,11 +88,14 @@ A clone of Roland TB303 step sequencer main engine, here is a example with no us
// Sequencer config
// Sequencer config
#define STEP_MAX_SIZE 16
#define STEP_MAX_SIZE 16
#define SEQUENCER_MIN_BPM 50
#define SEQUENCER_MAX_BPM 177
#define NOTE_LENGTH 4 // min: 1 max: 5 DO NOT EDIT BEYOND!!!
#define NOTE_LENGTH 4 // min: 1 max: 5 DO NOT EDIT BEYOND!!!
#define NOTE_VELOCITY 90
#define NOTE_VELOCITY 90
#define ACCENT_VELOCITY 127
#define ACCENT_VELOCITY 127
#define NOTE_STACK_SIZE 3 // 1 for no glide note, other 2 for overlap glide notes
// MIDI modes
// MIDI config
#define MIDI_CHANNEL 0 // 0 = channel 1
#define MIDI_CHANNEL 0 // 0 = channel 1
// Sequencer data
// Sequencer data
@ -58,10 +115,10 @@ typedef struct
int8_t length;
int8_t length;
} STACK_NOTE_DATA;
} STACK_NOTE_DATA;
STACK_NOTE_DATA _note_stack[2];
STACK_NOTE_DATA _note_stack[NOTE_STACK_SIZE];
bool _playing = false;
bool _playing = false;
uint16_t _step = 0;
uint16_t _step, _step_edit = 0;
uint16_t _step_length = STEP_MAX_SIZE;
uint16_t _step_length = STEP_MAX_SIZE;
// MIDI clock, start, stop, note on and note off byte definitions - based on MIDI 1.0 Standards.
// MIDI clock, start, stop, note on and note off byte definitions - based on MIDI 1.0 Standards.