Innehållsförteckning:

Real-time Audio to MIDI Converter .: 7 steg
Real-time Audio to MIDI Converter .: 7 steg

Video: Real-time Audio to MIDI Converter .: 7 steg

Video: Real-time Audio to MIDI Converter .: 7 steg
Video: Audio to MIDI Converter in REAPER (Guitar to MIDI) 2024, November
Anonim
Realtidsljud till MIDI-omvandlare
Realtidsljud till MIDI-omvandlare

Namaste människor! Detta är ett projekt som jag arbetade med för en av mina kurser (Real-Time Digital Signal Processing) i mitt kandidatprogram. Projektet syftar till att skapa ett DSP -system som "lyssnar" ljuddata och matar ut MIDI -meddelanden från motsvarande anteckningar över UART. Arduino Nano användes för detta ändamål. Lång historia kort mikrokontrollern gör en FFT på inkommande ljuddata och analyserar topparna och skickar lämpligt MIDI-meddelande. Oroa dig inte för MOSFET: erna eftersom de är för något annat projekt (som kommer att läggas upp senare på instruktioner också) och inte krävs för detta projekt. Så låt oss börja redan !!

Steg 1: Komponenter krävs

Komponenter krävs
Komponenter krävs

Vi behöver följande komponenter för att bygga detta projekt, även om många av dessa är generiska och kan ersättas med sina motsvarigheter. Se även kretsschemat för att träna och leta efter bättre implementeringar.

Komponent Antal

1. Electret -mikrofon. 1

2. 30 Kilo Ohm motstånd. 1

3. 150 Kilo Ohm motstånd. 1

4. 100 ohm motstånd. 1

5. 2.2 Kilo Ohm motstånd. 3

6. 10 Kilo Ohm förinställd kruka. 1

7. 10 Kilo Ohm trimmerpott. 1

8. 47 Kilo Ohm stereokanna. 1

9. 470 Ohms motstånd. 2

10. 0.01uF kondensatorer. 2

11. 2.2uF kondensatorer. 3

12. 47uF kondensatorer. 2

13. 1000uF kondensator. 1

14. 470uF kondensator. 1

15. 7805 spänningsregulator. 1

16. Huvud- och hanremsa. 1 vardera

17. Barrel Jack -kontakt. 1

18. 12 V 1 Amp DC -adapter. 1

19. SPST -omkopplare. (Valfritt) 1

20. Perfboard. 1

Steg 2: Tekniska specifikationer

Tekniska specifikationer
Tekniska specifikationer

Provtagningsfrekvens: 3840 prover/sek

Antal prover per FFT: 256

Frekvensupplösning: 15Hz

Uppdateringshastighet: Cirka 15 Hz

De lägre och högre skalorna på noterna fångas inte korrekt. Lägre toner lider av lågfrekvent upplösning där högre frekvenser lider av låga samplingshastigheter. Arduino har redan slut på minne så det finns inget sätt att få bättre upplösning. Och bättre upplösning kommer att kosta en reducerad uppdateringsfrekvens så att avvägningar är oundvikliga. Lekmanversion av Heisenbergs osäkerhetsprincip.

Den primära svårigheten är det exponentiella avståndet mellan noterna (Som framgår av figuren. Varje impuls på frekvensaxeln är en musiknot). Algoritmer som LFT kan hjälpa, men det är lite avancerat och lite komplicerat för en enhet som arduino Nano.

Steg 3: Kretsdiagram

Kretsdiagram
Kretsdiagram
Kretsdiagram
Kretsdiagram
Kretsdiagram
Kretsdiagram
Kretsdiagram
Kretsdiagram

Obs! Oroa dig inte för de tre MOSFET -enheterna och skruvterminalerna på bilderna. De krävs inte för detta projekt. Lägg märke till att mikrofoningångskortet är avtagbart eller som de kallar det modulärt. En liten beskrivning av de olika blocken ges nedan.

1) De två motstånden på 470 ohm kombinerar stereoljudssignalen med mono -ljudsignalen. Se till att signaljorden går in på virtuell mark (vg i kretsschemat) och inte till kretsens mark.

2) Nästa block är ett andra ordning sallen-key lågpassfilter som ansvarar för bandbegränsning av insignalen för att undvika aliasing. Eftersom vi arbetar med endast +12V strömförsörjning förspänner vi förstärkaren genom att göra en RC-spänningsdelare. som lurar op -amp till att tro att strömförsörjningen är 6 0-6 volt matning (dual rail) där vg är markreferensen för op amp.

3) Sedan är utgången lågpassfiltrerad för att blockera DC -förskjutning på 6 volt och kopplad till DC på cirka 0,55 volt eftersom ADC kommer att konfigureras för att använda den interna 1,1 v som Vref.

Obs: Förförstärkaren för elektretmikrofonen är inte den bästa kretsen på internet. En krets med op-amp skulle ha varit ett bättre val. Vi önskar att frekvenssvaret ska vara så platt som möjligt. Stereopotten på 47 kilo ohm används för att definiera avstängningsfrekvensen som vanligtvis bör vara hälften av samplingsfrekvensen. Förinställningen 10 kilo ohm (den lilla grytan med vitt huvud) används för att ställa in förstärkningen och Q -värdet på filtret. 10 kilo ohm trimmerbehållare (en med en metallisk justeringsknapp som ser ut som en liten plattskruv) används för att ställa in spänningen så nära halva Vref.

Obs: När du ansluter Nano till P. C. håll SPST -omkopplaren öppen annars stängd. Var särskilt försiktig med detta om du inte gör det kan skada kretsen/datorn/spänningsregulatorn eller någon kombination av ovanstående

Steg 4: Nödvändiga applikationer och IDE: er

Nödvändiga applikationer och IDE: er
Nödvändiga applikationer och IDE: er
Nödvändiga applikationer och IDE: er
Nödvändiga applikationer och IDE: er
Nödvändiga applikationer och IDE: er
Nödvändiga applikationer och IDE: er
Nödvändiga applikationer och IDE: er
Nödvändiga applikationer och IDE: er
  1. För kodning av Arduino Nano gick jag med den primitiva AVR studio 5.1 eftersom det verkar fungera för mig. Du hittar installationsprogrammet här.
  2. För programmering av Arduino Nano använde jag Xloader. Det är verkligen lätt att använda lätt verktyg för att bränna.hex -filer till Arduinos. Du kan få det här.
  3. För ett litet bonusminiprojekt och justering av kretsen använde jag bearbetning. Du kan få det härifrån, även om det gör stora förändringar i varje översyn, så du kan behöva tjata med utfasade funktioner för att få skissen att fungera.
  4. FL studio eller någon annan MIDI -bearbetningsprogramvara. Du kan få FL studio version med begränsad åtkomst gratis härifrån.
  5. Loop MIDI skapar en virtuell MIDI -port och detekteras av FL studio som om det var en MIDI -enhet. Få en kopia av samma härifrån.
  6. Hairless MIDI används för att läsa MIDI -meddelanden från COM -port och skicka det till loop MIDI -port. Det felsöker också MIDI-meddelanden i realtid vilket gör felsökning bekvämt. Få Hairless MIDI härifrån.

Steg 5: Relevanta koder för allt

Jag vill tacka Electronic Lifes MFG (Webbplats här !!) för FFT -biblioteket med fast punkt som jag använde i detta projekt. Biblioteket är optimerat för mega AVR -familj. Detta är länken till biblioteksfiler och koder som han använde. Jag bifogar min kod nedan. Den innehåller också bearbetningsskissen och AVR C -koden. Observera att det här är konfigurationen som fungerade för mig och jag tar inget ansvar om du skadar något på grund av dessa koder. Jag hade också många problem med att försöka få koden att fungera. Till exempel har DDRD (Data Direction Register) DDDx (x = 0-7) som bitmasker istället för den konventionella DDRDx (x = 0-7). Se upp för dessa fel när du kompilerar. Att byta mikrokontroller påverkar också dessa definitioner, så håll ett öga på detta samtidigt som du hanterar kompileringsfel. Och om du undrar varför projektmappen heter DDT_Arduino_328p.rar, låt oss bara säga att det var väldigt mörkt på kvällen när jag började och jag var lat nog att inte tända lamporna.: P

När jag kom till bearbetningsskissen använde jag bearbetning 3.3.6 för att skriva denna skiss. Du måste ställa in COM -portnumret i skissen manuellt. Du kan kontrollera kommentarerna i koden.

Om någon kan hjälpa mig att överföra koderna till Arduino IDE och den senaste bearbetningsversionen, skulle jag vara glad och ge krediter till utvecklarna / bidragsgivare också.

Steg 6: Konfigurera det

  1. Öppna koden och kompilera koden med #define pcvisual uncommented och #define midi_out kommenterade.
  2. Öppna xloader och bläddra till katalogen med kod, bläddra till.hex -filen och bränn den till nano genom att välja lämpligt kort och COM -port.
  3. Öppna bearbetningsskissen och kör den med lämpligt COM -portindex. Om allt går bra borde du kunna se ett spektrum av signalen på stift A0.
  4. Skaffa en skruvmejsel och vrid trimmerpannan tills spektrat är plant (DC -komponenten ska vara nära noll). Mata inte in någon signal till kortet då. (Fäst inte mikrofonmodulen).
  5. Använd nu vilket svepgeneratorverktyg som helst för att ge input till kortet från mikrofonen och observera spektrumet.
  6. Om du inte ser en svepning av frekvenser, minska avstängningsfrekvensen genom att ändra motståndet på 47 kilo ohm. Öka också förstärkningen genom att använda 10 kilo ohm förinställd kruka. Försök att få en platt och framträdande sveputmatning genom att ändra dessa parametrar. Detta är den roliga delen (den lilla bonusen!), Spela dina favoritlåtar och njut av deras spektrum i realtid. (Titta på videon)
  7. Kompilera nu den inbäddade C -koden igen denna gång med #define pcvisual kommenterad och #define midi_out okommenterad.
  8. Ladda om den nya kompilerade koden till arduino Nano.
  9. Öppna LoopMidi och skapa en ny port.
  10. Öppna FL studio eller annan MIDI -gränssnittsprogramvara och se till att loop -midi -porten är synlig i MIDI -portinställningarna.
  11. Öppen hårlös MIDI med arduino ansluten. Välj utgångsport för att vara LoopMidi -porten. Gå till inställningarna och ställ in Baud -hastigheten till 115200. Välj nu COM -porten som motsvarar Arduino Nano och öppna porten.
  12. Spela några "rena" toner nära mikrofonen och du bör också höra motsvarande ton träff i MIDI -programvaran. Om det inte finns något svar, försök att sänka upp_gränsen definierad i C -koden. Om anteckningarna aktiveras slumpmässigt ökar du upp_gränsen.
  13. Skaffa ditt piano och testa hur snabbt ditt system är !! Det bästa är att det i goldy-lock-zonen med anteckningar enkelt kan upptäcka flera samtidiga knapptryckningar.

Obs: När COM -porten nås av ett program kan den inte läsas av en annan. Till exempel om Hairless MIDI läser COM -port, skulle Xloader inte kunna blinka kortet

Steg 7: Resultat/videor

Det är det för nu grabbar! Hoppas du gillar det. Om du har några förslag eller förbättringar i projektet, meddela mig i kommentarsfältet. Fred!

Rekommenderad: