2011_P18

Instrument Muzical

Descrierea proiectului

Proiectul presupune redarea sunetului a trei instrumente muzicale cu ajutorul tastaturii placutei EV/Z3.

Doua din cele trei instrumente, pianul si chitara, vor fi actionate de la tastatura placutei, sunetul fiind redat cu ajutorul unui player prin intermediul calculatorului Al treilea instrument, flautul, va fi  actionat  cu ajutorul  tastaturii placii, in schimb sunetul va fi redat prin buzzer-ul incorporat pe placuta EV/Z3.

Cerintele proiectului

Placa EV/Z3 se concteaza la  PC  prin seriala.

La PC  vom reda sunete cu ajutorul  programului MIDIPlayer.

La pornirea aplicatiei, pe display va fi afisat instrumentul selectat, presetat este Pianul.

Pentru a face comutarea intre cele trei instrumente : Pian, Flaut si Chitara; se vor apasa tastele 1,2 sau 3. Aplicatia mai permite si redarea unei melodii aflate in memorie, tasta 0, cat si modificarea frecventelor notelor flautului, tasta 4.

Pentru a iesi din modulul de selectare al instrumentului se va apasa pe orice tasta in afara celor 5  (0-4). Se va realiza saltul catre instrumentul dorit, pe display ramanand numele  instrumentului  selectat  pana  se  va  apasa  prima nota,  apoi  afisandu-se  nota apasata cu frecventa acesteia.

Codul sursa pentru acest lucru este urmatorul:

while(x>=0 && x<=4) // in functie de cifra selectata de pe placuta, se va afisa  instrumentul corespunzator

{   if(x==1)

kIo.DisplayString(pian);

else if(x==2)

kIo.DisplayString(flute);

else if(x==3)

kIo.DisplayString(chitara);

else if(x==4)

kIo.DisplayString(modfrec);

else if(x==0)

kIo.DisplayString(pppp);

else

goto select;

x = kIo.ReadKey(); }

select:

kIo.DisplayString(blank);

switch(ant)                //se selecteaza instrumentul dorit

{   case 1: goto pian; break;

case 2: goto flute; break;

case 3: goto chitara; break;

case 4: goto modfrec; break;

case 0: goto label; break; }

Pian

Pentru simularea comportamentului pianului s-au atribuit fiecarei taste de la 1

pana la 9 cate o frecventa din cadrul primei octave (frecventele alese sunt frecventele regasite la fiecare pian).

Pentru iesirea din pian, se va apasa o tasta A-F sau 0, taste neatribuite cu nici o nota. Saltul se va realiza inapoi la selectia instrumentului.

 

Codul sursa pentru afisarea fiecarei frecvente (am considerat numai partea intreaga a fiecarei frecvente) este urmatorul:

while(x>0 && x<10)

{  x = kIo.ReadKey(); //se citeste tasta apasata

if(x==1) //daca tasta este 1

{   char *nota="Nota pian1 - 73Hz    ";

kIo.DisplayString(nota); //afiseaza frecventa selectata

kIo.Sound(73,100);// este redat sunetul la frecventa de 73 Hz, intr-un interval de 100 de ns

}

else if(x==2) //daca tasta este 2

{   char *nota="Nota pian2 - 61Hz       ";

kIo.DisplayString(nota); //afiseaza frecventa selectata

kIo.Sound(61,100);// este redat sunetul la frecventa de 61 Hz, intr-un interval de 100 de ns

}

else if(x==3) //daca tasta este 3

{   char *nota="Nota pian3 - 55Hz       ";

kIo.DisplayString(nota); //afiseaza frecventa selectata

kIo.Sound(55,100);// este redat sunetul la frecventa de 55 Hz, intr-un interval de 100 de ns

}

else if(x==4) //daca tasta este 4

{   char *nota="Nota pian4 - 48Hz       ";

kIo.DisplayString(nota); //afiseaza frecventa selectata

kIo.Sound(48,100); // este redat sunetul la frecventa de 48 Hz, intr-un interval de 100 de ns

}

else if(x==5) //daca tasta este 5

{   char *nota="Nota pian5 - 43Hz       ";

kIo.DisplayString(nota); //afiseaza frecventa selectata

kIo.Sound(43,100);// este redat sunetul la frecventa de 43 Hz, intr-un interval de 100 de ns

}

else if(x==6) //daca tasta este 6

{   char *nota="Nota pian6 - 41Hz       ";

kIo.DisplayString(nota);  //afiseaza frecventa selectata

kIo.Sound(41,100);// este redat sunetul la frecventa de 41 Hz, intr-un interval de 100 de ns

}

else if(x==7) //daca tasta este 7

{   char *nota="Nota pian7 - 32Hz       ";

kIo.DisplayString(nota); //afiseaza frecventa selectata

kIo.Sound(32,100);// este redat sunetul la frecventa de 32 Hz, intr-un interval de 100 de ns

}

else if(x==8) //daca tasta este 8

{   char *nota="Nota pian8 - 30Hz       ";

kIo.DisplayString(nota); //afiseaza frecventa selectata

kIo.Sound(30,100);// este redat sunetul la frecventa de 30 Hz, intr-un interval de 100 de ns

}

else if(x==9) //daca tasta este 9

{   char *nota="Nota pian9 - 27Hz       ";

kIo.DisplayString(nota); //afiseaza frecventa selectata

kIo.Sound(27,100);// este redat sunetul la frecventa de 27 Hz, intr-un interval de 100 de ns

}

Chitara

Functionalitatea unei chitari a fost simulata tinand cont doar de cele sase corzi, fara a lua in  calcul posibilitatea modificarii frecventei corzilor.

La apasarea unei taste (1-6) pe display va fi afisata ‘coarda apasata’ si frecventa acesteia.

Pentru  a  realiza  iesirea din simularea chitarei, se  va apasa una dintre tastele neatribuite unei corzi (0, 7-F)

 

Flaut

Functionalitatea flautului a fost simulata in mod asemanator cu cele ale chitarei si pianului,   variind   doar  frecventa  si  numarul  tastelor  ce  simuleaza  iesirile  din  cadrul flautului, trei la numar.

Pentru iesirea din programul de simulare a fluierului se va apasa orice tasta intre 4-F sau tasta 0.

Componente

INT 10H

Aceasta intrerupere comanda emiterea de sunete cu buzzer-ul. Este posibil

specificarea frecventei si duratei sunetului emis.

INPUT BX = duration

CX = frequency

OUTPUT none Altered none Registers

Z3ev_io.c

S-au implementat trei functii specializate: Afisare, Sound si Pred (predefinit)

Sound are ca parametrii frecventa si durata sunetului de redat, avand rolul de a accesa intreruperea buzzerului (10H), iar functia Pred are rolul de a reda o succesiune de frecvente predefinite si  de a accesa intreruperea de buzzer pentru fiecare frecventa in parte.

Codul sursa a acestor doua functii este urmatorul:

void z3Sound(int frec, int dura)
{
//frec = mentioneaza frecventa sunetului

//dura = mentioneaza durata sunetului
asm {
mov AX,0
MOV  AH,00H
MOV  AL,00H
INT  12H    ;//intrerupere pentru interfata paralela
MOV BX,dura        ;// se memoreaza durata unui sunet, durata este de 100 ns
MOV  CX,frec    ;// se memoreaza frecventa sunetului
INT  10H    ;// intreruperea pentru emiterea sunetelor cu ajutorul buzzer-ului
MOV AX,1
INT 0DH
}
}


void z3Pred(void)
{
// vectorul v retine frecventele fiecarei note, acestea fiind pe urma scrise in registrul CX  inainte de a se apela intreruperea Buzzerului, 10H, pentru fiecare nota in parte.
int dura=100,frec; // declaratii ale vectorului de frecvente si a duratei unui sunet
int v[25]={27,27,30,27,32,30,27,27,30,27,41,32,27,27,61,48,41,32,30,55,55,48,41,43,41}; //vectorul de frecvente pentru melodia predefinita
int i=0;
while(i<25)
{
frec=v[i];
asm {
mov AX,0
MOV  AH,00H
MOV  AL,00H
INT  12H   ; // intrerupere pentru interfata paralela
MOV BX,dura        ;//se memoreaza durata unui sunet, durata este de 100 ns

MOV  CX,frec    ;//se memoreaza frecventa sunetului

INT  10H    ;// intreruperea pentru emiterea sunetelor cu ajutorul buzzer-ului
MOV AX,1
INT 0DH
}
i++;
}
}

Functia de Afisare primeste ca parametru frecventa introdusa de la tastatura, o converteste intr-un string dupa care o afiseaza pe display-ul EVZ3.

Algoritmul se bazeaza pe impartirea numarului cu rest la 10 si pe urma impartirea numarului la  10, adaugarea resturilor intr-un vector de caractere, pornind de la dreapta spre stanga, exact in ordinea obtinerii resturilor. Pe pozitiile imediat urmatoare inserarii frecventei, se vor adauga caracterele H si z, de la Hertz.

 

Status

27 aprilie - implementarea functiilor de afisare si sound

5 mai - implementarea instrumentelor muzicale

17 mai - testarea buzzer-ului