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.
@@ -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