Grupa: 336CC
Scopul proiectului este de a crea un instrument muzical portabil care să ofere utilizatorilor o varietate de opțiuni sonore. Este util pentru o gamă largă de utilizatori, de la muzicieni amatori la profesioniști, și poate fi utilizat în diferite contexte, cum ar fi înregistrări sau spectacole live.
Funcționarea proiectului începe cu selectarea opțiunii de sunet de pe display-ul LCD prin intermediul potențiometrului. Aceasta poate include selectarea unui sunet presetat sau crearea unui sunet personalizat prin ajustarea parametrilor de sunet, cum ar fi volumul, tonul. Odată selectat sunetul, semnalul audio este generat și reprodus prin difuzoarele integrate sau prin intermediul output-ului de tip Jack, care poate fi conectat la un amplificator sau alt dispozitiv audio. Pentru a “cânta” la acest instrument, trebuie conectată o clapă MIDI externă în inputul USB pus la dispoziție.
Mediul de dezvoltare
Biblioteci folosite
Implementare
... void MIDI_poll(); void setup() { _MIDI_SERIAL_PORT.begin(31250); if (Usb.Init() == -1) { while (1); } delay( 200 ); } void loop() { Usb.Task(); if ( Midi ) { MIDI_poll(); } } // Poll USB MIDI Controler and send to serial MIDI void MIDI_poll() { uint8_t outBuf[ 3 ]; uint8_t size; do { if ( (size = Midi.RecvData(outBuf)) > 0 ) { if (outBuf[0] == 144) { // 144 reprezintă codul pentru când se apasă clapa respectivă _MIDI_SERIAL_PORT.print(outBuf[1], DEC); _MIDI_SERIAL_PORT.println(); } } } while (size > 0); } ...
... if (Serial.available() > 0) { // Read the incoming data c = Serial.read(); if (c != '\n'){ note[i++] = c; } else { note[i] = c; i = 0; note_int = atoi(note); Serial.print(note_int); } ...
... if (note_int != 0){ sprintf(file, "%s%d.wav", MIDI_to_note(note_int), curr_preset); Serial.print(file); Serial.println(); tmrpcm.play(file); } ...
... void loop() { val = analogRead(A0); val = map(val, 0, 1020, 1, 6); if (val != curr_preset && val != 6){ curr_preset = val; printPreset(); } } ... void printPreset(){ clearCharacters(); lcd.setCursor(0,1); if (curr_preset == 5) lcd.print("Drums"); else lcd.print(curr_preset); } ... void clearCharacters() { for (int i = 0; i < 10; i++) { lcd.setCursor (i,1); // lcd.write(254); } } ...
De asemenea, pentru a converti valoarea input-ului MIDI într-o notă muzicală, am creat propria bibliotecă. input_converter.cpp:
#include "input_converter.h" char* MIDI_to_note(int note) { if (note == 60) return "C1"; if (note == 61) return "C#1"; if (note == 62) return "D1"; if (note == 63) return "D#1"; if (note == 64) return "E1"; if (note == 65) return "F1"; if (note == 66) return "F#1"; if (note == 67) return "G1"; if (note == 68) return "G#1"; if (note == 69) return "A1"; if (note == 70) return "A#1"; if (note == 71) return "B1"; return ""; }
Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.