piano keyboard
9 berichten
• Pagina 1 van 1
- hans50-dec
- Berichten: 12
- Geregistreerd: 15 Dec 2016, 19:45
piano keyboard
Beste leden,
Onlangs heb ik een piano gemaakt met de arduino uno en het music instrument shield. Het werkt perfect maar slechts 1 toon tegelijk. Hoe krijg ik het voor elkaar dat het keyboard polyfoon wordt?
Iedere toets heeft een schakelaar die met een weerstandsladder op de A0-poort wordt uitgelezen.
Hieronder de code van het geheel.
Iedere hulp is zeer welkom. Een warme groet vanuit Colombia.
Onlangs heb ik een piano gemaakt met de arduino uno en het music instrument shield. Het werkt perfect maar slechts 1 toon tegelijk. Hoe krijg ik het voor elkaar dat het keyboard polyfoon wordt?
Iedere toets heeft een schakelaar die met een weerstandsladder op de A0-poort wordt uitgelezen.
Hieronder de code van het geheel.
Iedere hulp is zeer welkom. Een warme groet vanuit Colombia.
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); //Soft TX on 3, we don't use RX in this code
byte note = 0; //The MIDI note value to be played
byte resetMIDI = 4; //Tied to VS1053 Reset line
byte ledPin = 13; //MIDI traffic indicator
int instrument = 4; //choose from list above
//int flash = 8; // when no button is pressed => led blink
int C0 = 5; // when button pressed
int D = 6; // when button pressed
int E = 7; // when button pressed
int F = 8; // when button pressed
int G = 9; // when button pressed
int A = 10; // when button pressed
int B = 11; // when button pressed
int C1 = 12; // when button pressed
int val = 0;
const int analogPin = A0;
int b = 0;
void setup() {
// pinMode(flash, OUTPUT); // Set digital pin 5 as OUTPUT pin
pinMode(C0, OUTPUT); // Set digital pin as OUTPUT pin
pinMode(D, OUTPUT); // Set digital pin as OUTPUT pin
pinMode(E, OUTPUT); // Set digital pin as OUTPUT pin
pinMode(F, OUTPUT); // Set digital pin as OUTPUT pin
pinMode(G, OUTPUT); // Set digital pin as OUTPUT pin
pinMode(A, OUTPUT); // Set digital pin as OUTPUT pin
pinMode(B, OUTPUT); // Set digital pin as OUTPUT pin
pinMode(C1, OUTPUT); // Set digital pin as OUTPUT pin
Serial.begin(57600);
//Setup soft serial for MIDI control
mySerial.begin(31250);
//Reset the VS1053
pinMode(resetMIDI, OUTPUT);
digitalWrite(resetMIDI, LOW);
delay(100);
digitalWrite(resetMIDI, HIGH);
delay(100);
}
void loop() {
talkMIDI(0xB0, 0x07, 126); //0xB0 is channel message, set channel volume to near max (127)
Serial.println("Basic Instruments");
talkMIDI(0xB0, 0, 0x00); //Default bank GM1
{
Serial.print(" Instrument: ");
Serial.println(instrument, DEC);
talkMIDI(0xC0, instrument, 0); //Set instrument number. 0xC0 is a 1 data byte command
// get the analog value for the button pressed
val = analogRead(analogPin);
if (val>1000)
{
b = 0; // buttons have not been pressed
}
else if (val>=0 && val<289)
{
b = 8; // button 8 pressed "C1"
}
else if (val>290 && val<360)
{
b = 7; // button 7 pressed "B"
}
else if (val>380 && val<550)
{
b = 6; // button 6 pressed "A"
}
else if (val>560 && val<630)
{
b = 5; // button 5 pressed "G"
}
else if (val>640 && val<690)
{
b = 4; // button 4 pressed "F"
}
else if (val>695 && val<745)
{
b = 3; // button 3 pressed "E"
}
else if (val>750 && val<780)
{
b = 2; // button 2 pressed "D"
}
else if (val>785 && val<800)
{
b = 1; // button 1 pressed "C0"
}
//play the notes
if (b==0)
{
noteOff(0, note, 0);
//digitalWrite(flash, HIGH);
}
else if (b==8)
{
// button 8 pressed "C1"
//digitalWrite(flash, LOW);
noteOn(0, 72, 127);
digitalWrite(C1, HIGH);
delay(50);
noteOff(0, 72, 127);
delay(50);
digitalWrite(C1, LOW);
}
else if (b==7)
{
// button 7 pressed "B"
//digitalWrite(flash, LOW);
noteOn(0, 71, 127);
delay(50);
digitalWrite(B, HIGH);
noteOff(0, 71, 127);
delay(50);
digitalWrite(B, LOW);
}
else if (b==6)
{
// button 6 pressed "A"
//digitalWrite(flash, LOW);
noteOn(0, 69, 127);
delay(50);
digitalWrite(A, HIGH);
noteOff(0, 69, 127);
delay(50);
digitalWrite(A, LOW);
}
else if (b==5)
{
// button 5 pressed "G"
//digitalWrite(flash, LOW);
noteOn(0, 67, 127);
delay(50);
digitalWrite(G, HIGH);
noteOff(0, 67, 127);
delay(50);
digitalWrite(G, LOW);
}
else if (b==4)
{
// button 4 pressed "F"
//digitalWrite(flash, LOW);
noteOn(0, 65, 127);
delay(50);
digitalWrite(F, HIGH);
noteOff(0, 65, 127);
delay(50);
digitalWrite(F, LOW);
}
else if (b==3)
{
// button 3 pressed "E"
//digitalWrite(flash, LOW);
noteOn(0, 64, 127);
delay(50);
digitalWrite(E, HIGH);
noteOff(0, 64, 127);
delay(50);
digitalWrite(E, LOW);
}
else if (b==2)
{
// button 2 pressed "D"
//digitalWrite(flash, LOW);
noteOn(0, 62, 127);
delay(50);
digitalWrite(D, HIGH);
noteOff(0, 62, 127);
delay(50);
digitalWrite(D, LOW);
}
else if (b==1)
{
// button 1 pressed "C0"
//digitalWrite(flash, LOW);
noteOn(0, 60, 127);
delay(50);
digitalWrite(C0, HIGH);
noteOff(0, 60, 127);
delay(50);
digitalWrite(C0, LOW);
}
}
}
//Send a MIDI note-on message. Like pressing a piano key, channel ranges from 0-15
void noteOn(byte channel, byte note, byte attack_velocity)
{
talkMIDI( (0x90 | channel), note, attack_velocity); // 0x90 = note on
}
//Send a MIDI note-off message. Like releasing a piano key
void noteOff(byte channel, byte note, byte release_velocity)
{
talkMIDI( (0x80 | channel), note, release_velocity); // 0x80 = note off (0x=hex, 80=128)
}
//Plays a MIDI note. Doesn't check to see that cmd is greater than 127, or that data values are less than 127
void talkMIDI(byte cmd, byte data1, byte data2) {
digitalWrite(ledPin, HIGH);
mySerial.write(cmd);
mySerial.write(data1);
//Some commands only have one data byte. All cmds less than 0xBn have 2 data bytes
//(sort of: http://253.ccarh.org/handout/midiprotocol/)
if( (cmd & 0xF0) <= 0xB0)
mySerial.write(data2);
digitalWrite(ledPin, LOW);
}
Advertisement
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: piano keyboard
Vrijwel zeker niet. Als je 2 toetsen bijv. indrukt sluit je een deel van de ladder kort en gaat een van de toetsen verloren. Je had er beter aan gedaan om bijv. een schuifregister te gebruiken en zo elke toets individueel inlezen. Daarna kun je dan de reeks aflopen. Dat is de input kant. Dan heb je nog de uitvoerkant. Note() is volgens mij een toon tegelijk. Voor de midi kant zal het wel lukken.
Re: piano keyboard
Voor een Arduino Uno:
pin 0,1 : voor verbinding met computer.
Pin 2,3 : SoftwareSerial
Pin 5,6,7,8,9,10,11,12
Dan heb je nog over : pin 4,13,A0,A1,A2,A3,A4,A5.
Als je iedere toets aan een digitale ingang verbind, dan heb je 8 ingangen nodig, dus kan het net. Of je laat die uitgangen vervallen, zijn het alleen maar ledjes ?
Pin 13 als ingang werkt alleen goed als de Uno een 'R3' versie is.
De analoge pinnen zijn ook digitale pinnen.
pin 0,1 : voor verbinding met computer.
Pin 2,3 : SoftwareSerial
Pin 5,6,7,8,9,10,11,12
Dan heb je nog over : pin 4,13,A0,A1,A2,A3,A4,A5.
Als je iedere toets aan een digitale ingang verbind, dan heb je 8 ingangen nodig, dus kan het net. Of je laat die uitgangen vervallen, zijn het alleen maar ledjes ?
Pin 13 als ingang werkt alleen goed als de Uno een 'R3' versie is.
De analoge pinnen zijn ook digitale pinnen.
- hans50-dec
- Berichten: 12
- Geregistreerd: 15 Dec 2016, 19:45
Re: piano keyboard
Dank Nico voor je snelle reactie, loopt tegen tienen in Nederland zie ik. Hier is het nog volop middag en heerlijk warm.
Ik ga even op zoek hoe ik dat oplos met dat schuifregister. Voor 29 januari a.s. wil ik het wel voor elkaar hebben omdat we dan een presentatie hebben. Met een schuifregister zou ik ook schakelaars kunnen uitlezen om een 'drie-op-een-rij' te kunnen maken denk ik. Daarvoor moeten de schakelaars worden gekoppeld met lampjes onder plexiglas tegels. Twee spelers tegen elkaar.
Jammer dat ik geen foto's kan plaatsen.
@Koepel,de uitgangen sturen, via een relais, ledjes aan maar die ga ik vervangen door kleine gloeilampjes. De lichtopbrengst is met leds niet genoeg.
BTW ik gebruik een Arduino Uno R3
Ik ga even op zoek hoe ik dat oplos met dat schuifregister. Voor 29 januari a.s. wil ik het wel voor elkaar hebben omdat we dan een presentatie hebben. Met een schuifregister zou ik ook schakelaars kunnen uitlezen om een 'drie-op-een-rij' te kunnen maken denk ik. Daarvoor moeten de schakelaars worden gekoppeld met lampjes onder plexiglas tegels. Twee spelers tegen elkaar.
Jammer dat ik geen foto's kan plaatsen.
@Koepel,de uitgangen sturen, via een relais, ledjes aan maar die ga ik vervangen door kleine gloeilampjes. De lichtopbrengst is met leds niet genoeg.
BTW ik gebruik een Arduino Uno R3
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: piano keyboard
Met schuifregisters is het eigenlijk vrij rechttoe rechtaan. gewoon doorlussen. Bijvoorbeeld deze info : https://www.arduino.cc/en/Tutorial/ShiftIn
En dan kan je gelijk de zwarte toetsen ook meenemen. 9 stuks in serie en je hebt 72 toetsen. 6 oktaven. Dan wordt het al wat...
En dan kan je gelijk de zwarte toetsen ook meenemen. 9 stuks in serie en je hebt 72 toetsen. 6 oktaven. Dan wordt het al wat...
Re: piano keyboard
In theorie kun je met een analoge ingang 10 bits inlezen. de weerstanden moeten dan in een R/2R netwerk.
in praktijk begin eens met 4 drukknoppen per analoge ingang want de weerstanden hebben nogal wat spreiding.
je hebt 6 ingangen dus 24 knoppen is geen probleem.
uitgang tonemultiply kan voldoende zijn, en natuurlijk jouw midi werkt ook.
in praktijk begin eens met 4 drukknoppen per analoge ingang want de weerstanden hebben nogal wat spreiding.
je hebt 6 ingangen dus 24 knoppen is geen probleem.
uitgang tonemultiply kan voldoende zijn, en natuurlijk jouw midi werkt ook.
paul deelen
shooter@home.nl
shooter@home.nl
- hans50-dec
- Berichten: 12
- Geregistreerd: 15 Dec 2016, 19:45
Re: piano keyboard
Beste mensen,
Dank voor jullie suggesties, ik ga ermee aan de slag. Bijgaand wat foto's van de piano. Alleen de witte toetsen werken, de zwarte is een opgeplakte folie. Wellicht voor een volgend bouwsel ga ik dit nog aanpassen maar voorlopig is dit voldoende.
Dank voor jullie suggesties, ik ga ermee aan de slag. Bijgaand wat foto's van de piano. Alleen de witte toetsen werken, de zwarte is een opgeplakte folie. Wellicht voor een volgend bouwsel ga ik dit nog aanpassen maar voorlopig is dit voldoende.
- Bijlagen
-
- IMG_20161208_161506203.jpg (52.02 KiB) 7685 keer bekeken
-
- IMG_20161208_103600006.jpg (77.72 KiB) 7685 keer bekeken
-
- piano
- IMG_20161209_142016075.jpg (63.13 KiB) 7685 keer bekeken
- hans50-dec
- Berichten: 12
- Geregistreerd: 15 Dec 2016, 19:45
Re: piano keyboard
Hieronder nog 2 foto's van de kinderen die met de huidige piano "muziek" maken. Dit zijn kinderen uit zeer arme wijken die nog nooit in hun leven een echte piano gezien, laat staan aangeraakt hebben. Dus voor hen was het een unieke ervaring.
De foto's zijn gedraaid omdat het forum staande foto's niet toestaat.
Vriendelijke groet,
Hans Schuurmans
De foto's zijn gedraaid omdat het forum staande foto's niet toestaat.
Vriendelijke groet,
Hans Schuurmans
- Bijlagen
-
- IMG_20161214_102219865_HDR.jpg (67.93 KiB) 7685 keer bekeken
-
- IMG_20161213_145407098.jpg (73.86 KiB) 7685 keer bekeken
Re: piano keyboard
ik zou zeker eens kijken naar een touch sensor, dan heb je eigenlijk geen mechanica meer nodig.
ik zie daar een paar kids staan, die het ding graag in mekaar maken voor jou hoor.
heel leuk project, en veel fun
als je wat nodig hebt, dan kun je het altijd vragen.
ik zie daar een paar kids staan, die het ding graag in mekaar maken voor jou hoor.
heel leuk project, en veel fun
als je wat nodig hebt, dan kun je het altijd vragen.
paul deelen
shooter@home.nl
shooter@home.nl
9 berichten
• Pagina 1 van 1
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 10 gasten