pedalboard 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a25d942f766a0b275b99254b79958b4cb0fb8629
4
+ data.tar.gz: c3c2fafcb3edb04ebbf42d6df93c9d471b164859
5
+ SHA512:
6
+ metadata.gz: 1f1f1d4a11fffe711d9f2d26f499c10f1da9cd0226c9e21d6740bc65d909931a27f79edafebbd0593ca6666bb7607fa1d63eb69c8103f8be84c57aa4bb0a44d6
7
+ data.tar.gz: 083167d958e806cd735d635c802aa971b12454e3663c5b2ebac47f1bc1a4d7c8cf7e99c0940dc22d67b1f18ec25065284038c546d370806869d3c7a113a4c0ec
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color -f d
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm use --create 2.0.0@midi
@@ -0,0 +1,9 @@
1
+ language: ruby
2
+ script: rspec
3
+ before_install:
4
+ - sudo apt-get update -qq
5
+ - sudo apt-get install libasound-dev
6
+ install: bundle install
7
+ addons:
8
+ code_climate:
9
+ repo_token: a723909ed3e0091f9e9e3b4bb2f92c803d2a59deb7dd32352ff42d2736520185
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
@@ -0,0 +1,65 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ pedalboard (0.0.1)
5
+ dino
6
+ micromidi
7
+ mixlib-cli
8
+
9
+ GEM
10
+ remote: https://rubygems.org/
11
+ specs:
12
+ alsa-rawmidi (0.2.14)
13
+ ffi (>= 1.0)
14
+ codeclimate-test-reporter (0.3.0)
15
+ simplecov (>= 0.7.1, < 1.0.0)
16
+ diff-lcs (1.2.5)
17
+ dino (0.11.2)
18
+ serialport
19
+ docile (1.1.3)
20
+ ffi (1.9.3)
21
+ ffi-coremidi (0.2.0)
22
+ ffi (>= 1.0)
23
+ micromidi (0.0.9)
24
+ midi-eye (>= 0.1.3)
25
+ midi-message (>= 0.2.2)
26
+ unimidi (>= 0.2.3)
27
+ midi-eye (0.2.2)
28
+ midi-message
29
+ midi-nibbler
30
+ unimidi
31
+ midi-jruby (0.0.12)
32
+ midi-message (0.3.2)
33
+ midi-nibbler (0.1.1)
34
+ midi-message
35
+ midi-winmm (0.1.10)
36
+ ffi (>= 1.0)
37
+ mixlib-cli (1.5.0)
38
+ multi_json (1.10.0)
39
+ rspec (2.14.1)
40
+ rspec-core (~> 2.14.0)
41
+ rspec-expectations (~> 2.14.0)
42
+ rspec-mocks (~> 2.14.0)
43
+ rspec-core (2.14.8)
44
+ rspec-expectations (2.14.5)
45
+ diff-lcs (>= 1.1.3, < 2.0)
46
+ rspec-mocks (2.14.6)
47
+ serialport (1.3.0)
48
+ simplecov (0.8.2)
49
+ docile (~> 1.1.0)
50
+ multi_json
51
+ simplecov-html (~> 0.8.0)
52
+ simplecov-html (0.8.0)
53
+ unimidi (0.3.5)
54
+ alsa-rawmidi (~> 0)
55
+ ffi-coremidi (~> 0)
56
+ midi-jruby (~> 0)
57
+ midi-winmm (~> 0)
58
+
59
+ PLATFORMS
60
+ ruby
61
+
62
+ DEPENDENCIES
63
+ codeclimate-test-reporter
64
+ pedalboard!
65
+ rspec
@@ -0,0 +1,25 @@
1
+ # Arduino pedal board
2
+
3
+ This is the software component of an Arduino based MIDI pedalboard. It uses the
4
+ [Dino gem](https://github.com/austinbv/dino) to receive signals from the
5
+ Arduino and the [Unimidi gem](https://github.com/arirusso/unimidi) to send out
6
+ MIDI signals in response.
7
+
8
+ ### Getting started
9
+
10
+ - Install the gem
11
+
12
+ ```
13
+ gem install pedalboard
14
+ ```
15
+
16
+ - Create a startup script for your pedalboard. An example is in [the examples
17
+ folder](https://github.com/adamphillips/pedalboard/tree/master/examples)
18
+
19
+ - run the script
20
+
21
+ ```
22
+ pedalboard script.rb
23
+ ```
24
+
25
+ You will be prompted to choose your MIDI input and output
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative '../lib/pedalboard'
4
+
5
+ Pedalboard::CLI.new.run(ARGV)
6
+ sleep
@@ -0,0 +1,257 @@
1
+ /*
2
+ Library for dino ruby gem.
3
+ */
4
+
5
+ #include "Arduino.h"
6
+ #include "Dino.h"
7
+
8
+ Dino::Dino(){
9
+ reset();
10
+ }
11
+
12
+ void Dino::parse(char c) {
13
+ if (c == '!') index = 0; // Reset request
14
+ else if (c == '.') process(); // End request and process
15
+ else request[index++] = c; // Append to request
16
+ }
17
+
18
+ void Dino::process() {
19
+ response[0] = '\0';
20
+
21
+ // Parse the request.
22
+ strncpy(cmdStr, request, 2); cmdStr[2] = '\0';
23
+ strncpy(pinStr, request + 2, 2); pinStr[2] = '\0';
24
+ strncpy(valStr, request + 4, 3); valStr[3] = '\0';
25
+ cmd = atoi(cmdStr);
26
+ pin = atoi(pinStr);
27
+ val = atoi(valStr);
28
+
29
+ #ifdef debug
30
+ Serial.print("Received request - "); Serial.println(request);
31
+ Serial.print("Command - "); Serial.println(cmdStr);
32
+ Serial.print("Pin - "); Serial.println(pinStr);
33
+ Serial.print("Value - "); Serial.println(valStr);
34
+ #endif
35
+
36
+ // Call the command.
37
+ switch(cmd) {
38
+ case 0: setMode (); break;
39
+ case 1: dWrite (); break;
40
+ case 2: dRead (); break;
41
+ case 3: aWrite (); break;
42
+ case 4: aRead (); break;
43
+ case 5: addDigitalListener (); break;
44
+ case 6: addAnalogListener (); break;
45
+ case 7: removeListener (); break;
46
+ case 8: servoToggle (); break;
47
+ case 9: servoWrite (); break;
48
+ case 90: reset (); break;
49
+ case 97: setAnalogDivider (); break;
50
+ case 98: setHeartRate (); break;
51
+ default: break;
52
+ }
53
+
54
+ // Write the response.
55
+ if (response[0] != '\0') writeResponse();
56
+
57
+ #ifdef debug
58
+ Serial.print("Responded with - "); Serial.println(response);
59
+ Serial.println();
60
+ #endif
61
+ }
62
+
63
+
64
+
65
+ // WRITE CALLBACK
66
+ void Dino::setupWrite(void (*writeCallback)(char *str)) {
67
+ _writeCallback = writeCallback;
68
+ }
69
+ void Dino::writeResponse() {
70
+ _writeCallback(response);
71
+ }
72
+
73
+
74
+
75
+ // LISTNENERS
76
+ void Dino::updateListeners() {
77
+ if (timeSince(lastUpdate) > heartRate || timeSince(lastUpdate) < 0) {
78
+ lastUpdate = micros();
79
+ loopCount++;
80
+ updateDigitalListeners();
81
+ if (loopCount % analogDivider == 0) updateAnalogListeners();
82
+ }
83
+ }
84
+ void Dino::updateDigitalListeners() {
85
+ for (int i = 0; i < 22; i++) {
86
+ if (digitalListeners[i]) {
87
+ pin = i;
88
+ dRead();
89
+ if (rval != digitalListenerValues[i]) {
90
+ digitalListenerValues[i] = rval;
91
+ writeResponse();
92
+ }
93
+ }
94
+ }
95
+ }
96
+ void Dino::updateAnalogListeners() {
97
+ for (int i = 0; i < 22; i++) {
98
+ if (analogListeners[i]) {
99
+ pin = i;
100
+ aRead();
101
+ writeResponse();
102
+ }
103
+ }
104
+ }
105
+ long Dino::timeSince(long event) {
106
+ long time = micros() - event;
107
+ return time;
108
+ }
109
+
110
+
111
+
112
+ // API FUNCTIONS
113
+ // CMD = 00 // Pin Mode
114
+ void Dino::setMode() {
115
+ if (val == 0) {
116
+ removeListener();
117
+ pinMode(pin, OUTPUT);
118
+ #ifdef debug
119
+ Serial.print("Set pin "); Serial.print(pin); Serial.print(" to "); Serial.println("OUTPUT mode");
120
+ #endif
121
+ }
122
+ else {
123
+ pinMode(pin, INPUT);
124
+ #ifdef debug
125
+ Serial.print("Set pin "); Serial.print(pin); Serial.print(" to "); Serial.println("INPTUT mode");
126
+ #endif
127
+ }
128
+ }
129
+
130
+ // CMD = 01 // Digital Write
131
+ void Dino::dWrite() {
132
+ if (val == 0) {
133
+ digitalWrite(pin, LOW);
134
+ #ifdef debug
135
+ Serial.print("Digital write "); Serial.print(LOW); Serial.print(" to pin "); Serial.println(pin);
136
+ #endif
137
+ }
138
+ else {
139
+ digitalWrite(pin, HIGH);
140
+ #ifdef debug
141
+ Serial.print("Digital write "); Serial.print(HIGH); Serial.print(" to pin "); Serial.println(pin);
142
+ #endif
143
+ }
144
+ }
145
+
146
+ // CMD = 02 // Digital Read
147
+ void Dino::dRead() {
148
+ rval = digitalRead(pin);
149
+ sprintf(response, "%02d:%02d", pin, rval);
150
+ }
151
+
152
+ // CMD = 03 // Analog (PWM) Write
153
+ void Dino::aWrite() {
154
+ analogWrite(pin,val);
155
+ #ifdef debug
156
+ Serial.print("Analog write "); Serial.print(val); Serial.print(" to pin "); Serial.println(pin);
157
+ #endif
158
+ }
159
+
160
+ // CMD = 04 // Analog Read
161
+ void Dino::aRead() {
162
+ rval = analogRead(pin);
163
+ sprintf(response, "%02d:%02d", pin, rval);
164
+ }
165
+
166
+ // CMD = 05
167
+ // Listen for a digital signal on any pin.
168
+ void Dino::addDigitalListener() {
169
+ removeListener();
170
+ digitalListeners[pin] = true;
171
+ digitalListenerValues[pin] = 2;
172
+ #ifdef debug
173
+ Serial.print("Added digital listener on pin "); Serial.println(pin);
174
+ #endif
175
+ }
176
+
177
+ // CMD = 06
178
+ // Listen for an analog signal on analog pins only.
179
+ void Dino::addAnalogListener() {
180
+ removeListener();
181
+ analogListeners[pin] = true;
182
+ #ifdef debug
183
+ Serial.print("Added analog listener on pin "); Serial.println(pin);
184
+ #endif
185
+ }
186
+
187
+ // CMD = 07
188
+ // Remove analog and digital listeners from any pin.
189
+ void Dino::removeListener() {
190
+ analogListeners[pin] = false;
191
+ digitalListeners[pin] = false;
192
+ #ifdef debug
193
+ Serial.print("Removed listeners on pin "); Serial.println(pin);
194
+ #endif
195
+ }
196
+
197
+ // CMD = 08
198
+ // Attach the servo object to pin or detach it.
199
+ void Dino::servoToggle() {
200
+ if (val == 0) {
201
+ #ifdef debug
202
+ Serial.print("Detaching servo"); Serial.print(" on pin "); Serial.println(pin);
203
+ #endif
204
+ servos[pin - SERVO_OFFSET].detach();
205
+ }
206
+ else {
207
+ #ifdef debug
208
+ Serial.print("Attaching servo"); Serial.print(" on pin "); Serial.println(pin);
209
+ #endif
210
+ servos[pin - SERVO_OFFSET].attach(pin);
211
+ }
212
+ }
213
+
214
+ // CMD = 09
215
+ // Write a value to the servo object.
216
+ void Dino::servoWrite() {
217
+ #ifdef debug
218
+ Serial.print("Servo write "); Serial.print(val); Serial.print(" to pin "); Serial.println(pin);
219
+ #endif
220
+ servos[pin - SERVO_OFFSET].write(val);
221
+ }
222
+
223
+ // CMD = 90
224
+ void Dino::reset() {
225
+ heartRate = 4000; // Default heartRate is ~4ms.
226
+ loopCount = 0;
227
+ analogDivider = 4; // Update analog listeners every ~16ms.
228
+ for (int i = 0; i < 22; i++) digitalListeners[i] = false;
229
+ for (int i = 0; i < 22; i++) digitalListenerValues[i] = 2;
230
+ for (int i = 0; i < 22; i++) analogListeners[i] = false;
231
+ lastUpdate = micros();
232
+ index = 0;
233
+ #ifdef debug
234
+ Serial.println("Reset the board to defaults. pin ");
235
+ #endif
236
+ sprintf(response, "ACK:%02d", A0);
237
+ }
238
+
239
+ // CMD = 97
240
+ // Set the analog divider. Powers of 2 up to 128 are valid.
241
+ void Dino::setAnalogDivider() {
242
+ analogDivider = val;
243
+ #ifdef debug
244
+ Serial.print("Analog divider set to "); Serial.println(analogDivider);
245
+ #endif
246
+ }
247
+
248
+ // CMD = 98
249
+ // Set the heart rate in milliseconds. Store it in microseconds.
250
+ void Dino::setHeartRate() {
251
+ int rate = val;
252
+ heartRate = (rate * 1000);
253
+ #ifdef debug
254
+ Serial.print("Heart rate set to "); Serial.print(heartRate); Serial.println(" microseconds");
255
+ #endif
256
+ }
257
+
@@ -0,0 +1,85 @@
1
+ /*
2
+ Library for dino ruby gem.
3
+ */
4
+
5
+ #ifndef Dino_h
6
+ #define Dino_h
7
+
8
+ #include "Arduino.h"
9
+ #include <Servo.h>
10
+
11
+ // Allocate listener storage based on what board we're running.
12
+ #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
13
+ # define PIN_COUNT 70
14
+ # define SERVO_OFFSET 22
15
+ #else
16
+ # define PIN_COUNT 22
17
+ # define SERVO_OFFSET 2
18
+ #endif
19
+
20
+ // Uncomment this line to enable debugging mode.
21
+ // #define debug true
22
+
23
+ class Dino {
24
+ public:
25
+ Dino();
26
+ void setupWrite(void (*writeCallback)(char *str));
27
+ void parse(char c);
28
+ void process();
29
+ void updateListeners();
30
+
31
+ private:
32
+ // Manage heartbeat and listeners.
33
+ long heartRate;
34
+ long lastUpdate;
35
+ unsigned int loopCount;
36
+ unsigned int analogDivider;
37
+
38
+ // Storage for enough analog and digital listeners for UNO or Nano board.
39
+ // Correspond to raw pin number by array index, and store boolean. false == disabled.
40
+ boolean analogListeners[PIN_COUNT];
41
+ boolean digitalListeners[PIN_COUNT];
42
+
43
+ // Keep track of the last read values for digital listeners. Only write responses when changed.
44
+ byte digitalListenerValues[PIN_COUNT];
45
+
46
+ // Request storage.
47
+ char request[8];
48
+ int index;
49
+ char cmdStr[3];
50
+ byte cmd;
51
+ char pinStr[3];
52
+ byte pin;
53
+ char valStr[4];
54
+ int val;
55
+
56
+ // Value and response storage.
57
+ int rval;
58
+ char response[8];
59
+ void (*_writeCallback)(char *str);
60
+ void writeResponse();
61
+
62
+ Servo servos[12];
63
+
64
+ // API-accessible functions.
65
+ void setMode ();
66
+ void dWrite ();
67
+ void dRead ();
68
+ void aWrite ();
69
+ void aRead ();
70
+ void addDigitalListener ();
71
+ void addAnalogListener ();
72
+ void removeListener ();
73
+ void servoToggle ();
74
+ void servoWrite ();
75
+ void reset ();
76
+ void setAnalogDivider ();
77
+ void setHeartRate ();
78
+
79
+ // Internal functions.
80
+ long timeSince (long event);
81
+ void updateDigitalListeners ();
82
+ void updateAnalogListeners ();
83
+ };
84
+
85
+ #endif