pedalboard 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.rspec +1 -0
- data/.rvmrc +1 -0
- data/.travis.yml +9 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +65 -0
- data/README.md +25 -0
- data/bin/pedalboard +6 -0
- data/du/Dino.cpp +257 -0
- data/du/Dino.h +85 -0
- data/du/du.ino +19 -0
- data/examples/main_stage.rb +57 -0
- data/lib/pedalboard.rb +22 -0
- data/lib/pedalboard/cli.rb +21 -0
- data/lib/pedalboard/commands.rb +44 -0
- data/lib/pedalboard/components/base_component.rb +20 -0
- data/lib/pedalboard/components/led.rb +28 -0
- data/lib/pedalboard/components/pedal.rb +52 -0
- data/lib/pedalboard/components/pot.rb +78 -0
- data/lib/pedalboard/device.rb +32 -0
- data/lib/pedalboard/dsl_parser.rb +25 -0
- data/lib/pedalboard/version.rb +11 -0
- data/pedalboard.gemspec +27 -0
- data/spec/spec_helper.rb +5 -0
- data/spec/unit/pedalboard/cli_spec.rb +40 -0
- data/spec/unit/pedalboard/components/led_spec.rb +43 -0
- data/spec/unit/pedalboard/components/pedal_spec.rb +34 -0
- data/spec/unit/pedalboard/components/pot_spec.rb +54 -0
- data/spec/unit/pedalboard/device_spec.rb +47 -0
- data/spec/unit/pedalboard/dsl_parser_spec.rb +64 -0
- data/spec/unit/pedalboard_spec.rb +79 -0
- metadata +165 -0
checksums.yaml
ADDED
@@ -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
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -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
|
data/README.md
ADDED
@@ -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
|
data/bin/pedalboard
ADDED
data/du/Dino.cpp
ADDED
@@ -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
|
+
|
data/du/Dino.h
ADDED
@@ -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
|