2011_P4

INSTRUMENT MUZICAL

Project Description

Proiectul de față realizează un instrument muzical extern (external device) care sa redea notele selectare intr-un player pe un calculator (Personal Computer).

Project Requirements

Pe post de instrument muzical se foloseste placuta EV-Z3 disponibila in platforma de laborator.

De la tastatura acestei placuțe utilizatorul iși construiește melodia care mai apoi va fi redată pe PC folosind conexiunea seriala.

La placa EV/Z3 utilizatorul va alege unul din cele 2 intrumente puse la dispozitie.

In pasul urmator utilizatorul va alege o gama (3 game pentru fiecare instrument - se pot folosi 3 butoane).

Pentru a canta utilizatorul va apasa tastele placii, fiecare tasta reprezentand o nota.

User Flow

Instrumentele alese de noi sunt chitară respectiv pian.

 

Modul de constructie a unei melodii este urmatorul:

  • Initial pe afisajul placutei va aparea un mesaj pentru alegerea instrumentului.
  • Utilizatorul va apasa o tasta pentru alegerea instrumentului respectiv:
    • 0- chitara
    • 1- pian

Observatie!

Exista posibilitatea extinderii numarului de instrumente.

  • Mai departe, pe afisajul LCD al placii va aparea un mesaj in care se mentioneaza posibilitatea alegerii  gamei.
  • Utilizatorul va apasa o tasta pentru alegerea gamei:
    • 0 – gama 1
    • 1 – gama 3
    • 2 – gama 5

Observatie!

Exista posibilitatea cresterii numarului gamelor. S-au ales aceste game si acest numar pentru simplitate si in scop demonstrativ.

  • In urmatorul pas, utilizatorul poate canta apasand tastele corespunzatoare fiecarei note:
  • 0  - C = Do
  • 1 - D = Re
  • 2 - E = Mi
  • 3 - F = Fa
  • 4 - G = Sol
  • 5 - A = La
  • 6 - B = Si

Observatie!

  • Tasta 7 - reprezinta incheierea sesiunii de cantat
  • Tasta 8 - reprezinta alegerea schimbarii instrumentului
  • Tasta 9 - reprezinta alegerea schimbarii gamei in cazul in care se doreste ca nota urmatoare sa fie cantata in alta gama decat cea curenta

Transmiterea si redarea notelor:

  • De la placa EV/Z3 se transmit mesajele MIDI prin portul serial COM1 catre calculator.
  • Mesajele MIDI codifica instrumentul, gama si nota aleasa in 3 bytes de mesaj.
  • Sunt folosite 3 tipuri de mesaje: un mesaj pentru instrument si alte doua pentru nota si gama
  • In tabel veti gasi reprezentarile binare ale mesajelor MIDI si semnficatia octetilor.
  • Mesajele MIDI (datele binare) sunt preluate de MIDI Serial Converter de la portul COM1 si sunt trimise mai departe catre portul de iesire MIDI-OUT.
  • La portul MIDI-OUT al convertorului vom conecta portul MIDI-IN al playerului MIDI  Power Sequencer Plus ( mai multe detalii la sectiunea Required Components).
  • Power Sequencer Plus citeste datele binare de la portul MIDI-IN si interpreteaza instructiunile codificate in bitii primiti redand notele in gama si instrumentul ales folosind Microsoft GS Wavetable SW Synth (cu rolul de a crea respectivele sunete).

Nota:

Formatul MIDI reprezinta un standard folosit in inter-comunicarea cu precadere dintre dispozitivele muzicale (software si/sau hardware).Acesta consta in instructiuni codificate sub forma de mesaje, astfel incat ele sa ajute la redarea melodiilor sau a fisierelor media fara a fi nevoie de  transferul acestor fisiere. Practic software-ul care primeste mesajul MIDI isi construieste singur sunetele pe baza instructiunilor primite.

(Pentru mai multe informatii despre MIDI: www.midi.org)

 

 

Mesajele MIDI folosite:

  1. pentru alegerea instrumentului:

Program Change Message (1100xxxx) este mesajul trimis calculatorului de instrumentul muzical

(in general) respectiv de placa EV/Z3 in cazul nostru, avand urmatoarele formate standard pentru chitara si pian

 

Status Byte

Data Byte (1)

Data Byte (2)

11000000(Canal 1)

00000001 (Pian)

00000000

11000000 (Canal 1)

00011001 (Chitara)

00000000

 

2. pentru transmiterea unei note:

Note-on message (1001xxxx - mesaj transmis cand o nota este apasata  =  inceputul notei)

Status Byte

Data Byte (1)

Data Byte (2)

10010000(Canal 1)

0kkkkkkk

01000000(velocitatea)

 

 

 

 

Note-off message (1000xxxx - mesaj transmis cand o nota este eliberata  = sfarsitul notei)

Status Byte

Data Byte (1)

Data Byte (2)

10000000(Canal 1)

0kkkkkkk

01000000(velocitatea)

 

 

 

Observatie!

  • Transmiterea unei note care sa fie redata de un player  este echivalenta cu transmiterea unei perechi de mesaje Note-on – Note-off,  adica a 6 bytes.
  • k k k k k k k = key (nota) - se regasesc in tabelul de mai jos in decimal.
  • Velocitatea = forta sau puterea sunetului (aleasa constanta).
  • xxxx0000 = LS Byte (ultimii 4 biti) reprezinta canalul 1 pe care se realizeaza conexiunea (in standardul MIDI se pot folosi 16 canale de transmisie simultan).

Gama

Nota

Decimal

Cod Binar (k k k k k k k)

1.

C = Do

36

0100100

D = Re

38

0100110

E = Mi

40

0101000

F = Fa

41

0101001

G = Sol

43

0101011

A = La

45

0101101

B = Si

47

0101111

3.

C = Do

60

0111100

D = Re

62

0111110

E = Mi

64

1000000

F = Fa

65

1000001

G = Sol

67

1000011

A = La

69

1000101

B = Si

71

1000111

5.

C = Do

84

1010100

D = Re

86

1010110

E = Mi

88

1011000

F = Fa

89

1011001

G = Sol

91

1011011

A = La

93

1011101

B = Si

95

1011111

.

Required components

Hardware:

  • Placuta EV/Z3
  • Personal Computer

Software:

Serial Midi Converter este un software ce primeste de la un port serial format MIDI si il trimite mai departe unui software sau hardware MIDI:

Aceasta transmisie se realizeaza cu ajutorul unui alt software MIDI YOKE (http://www.midiox.com/) carecreeaza porturi virtuale MIDI. Porturile virtuale MIDI-IN si MIDI-OUT sunt folosite impreuna cu Power Sequencer Plus si MIDI Serial Converter. Mai multe detalii puteti gasi pe linkurile atasate.

Software Design

Aplicatia contine 4 sectiuni importante.


Prima reprezinta partea de defintii si initializare:

#include "platform_io.h"

//sectiunea defineste diferite mesaje care vor fi afisate pe LED-ul placi Z3/EV pentru interactiunea cu utilizatorul

const char *alege="Alege instrumentul";

...........................................................

static SerialConfig serialConf;

unsigned char buffer[3];             //aici se pun cei trei bytes necesari playerului midi

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

int main()

{

//declararea de variabile locale

// x = retine tasta apasata de utilizator

// choice = selectia gamei. Valorile vor fi 1,2 sau 3. In functie de choice din vectorul Gama se vor construi notele

// instrument = valoarea intrumentului selectat: 1 sau 31

char x, choice = 0, Instrument = 0;

int note; //   valoarea intreaga a notei plaja conform tabelului de mai jos.

int bCorrectSelection = 0; //   indicativ boolean daca selectia a fost corecta sau nu

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

//   Constants

//   constantele sunt definite conform protocolului descris mai sus.

int StatusByteProgramChange = 192; //11000000

....................................................................

/* Serial Initialization */

serialConf.baudRate   = b9600;

.................................................

kIo.SerialInit(&serialConf);

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

Partea a doua este selectia instrumentului. Pentru selectarea unui instrument se va intra intr-un ciclu in care se va iesi doar daca utilizatorul introduce o valoare corecta: 0 sau 1 – bCorrectSelection = 1.

choose_instrument:

do

{

bCorrectSelection = 0;

kIo.DisplayString(alege);

//   readkey

x=kIo.ReadKey();

//   check selection

switch (x)

{

case 0: //   chitara

{   Instrument = Guitar;    bCorrectSelection = 1;    break;    }

....      //   asemanator si pentru celelalte instrumente

default:
//   daca se alege o tasta gresita, se afiseaza mesaj de eroare si se verifica o noua introducere de la tastatura

{    kIo.DisplayString(alege_altul);    kIo.Wait(1000);    break;    }

}while (bCorrectSelection == 0);

 

 

bCorrectSelection = 0;

//se va trimite pe portul serial mesaj de schimbare a instrumentului(program Change)

//send to serial port

if (x == 0 || x == 0x0A)

{

buffer[0] = StatusByteProgramChange;

buffer[1] = Instrument;

buffer[2] = 0;

}

//trimitere efectiva pe serial catre PC

kIo.SerialWrite(COM1, buffer, 3);

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

Partea a treia reprezinta selectia gamei. Acelasi principiu ca in ciclul de mai sus, doar ca selectia se retine in variabila choice.

choose_scale:

do   {

bCorrectSelection = 0;

kIo.DisplayString(gama);

x = kIo.ReadKey();

switch (x)

{

// gama 1

case 0:

{   bCorrectSelection = 1;   choice = 1;   break;   }

....   // analog si ptr celalte game
....
default:

{   kIo.DisplayString(alta_gama);   kIo.Wait(1000);   break;   }

}

}while (bCorrectSelection == 0);

.........................................


 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

In ultima parte a codului se canta propriu zis.

Se intra intr-un ciclu do-while cu conditia bCorrectSelection=1.

In functie de tasta apasata se construieste nota care este valoarea de inceput a gamei plus valoarea notei.

Valorile notelor sunt de la 0 la 11. Prezentam fragmente din ciclul do-while.

bCorrectSelection = 0;

x = kIo.ReadKey();

switch (x)

{

//  Nota DO

case 0: 

{   note = Gama[choice - 1] + 0;   Nota ="DO ";   bCorrectSelection = 1;   break;   }

............................   // celelalte note

}

// daca este corecta selectia, atunci se va afisa nota si se vor trimite pe portul serial cei trei bytes. De notat este faptul ca trebuie trimise 2 perechi de bytes: o pereche este note on si cea de-a doua note off. Delayul standard intre transmiterea celor doua mesaje este 50 milisecunde

if (bCorrectSelection)

{

..............................................

buffer[0] = StatusByteNoteOn;

buffer[1] = note;

buffer[2] = Velocity;

kIo.SerialWrite(COM1, buffer, 3);

kIo.Wait(50);

buffer[0] = StatusByteNoteOff;

................................................

}

}while(...)

 

 

//daca selectia nu este o nota (tasta de la 0 la 6), atunci se testeaza ce tasta s-a apasat. Daca s-a apasat tasta 8, programul va sari la selectia gamei, daca s-a apasat tasta 8, se va selecta un nou intrument, altfel se iese din program.

if (x == 4){

goto choose_scale;

else if (x == 0x0E)

goto choose_instrument;

else

{   kIo.DisplayString("Aplicatia s-a terminat");   kIo.Wait(5000);   }

return 0;

}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Results

Proiectul reuseste sa transmita prin conexiunea seriala mesajele MIDI sub forme de bytes.

Deasemenea am reusit sa transmitem prin Serial MIDI Converter mesajele MIDI insa nu am reusit

sa redam notele folosind Sequencer Plus. Acest software a fost verificat cu MIDI trackersi functioneaza deci probleme sunt in conexiunile de transfer prin porturile virtuale MIDI.

Status

  • 1 - 7 Mai - Inceput proiect: documentare .asm, midi, transmisie seriala
  • 8 - 14 mai - Continuare proiect: stabilirea aplicatiilor ce vor fi folosite, scriere cod pentru trasmiterea datelor, mesajele MIDI si forma binara
  • 15 - 21 mai - Sfarsit proiect: codarea tastelor in format MIDI, transmitere MIDI prin seriala, terminare cod, verificare functionalitati
  • Parte Software (scriere cod): Dragu Ionut & Mitrache Alin
  • Parte de Documentatie (MIDI) si Organizare: Moscalu Mircea