piano keyboard

Hardware die niet past in bovenstaande onderwerpen
Berichten: 12
Geregistreerd: 15 Dec 2016, 19:45

piano keyboard

Berichtdoor hans50-dec » 17 Dec 2016, 21:47

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.

#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

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: piano keyboard

Berichtdoor nicoverduin » 17 Dec 2016, 21:53

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.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: piano keyboard

Berichtdoor Koepel » 17 Dec 2016, 22:24

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.

Berichten: 12
Geregistreerd: 15 Dec 2016, 19:45

Re: piano keyboard

Berichtdoor hans50-dec » 17 Dec 2016, 22:28

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

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: piano keyboard

Berichtdoor nicoverduin » 18 Dec 2016, 00:57

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...
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: piano keyboard

Berichtdoor shooter » 18 Dec 2016, 12:44

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.
paul deelen
shooter@home.nl

Berichten: 12
Geregistreerd: 15 Dec 2016, 19:45

Re: piano keyboard

Berichtdoor hans50-dec » 18 Dec 2016, 16:04

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.
Bijlagen
IMG_20161208_161506203.jpg
IMG_20161208_161506203.jpg (52.02 KiB) 7618 keer bekeken
IMG_20161208_103600006.jpg
IMG_20161208_103600006.jpg (77.72 KiB) 7618 keer bekeken
IMG_20161209_142016075.jpg
piano
IMG_20161209_142016075.jpg (63.13 KiB) 7618 keer bekeken

Berichten: 12
Geregistreerd: 15 Dec 2016, 19:45

Re: piano keyboard

Berichtdoor hans50-dec » 18 Dec 2016, 16:07

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
Bijlagen
IMG_20161214_102219865_HDR.jpg
IMG_20161214_102219865_HDR.jpg (67.93 KiB) 7618 keer bekeken
IMG_20161213_145407098.jpg
IMG_20161213_145407098.jpg (73.86 KiB) 7618 keer bekeken

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: piano keyboard

Berichtdoor shooter » 22 Dec 2016, 21:14

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.
paul deelen
shooter@home.nl

Terug naar Overige hardware

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 6 gasten