Music Machine

Start 

Using a couple of sensors, this project with change the pitch of a piezo buzzer to create a simple musical instrument.

Modules 

Gather the following parts to complete this project.

Parts

All Parts
All Parts
Piezo Buzzer
Rotary Potentiometer
Light
Button
Cable
PartQuantity
Piezo Buzzer 1
Rotary Potentiometer 1
Light 1
Button 1
Cable 4

Light based Theremin 

A theremin is an electronic musical instrument that is controlled by moving your hands near the machine without actually touching it. Here we'll make something like that with a light sensor.

Take a cable and unwrap it. Plug one side into the buzzer socket and the other into Digital socket D6 to start making music. Take another cable and attach one end to the light sensor and the other to Analog socket A0.

All the parts you'll need
All the parts you'll need
Take a cable...
... and unwrap it
Plug one side into the buzzer socket
The other into any Digital socket
Take a cable...
... and unwrap it
Plug one side into the light sensor socket
The other into any Analog socket

Upload

Upload the code the below. This tutorial uses Analog socket A0 and Digital socket 6. If you are using a different socket update the code after copying it.

Download file Copy to clipboard
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
#define NOTE_C3  131
#define NOTE_CS3 139
#define NOTE_D3  147
#define NOTE_DS3 156
#define NOTE_E3  165
#define NOTE_F3  175
#define NOTE_FS3 185
#define NOTE_G3  196
#define NOTE_GS3 208
#define NOTE_A3  220
#define NOTE_AS3 233
#define NOTE_B3  247

int notes[7] = {NOTE_C3, NOTE_D3, NOTE_E3,
                NOTE_F3, NOTE_G3, NOTE_A3,
                NOTE_B3
               };

#define buzzerSocket 6
#define lightSensorSocket A0

int lightMin = 350;  // <-- This should be the lowest value that you get from your light sensor.
int lightMax = 750;  // <-- This should be the highest value that you get from your light sensor.
int freq = 0;

void setup() {

}

void loop() {
  freq = map(freq, lightMin, lightMax, 0, 6);  // Convert reading to note number between 0 and 6
  freq = constrain(freq, 0, 6);  // Make sure that the value stays between 0 and 6

  tone(buzzerSocket, notes[freq]);
}

Observe

There isn't a lot of control here. It plays notes all the time. So let's add some.

A Better Theremin 

Take a cable and unwrap it. Plug one side into the rotary potentiometer and the other into Analog socket A1. Take another cable and attach one end to a button and the other to Digital socket D4.

Take a cable...
Take a cable...
... and unwrap it
Plug one side into the rotary potentiometer socket
The other into Analog socket A1
Take a cable...
... and unwrap it
Plug one side into the button socket
The other into any Digital socket D4

Upload

Upload the code below. This tutorial uses Analog socket A1 and Digital socket 4. If you are using a different socket update the code after copying it.

Download file Copy to clipboard
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#define NOTE_B0  31
#define NOTE_C1  33
#define NOTE_CS1 35
#define NOTE_D1  37
#define NOTE_DS1 39
#define NOTE_E1  41
#define NOTE_F1  44
#define NOTE_FS1 46
#define NOTE_G1  49
#define NOTE_GS1 52
#define NOTE_A1  55
#define NOTE_AS1 58
#define NOTE_B1  62
#define NOTE_C2  65
#define NOTE_CS2 69
#define NOTE_D2  73
#define NOTE_DS2 78
#define NOTE_E2  82
#define NOTE_F2  87
#define NOTE_FS2 93
#define NOTE_G2  98
#define NOTE_GS2 104
#define NOTE_A2  110
#define NOTE_AS2 117
#define NOTE_B2  123
#define NOTE_C3  131
#define NOTE_CS3 139
#define NOTE_D3  147
#define NOTE_DS3 156
#define NOTE_E3  165
#define NOTE_F3  175
#define NOTE_FS3 185
#define NOTE_G3  196
#define NOTE_GS3 208
#define NOTE_A3  220
#define NOTE_AS3 233
#define NOTE_B3  247
#define NOTE_C4  262
#define NOTE_CS4 277
#define NOTE_D4  294
#define NOTE_DS4 311
#define NOTE_E4  330
#define NOTE_F4  349
#define NOTE_FS4 370
#define NOTE_G4  392
#define NOTE_GS4 415
#define NOTE_A4  440
#define NOTE_AS4 466
#define NOTE_B4  494
#define NOTE_C5  523
#define NOTE_CS5 554
#define NOTE_D5  587
#define NOTE_DS5 622
#define NOTE_E5  659
#define NOTE_F5  698
#define NOTE_FS5 740
#define NOTE_G5  784
#define NOTE_GS5 831
#define NOTE_A5  880
#define NOTE_AS5 932
#define NOTE_B5  988
#define NOTE_C6  1047
#define NOTE_CS6 1109
#define NOTE_D6  1175
#define NOTE_DS6 1245
#define NOTE_E6  1319
#define NOTE_F6  1397
#define NOTE_FS6 1480
#define NOTE_G6  1568
#define NOTE_GS6 1661
#define NOTE_A6  1760
#define NOTE_AS6 1865
#define NOTE_B6  1976
#define NOTE_C7  2093
#define NOTE_CS7 2217
#define NOTE_D7  2349
#define NOTE_DS7 2489
#define NOTE_E7  2637
#define NOTE_F7  2794
#define NOTE_FS7 2960
#define NOTE_G7  3136
#define NOTE_GS7 3322
#define NOTE_A7  3520
#define NOTE_AS7 3729
#define NOTE_B7  3951
#define NOTE_C8  4186
#define NOTE_CS8 4435
#define NOTE_D8  4699
#define NOTE_DS8 4978

#define buttonSocket 4
#define buzzerSocket 6
#define lightSensorSocket A0
#define dialSocket A1

int noteMatrix[5][7] = {
  {NOTE_C2, NOTE_D2, NOTE_E2, NOTE_F2, NOTE_G2, NOTE_A2, NOTE_B2},
  {NOTE_C3, NOTE_D3, NOTE_E3, NOTE_F3, NOTE_G3, NOTE_A3, NOTE_B3},
  {NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4, NOTE_B4},
  {NOTE_C5, NOTE_D5, NOTE_E5, NOTE_F5, NOTE_G5, NOTE_A5, NOTE_B5},
  {NOTE_C6, NOTE_D6, NOTE_E6, NOTE_F6, NOTE_G6, NOTE_A6, NOTE_B6}
};

int freq = 0;
int scale = 0;
int lightMin = 350;
int lightMax = 750;

void setup() {
  // put your setup code here, to run once:
  pinMode(buttonSocket, INPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  freq = analogRead(lightSensorSocket);
  freq = map(freq, lightMin, lightMax, 0, 6);
  freq = constrain(freq, 0, 6);
  scale = analogRead(dialSocket);
  scale = map(scale, 0, 1024, 0, 4);

  if (digitalRead(buttonSocket)) {
    tone(buzzerSocket, noteMatrix[freq][scale]);
  } else {
    noTone(buzzerSocket);
  }
}

Observe

Now by using the one hand over the light sensor and another on the potentiometer and button we have access to more notes. The button plays the note. The potentiometer changes the octave. The light sensor changes the note and you control the music!

FinishedFinished