From 4fabe518b046ecfa15a745062307eeaee13ad26c Mon Sep 17 00:00:00 2001 From: Lukas Date: Wed, 13 Feb 2013 20:05:54 +0100 Subject: [PATCH] MIDI-out and MCP23017 sketch --- design_files/compents.ods | Bin 12598 -> 13019 bytes design_files/design.odg | Bin 0 -> 18549 bytes source/library/input_4051/input_4051.cpp | 42 ++++++++ source/library/input_4051/input_4061.h | 28 ++++++ source/sketches/testing/_4051_test.ino | 42 ++++++++ .../testing/midi_in_out_softwareserial.ino | 92 ++++++++++++++++++ 6 files changed, 204 insertions(+) create mode 100644 design_files/design.odg create mode 100644 source/library/input_4051/input_4051.cpp create mode 100644 source/library/input_4051/input_4061.h create mode 100644 source/sketches/testing/_4051_test.ino create mode 100644 source/sketches/testing/midi_in_out_softwareserial.ino diff --git a/design_files/compents.ods b/design_files/compents.ods index 06bf7db249f99fb03fe56b463a0e3ce7065122a5..2ec13d1c70e3018caa7ebcfb5f3553793e93a9ba 100644 GIT binary patch delta 10570 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 diff --git a/design_files/design.odg b/design_files/design.odg new file mode 100644 index 0000000000000000000000000000000000000000..303daa0d589207a0b6e4f0bb3e34c83cd8067532 GIT binary patch literal 18549 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 read + tolerance) { + value[count] = read; + _valueChangeCallback(count, read); + } + } +} + diff --git a/source/library/input_4051/input_4061.h b/source/library/input_4051/input_4061.h new file mode 100644 index 0000000..9e8c55d --- /dev/null +++ b/source/library/input_4051/input_4061.h @@ -0,0 +1,28 @@ +/* + input_4051.h - Library for reading inputs from 4051 multiplexer + Created by David A. Mellis, November 2, 2007. + Released into the public domain. +*/ +#ifndef input_4051_h +#define input_4051_h + +#include "Arduino.h" + + +class input_4051 +{ + public: + Morse(int analogPin, int s0Pin, int s1Pin, int s2Pin, void (*valueChangeCallback(int,int))); + void loop(void); + int getSpecificValue(int pin); + private: + int _analog; + int _s0; + int _s1; + int _s2; + void (*_valueChangeCallback(int,int); + int _value[8]; +}; + + +#endif diff --git a/source/sketches/testing/_4051_test.ino b/source/sketches/testing/_4051_test.ino new file mode 100644 index 0000000..8b6d7bb --- /dev/null +++ b/source/sketches/testing/_4051_test.ino @@ -0,0 +1,42 @@ +int tolerance = 4; + +const int s0 = 10; +const int s1 = 9; +const int s2 = 8; + +int pots[] = {-1,-1}; + +void setup() { + Serial.begin(9600); + pinMode(s0,OUTPUT); + pinMode(s1,OUTPUT); + pinMode(s2,OUTPUT); +} + +void loop() { + //get Y0 of 4051 + digitalWrite(s0, LOW); + digitalWrite(s1, LOW); + digitalWrite(s1, LOW); + int read = analogRead(A1); + //only print value on change (tolerance of 4 out of 1024) + if (pots[0] < read - tolerance || pots[0] > read + tolerance) { + pots[0] = read; + Serial.print("pot 0: "); + //print value between 0 & 127 like MIDI velocity ;) + Serial.print(pots[0]/8); + Serial.println(); + } + + //get Y1 of 4051, analog to Y0 + digitalWrite(s0, HIGH); + digitalWrite(s1, LOW); + digitalWrite(s1, LOW); + read = analogRead(A1); + if (pots[1] < read - tolerance || pots[1] > read + tolerance) { + pots[1] = read; + Serial.print("pot 1: "); + Serial.print(pots[1]/8); + Serial.println(); + } +} diff --git a/source/sketches/testing/midi_in_out_softwareserial.ino b/source/sketches/testing/midi_in_out_softwareserial.ino new file mode 100644 index 0000000..c3f368f --- /dev/null +++ b/source/sketches/testing/midi_in_out_softwareserial.ino @@ -0,0 +1,92 @@ +#include + +// RX, TX for MIDI out +SoftwareSerial MIDI(10, 11); + +//button pin +const int switchPin = 6; +//rotary encoder pins +const int encAPin = 4; +const int encBPin = 5; + +//for sending note-off once after button is released +boolean btnOff = false; + +//old rotary encoder value +int encA = LOW; +//read rotary encoder value +int enc = HIGH; + +void setup() +{ + //printing baudrate + Serial.begin(9600); + //MIDI baudrate for software serial (pin 10 & 11) + MIDI.begin(31250); + //button and encoder pins as input + pinMode(switchPin, INPUT); + pinMode(encAPin, INPUT); + pinMode(encBPin, INPUT); + //activate pullup-resistors (read value is inverted, so LOW is active) + digitalWrite(switchPin, HIGH); + digitalWrite(encAPin, HIGH); + digitalWrite(encBPin, HIGH); +} + +void loop() +{ + //print incoming bytes on softwareserial, just for checking MIDI-in, worked + if (MIDI.available()) + Serial.println(MIDI.read()); + + //check if button is pressed + if (digitalRead(switchPin) == LOW) + { + if (!btnOff) { + //send note on + midiSignal(144,60,100); + btnOff = true; + } + } + if (digitalRead(switchPin) == HIGH) + { + //send note off + if (btnOff) { + midiSignal(128,60,0); + btnOff = false; + } + } + + //read encoder pin A + enc = digitalRead(encAPin); + //check if rotary encoder is turned + if ((encA == HIGH) && (enc == LOW)) { + //check direction of turning + if (digitalRead(encBPin) == HIGH) { + //send note on and note off directly, so signal is send on every turn + midiSignal(144,62,100); + midiSignal(128,62,100); + } else { + //other direction, other note value + midiSignal(144,61,100); + midiSignal(128,61,100); + } + } + //save "old" encoder value + encA = enc; +} + +//send MIDI signal through softwareserial +void midiSignal(byte b1, byte b2, byte b3) { + //debug printing + Serial.print("send: "); + Serial.print(b1); + Serial.print(" | "); + Serial.print(b2); + Serial.print(" | "); + Serial.print(b3); + Serial.println(""); + MIDI.write(b1); + MIDI.write(b2); + MIDI.write(b2); +}