examples
This commit is contained in:
Executable
+234
@@ -0,0 +1,234 @@
|
||||
//______________________/\\\\\__________________________/\\\______________________________/\\\__________________________________________________________
|
||||
// ____________________/\\\///__________________________\/\\\_____________________________\/\\\__________________________________________________________
|
||||
// ___________________/\\\______________________________\/\\\_____________________________\/\\\_____/\\\__/\\\_______________________________/\\\\\\\\___
|
||||
// _____/\\\\\\\\__/\\\\\\\\\_______/\\\\\______________\/\\\____________/\\\\\___________\/\\\____\//\\\/\\\___/\\\\\\\\\\_____/\\\\\\\\___/\\\////\\\__
|
||||
// ___/\\\//////__\////\\\//______/\\\///\\\____________\/\\\\\\\\\____/\\\///\\\____/\\\\\\\\\_____\//\\\\\___\/\\\//////____/\\\/////\\\_\//\\\\\\\\\__
|
||||
// __/\\\____________\/\\\_______/\\\__\//\\\___________\/\\\////\\\__/\\\__\//\\\__/\\\////\\\______\//\\\____\/\\\\\\\\\\__/\\\\\\\\\\\___\///////\\\__
|
||||
// _\//\\\___________\/\\\______\//\\\__/\\\____________\/\\\__\/\\\_\//\\\__/\\\__\/\\\__\/\\\___/\\_/\\\_____\////////\\\_\//\\///////__________\/\\\__
|
||||
// __\///\\\\\\\\____\/\\\_______\///\\\\\/_____________\/\\\\\\\\\___\///\\\\\/___\//\\\\\\\/\\_\//\\\\/_______/\\\\\\\\\\__\//\\\\\\\\\\________\/\\\\_
|
||||
// ____\////////_____\///__________\/////_______________\/////////______\/////______\///////\//___\////________\//////////____\//////////_________\////__
|
||||
// CFO BODYSEQ sequencer, 3 button version, reworked interaction, http://www.vsionhairies.info/
|
||||
|
||||
#define MIDI_CHANNEL 1
|
||||
#include <spi4teensy3.h>
|
||||
#include <EEPROM.h>
|
||||
#include <CFO_BODYSEQ.h>
|
||||
|
||||
#define NUM_TRACKS 8
|
||||
#define NUM_STEPS 8
|
||||
#define NUM_LEDS 8
|
||||
|
||||
int mode;
|
||||
|
||||
int track[8];
|
||||
int debounceTime = 40;
|
||||
|
||||
int _bpm;
|
||||
|
||||
const int scale[] = {0, 2, 3, 5, 7, 8, 10, 12};
|
||||
//const int octave[] = {-24, -12, 0, 12, 24};
|
||||
int rootNote = 36;
|
||||
|
||||
int trackPlaying = 0 ;
|
||||
int trackSelected = 0;
|
||||
int stepSelected = 0;
|
||||
int noteSelected = 0;
|
||||
int oct = 0;
|
||||
|
||||
int notes[64];
|
||||
int octave[64];
|
||||
int noteValues[8];
|
||||
|
||||
int leds;
|
||||
int note;
|
||||
|
||||
//int var = 0;
|
||||
//const int pot1 = A0, pot2 = A1;
|
||||
|
||||
// old stuff
|
||||
const int seqLed[] = {3,4,5,6,7,8,9,10};
|
||||
const int statusLed1 = 13;
|
||||
//boolean debug = true;
|
||||
|
||||
|
||||
/////////////
|
||||
// BUTTONS //
|
||||
/////////////
|
||||
#define NUM_BUTTONS 8
|
||||
const int buttonPin [] = {11,12,2};
|
||||
int buttonIndex = 0;
|
||||
int buttonRead = 0;
|
||||
int buttonChange = 0;
|
||||
int buttonState[] = {0, 0, 0};
|
||||
unsigned long buttonNow = 0;
|
||||
unsigned long buttonTime[] = {0, 0, 0};
|
||||
int machineState = 0;
|
||||
|
||||
//////////
|
||||
// KEYS //
|
||||
//////////
|
||||
#define NUM_KEYS 8
|
||||
#define KEY_THRESHOLD 15
|
||||
const int keyPin[] = {A2,A3,A4,A5,A6,A7,A8,A9};
|
||||
int keyIndex = 0;
|
||||
int keyRead = 0;
|
||||
int keyValue = 0;
|
||||
int keyChange = 0;
|
||||
int keyState[] = {0, 0, 0, 0, 0, 0, 0, 0};
|
||||
unsigned long keyNow = 0;
|
||||
unsigned long keyTime[] = {0, 0, 0, 0, 0, 0, 0, 0};
|
||||
int keys;
|
||||
|
||||
|
||||
void setup() {
|
||||
Music.init();
|
||||
Music.enableEnvelope1();
|
||||
Music.enableEnvelope2();
|
||||
Music.getPreset(21);
|
||||
usbMIDI.setHandleNoteOff(OnNoteOff);
|
||||
usbMIDI.setHandleNoteOn(OnNoteOn);
|
||||
usbMIDI.setHandleControlChange(OnControlChange);
|
||||
usbMIDI.setHandleRealTimeSystem(RealTimeSystem);
|
||||
analogReadAveraging(32);
|
||||
delay(2000);
|
||||
Sequencer.init(120);
|
||||
setupSequences();
|
||||
initInterface();
|
||||
}
|
||||
|
||||
|
||||
void loop() {
|
||||
Sequencer.update();
|
||||
usbMIDI.read();
|
||||
Midi.checkSerialMidi();
|
||||
readButtons();
|
||||
readKeys();
|
||||
checkBPM();
|
||||
Music.setCutoffModAmount((analogRead(A1))*64);
|
||||
|
||||
// if(buttonChange || keyChange) {
|
||||
switch(machineState) {
|
||||
case 0:
|
||||
playTrack();
|
||||
break;
|
||||
case 1:
|
||||
selectNote();
|
||||
break;
|
||||
case 2:
|
||||
selectStep();
|
||||
break;
|
||||
case 3: // nothing
|
||||
break;
|
||||
case 4:
|
||||
selectTrack();
|
||||
break;
|
||||
case 5: // nothing
|
||||
break;
|
||||
case 6: // nothing
|
||||
break;
|
||||
case 7: // nothing
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
updateLEDs();
|
||||
// buttonChange = 0;
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
void playTrack() {
|
||||
if(keyChange) {
|
||||
Serial.println("PLAY TRACK");
|
||||
// code here
|
||||
keyChange = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void selectNote() {
|
||||
noteSelected = notes[stepSelected + 8 * trackSelected];
|
||||
oct = octave[stepSelected + 8 * trackSelected];
|
||||
if(keyChange) {
|
||||
for(int i = 0; i < NUM_KEYS-1; i++) {
|
||||
if(keys & (1 << i)) noteSelected = i;
|
||||
notes[stepSelected + 8 * trackSelected] = noteSelected;
|
||||
}
|
||||
if(keys & (1 << 7)) {
|
||||
oct ^= 1;
|
||||
octave[stepSelected + 8 * trackSelected] = oct;
|
||||
}
|
||||
for(int i = 0; i < NUM_STEPS; i++) {
|
||||
noteValues[i] = rootNote + scale[notes[8 * trackSelected + i]] + octave[i + 8 * trackSelected] * 12;
|
||||
Sequencer.insertNotes(track[trackSelected], noteValues, 8, 0);
|
||||
}
|
||||
keyChange = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void selectStep() {
|
||||
if(keyChange) {
|
||||
Serial.println("SELECT STEP");
|
||||
for(int i = 0; i < NUM_KEYS; i++) {
|
||||
// code here
|
||||
if(keys & (1 << i)) {
|
||||
stepSelected = i;
|
||||
Serial.print("Step selected: ");
|
||||
Serial.println(stepSelected);
|
||||
}
|
||||
}
|
||||
keyChange = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void selectTrack() {
|
||||
// if(keys > 0) {
|
||||
if(keyChange) {
|
||||
Serial.println("SELECT TRACK");
|
||||
for(int i = 0; i < NUM_KEYS; i++) {
|
||||
// Serial.print("Rechecking sequence on position ");
|
||||
// Serial.print(i);
|
||||
// Serial.print(". It is set to sequence index ");
|
||||
// Serial.println(track[i]);
|
||||
Sequencer.setInternal(track[i], false);
|
||||
if(keys & (1 << i)) {
|
||||
trackSelected = i;
|
||||
Serial.print("trackSelected shows ");
|
||||
Serial.print(trackSelected);
|
||||
Serial.print(" - Track selected: ");
|
||||
Serial.println(track[trackSelected]);
|
||||
}
|
||||
Sequencer.setInternal(track[trackSelected], true);
|
||||
}
|
||||
keyChange = 0;
|
||||
}
|
||||
// code here
|
||||
}
|
||||
|
||||
|
||||
void setupSequences() {
|
||||
for(int i = 0; i < NUM_TRACKS; i++) {
|
||||
for(int j = 0; j < NUM_STEPS; j++) {
|
||||
notes[8*i + j] = j;
|
||||
}
|
||||
track[i] = Sequencer.newSequence(NOTE_16, 8, LOOP);
|
||||
Serial.print("Track created for sequence ");
|
||||
Serial.print(track[i]);
|
||||
Serial.print(" on position ");
|
||||
Serial.println(i);
|
||||
Sequencer.startSequence(track[i]);
|
||||
for(int j = 0; j < NUM_STEPS; j++) {
|
||||
noteValues[j] = rootNote + scale[notes[8 * i + j]] + octave[8 * i + j] * 12;
|
||||
}
|
||||
Sequencer.insertNotes(track[i], noteValues, 8, 0);
|
||||
Sequencer.setInternal(track[i], true);
|
||||
Sequencer.setExternal(track[i], false);
|
||||
Serial.print("Internal set to ");
|
||||
Serial.println(Sequencer.getInternal(track[i]));
|
||||
}
|
||||
for(int i = 0; i < NUM_TRACKS; i++) {
|
||||
Serial.print("Rechecking sequence on position ");
|
||||
Serial.print(i);
|
||||
Serial.print(" - set to sequence index ");
|
||||
Serial.println(track[i]);
|
||||
}
|
||||
}
|
||||
Executable
+157
@@ -0,0 +1,157 @@
|
||||
/////////////
|
||||
// BUTTONS //
|
||||
/////////////
|
||||
void readButtons() {
|
||||
// buttons are active low
|
||||
for(int i = 0; i < NUM_BUTTONS; i++) {
|
||||
// int i = buttonIndex++;
|
||||
// if(buttonIndex >= NUM_BUTTONS) buttonIndex = 0;
|
||||
buttonNow = millis();
|
||||
if((buttonNow - buttonTime[i]) > debounceTime) {
|
||||
buttonRead = digitalRead(buttonPin[i]);
|
||||
if(buttonRead != buttonState[i]) {
|
||||
buttonState[i] = buttonRead;
|
||||
buttonChange |= 1<<i;
|
||||
buttonTime[i] = buttonNow;
|
||||
machineState = 7 - buttonState[0] - buttonState[1] * 2 - buttonState[2] * 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//////////
|
||||
// KEYS //
|
||||
//////////
|
||||
void readKeys() {
|
||||
for (int i = 0; i < NUM_KEYS; i++) {
|
||||
// int i = keyIndex++;
|
||||
// if(keyIndex >= NUM_KEYS) keyIndex = 0;
|
||||
keyNow = millis();
|
||||
if((keyNow - keyTime[i]) > debounceTime) {
|
||||
keyRead = analogRead(keyPin[i]);
|
||||
// if(i==4) Serial.println(keyRead);
|
||||
if(keyRead > KEY_THRESHOLD) {
|
||||
keyValue = 1;
|
||||
} else {
|
||||
keyValue = 0;
|
||||
}
|
||||
// keyValue = (keyRead > KEY_THRESHOLD) ? 1 : 0 ;
|
||||
if(keyValue != keyState[i]) {
|
||||
keyState[i] = keyValue;
|
||||
keyChange |= 1<<i;
|
||||
keyTime[i] = keyNow;
|
||||
}
|
||||
if(keyState[i]) {
|
||||
keys |= 1<<i;
|
||||
} else {
|
||||
keys &= ~(1<<i);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//////////
|
||||
// POTS //
|
||||
//////////
|
||||
void checkBPM() {
|
||||
int bpm = analogRead(A0)>>2;
|
||||
if(bpm != _bpm) {
|
||||
_bpm = bpm;
|
||||
Serial.print("BPM set to ");
|
||||
Serial.println(_bpm);
|
||||
Sequencer.setbpm(_bpm);
|
||||
if(_bpm == 0) {
|
||||
Midi.setMidiIn(true);
|
||||
Midi.setMidiThru(true);
|
||||
Midi.setMidiOut(true);
|
||||
Midi.setMidiClockIn(true);
|
||||
Midi.setMidiClockThru(true);
|
||||
Midi.setMidiClockOut(true);
|
||||
Sequencer.setInternalClock(false);
|
||||
} else {
|
||||
Midi.setMidiIn(false);
|
||||
Midi.setMidiThru(false);
|
||||
Midi.setMidiOut(false);
|
||||
Midi.setMidiClockIn(false);
|
||||
Midi.setMidiClockThru(false);
|
||||
Midi.setMidiClockOut(false);
|
||||
Sequencer.setInternalClock(true);
|
||||
// Sequencer.sequencerContinue();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void initInterface() {
|
||||
pinMode(buttonPin[0], INPUT_PULLUP);
|
||||
pinMode(buttonPin[1], INPUT_PULLUP);
|
||||
pinMode(buttonPin[2], INPUT_PULLUP);
|
||||
pinMode(statusLed1,OUTPUT);
|
||||
for (int i = 0; i<8; i++) {
|
||||
pinMode(seqLed[i], OUTPUT);
|
||||
}
|
||||
startupAnimation();
|
||||
}
|
||||
|
||||
|
||||
void updateLEDs() {
|
||||
switch(machineState) {
|
||||
case 0:
|
||||
leds = 0 | (1 << trackSelected);
|
||||
break;
|
||||
case 1:
|
||||
leds = 0 | (1 << noteSelected);
|
||||
leds = leds | (octave[stepSelected + 8 * trackSelected] << 7);
|
||||
break;
|
||||
case 2:
|
||||
leds = 0 | (1 << stepSelected);
|
||||
break;
|
||||
case 3: // nothing
|
||||
break;
|
||||
case 4:
|
||||
leds = 0 | (1 << trackSelected);
|
||||
break;
|
||||
case 5: // nothing
|
||||
break;
|
||||
case 6: // nothing
|
||||
break;
|
||||
case 7: // nothing
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
for (int i = 0; i<8; i++) {
|
||||
digitalWrite(seqLed[i], leds & (1 << i));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void startupAnimation() {
|
||||
digitalWrite(statusLed1, HIGH);
|
||||
|
||||
for (int i = 0; i<8; i++) {
|
||||
digitalWrite(seqLed[i],HIGH);
|
||||
delay(30);
|
||||
}
|
||||
for (int i = 0; i<8; i++) {
|
||||
digitalWrite(seqLed[i],LOW);
|
||||
delay(30);
|
||||
}
|
||||
|
||||
for (int i = 0; i<8; i++) {
|
||||
digitalWrite(seqLed[7-i],HIGH);
|
||||
delay(30);
|
||||
}
|
||||
for (int i = 0; i<8; i++) {
|
||||
digitalWrite(seqLed[7-i],LOW);
|
||||
delay(30);
|
||||
}
|
||||
|
||||
digitalWrite(statusLed1, LOW);
|
||||
|
||||
delay(100);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user