-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathHeartPulse_Synth.ino
More file actions
111 lines (88 loc) · 2.45 KB
/
HeartPulse_Synth.ino
File metadata and controls
111 lines (88 loc) · 2.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include <SoftwareSerial.h>
//Definitions
//MIDI
#define VS1053_RX 2
#define VS1053_RESET 9
#define VS1053_BANK_DEFAULT 0x00
#define VS1053_BANK_DRUMS1 0x78
#define VS1053_BANK_DRUMS2 0x7F
#define VS1053_BANK_MELODY 0x79
#define VS1053_GM1_SOUND 15
#define MIDI_NOTE_ON 0x90
#define MIDI_NOTE_OFF 0x80
#define MIDI_CHAN_MSG 0xB0
#define MIDI_CHAN_BANK 0x00
#define MIDI_CHAN_VOLUME 0x07
#define MIDI_CHAN_PROGRAM 0xC0
SoftwareSerial VS1053_MIDI(0, 2);
//Heartbeat
const int HR_RX = 5;
int ledPin = 4;
byte oldSample, sample;
void setup() {
Serial.begin(9600);
VS1053_MIDI.begin(31250);
//Heartrate
pinMode (HR_RX, INPUT); //Signal pin to input
pinMode (ledPin, OUTPUT);
Serial.println("Waiting for heart beat...");
while (!digitalRead(HR_RX)) {};
Serial.println ("Heart beat detected!");
//Synth
pinMode(VS1053_RESET, OUTPUT);
digitalWrite(VS1053_RESET, LOW);
delay(10);
digitalWrite(VS1053_RESET, HIGH);
delay(10);
midiSetChannelBank(0, VS1053_BANK_MELODY);
midiSetInstrument(0, VS1053_GM1_SOUND);
midiSetChannelVolume(0, 100);
}
void loop() {
sample = digitalRead(HR_RX); //Store signal output
if (sample && (oldSample != sample)) {
Serial.println("beat");
midiNoteOn(0, 60, 127);
delay(sample);
midiNoteOff(0, oldSample, 127);
delay(oldSample);
};
oldSample = sample; //Store last signal received
}
void midiSetInstrument(uint8_t chan, uint8_t inst) {
if (chan > 15) return;
inst --;
if (inst > 127) return;
VS1053_MIDI.write(MIDI_CHAN_PROGRAM | chan);
VS1053_MIDI.write(inst);
}
void midiSetChannelVolume(uint8_t chan, uint8_t vol) {
if (chan > 15) return;
if (vol > 127) return;
VS1053_MIDI.write(MIDI_CHAN_MSG | chan);
VS1053_MIDI.write(MIDI_CHAN_VOLUME);
VS1053_MIDI.write(vol);
}
void midiSetChannelBank(uint8_t chan, uint8_t bank) {
if (chan > 15) return;
if (bank > 127) return;
VS1053_MIDI.write(MIDI_CHAN_MSG | chan);
VS1053_MIDI.write((uint8_t)MIDI_CHAN_BANK);
VS1053_MIDI.write(bank);
}
void midiNoteOn(uint8_t chan, uint8_t n, uint8_t vel) {
if (chan > 15) return;
if (n > 127) return;
if (vel > 127) return;
VS1053_MIDI.write(MIDI_NOTE_ON | chan);
VS1053_MIDI.write(n);
VS1053_MIDI.write(vel);
}
void midiNoteOff(uint8_t chan, uint8_t n, uint8_t vel) {
if (chan > 15) return;
if (n > 127) return;
if (vel > 127) return;
VS1053_MIDI.write(MIDI_NOTE_OFF | chan);
VS1053_MIDI.write(n);
VS1053_MIDI.write(vel);
}