Indholdsfortegnelse:

Real-time lyd til MIDI-konverter: 7 trin
Real-time lyd til MIDI-konverter: 7 trin

Video: Real-time lyd til MIDI-konverter: 7 trin

Video: Real-time lyd til MIDI-konverter: 7 trin
Video: Spring boot & WebSockets: Build a Real-Time Chat App From Scratch 2024, Juli
Anonim
Real-time lyd til MIDI-konverter
Real-time lyd til MIDI-konverter

Namaste mennesker! Dette er et projekt, som jeg arbejdede på for et af mine kurser (Real-Time Digital Signal Processing) i min bacheloruddannelse. Projektet sigter mod at lave et DSP -system, der "lytter" til lyddata og udsender MIDI -meddelelser med tilhørende noter over UART. Arduino Nano blev brugt til dette formål. Lang historie kort mikrokontrolleren laver en FFT om indgående lyddata og foretager nogle analyser af toppe og sender passende MIDI-beskeder. Du skal dog ikke bekymre dig om MOSFET'erne, fordi de er til et andet projekt (som også vil blive sat op senere på instruktører) og ikke er nødvendige for dette projekt. Så lad os komme i gang allerede !!

Trin 1: Komponenter påkrævet

Komponenter påkrævet
Komponenter påkrævet

Vi skal bruge følgende komponenter til at bygge dette projekt, selvom mange af disse er generiske og kan erstattes med deres ækvivalenter. Se også kredsløbsdiagrammet for at træne og jage efter bedre implementeringer.

Komponentmængde

1. Electret -mikrofon. 1

2. 30 Kilo Ohm modstand. 1

3. 150 Kilo Ohm modstand. 1

4. 100 ohm modstand. 1

5. 2,2 Kilo Ohm modstande. 3

6. 10 Kilo Ohm forudindstillet pot. 1

7. 10 Kilo Ohm trimmerpotte. 1

8. 47 Kilo Ohm stereopotte. 1

9. 470 Ohms modstande. 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ændingsregulator. 1

16. Kvinde- og hanridshovedstrimmel. 1 hver

17. Tønde Jack stik. 1

18. 12 V 1 Amp DC adapter. 1

19. SPST switch. (Valgfrit) 1

20. Perfboard. 1

Trin 2: Tekniske specifikationer

Tekniske specifikationer
Tekniske specifikationer

Prøveudtagningsfrekvens: 3840 prøver/sek

Antal prøver pr. FFT: 256

Frekvensopløsning: 15Hz

Opdateringshastighed: Cirka 15 Hz

De lavere og højere skalaer af musiknoterne fanges ikke korrekt. Lavere toner lider af lavfrekvent opløsning, hvor højere frekvenser lider af lave samplingshastigheder. Arduinoen er allerede tom for hukommelse, så der er ingen måde at få bedre opløsning. Og bedre opløsning vil koste en reduceret opdateringshastighed, så afvejning er uundgåelig. Lekmand version af Heisenbergs usikkerhedsprincip.

Den primære vanskelighed er den eksponentielle afstand mellem toner (som det ses på figuren. Hver impuls på frekvensaksen er en musikalsk note). Algoritmer som LFT kan hjælpe, men det er lidt avanceret og lidt kompliceret for en enhed som arduino Nano.

Trin 3: Kredsløbsdiagrammer

Kredsløbsdiagrammer
Kredsløbsdiagrammer
Kredsløbsdiagrammer
Kredsløbsdiagrammer
Kredsløbsdiagrammer
Kredsløbsdiagrammer
Kredsløbsdiagrammer
Kredsløbsdiagrammer

Bemærk: Bliv ikke generet af de tre MOSFET'er og skrueterminalerne på billederne. De er ikke påkrævet til dette projekt. Bemærk, at mikrofonindgangskortet er aftageligt eller som de kalder det modulært. En lille beskrivelse af de forskellige blokke er givet nedenfor.

1) De to 470 ohm modstande kombinerer stereolydsignal til mono lydsignal. Sørg for, at signalets jord går til virtuel jord (vg i kredsløbsdiagrammet) og ikke til kredsløbets jord.

2) Den næste blok er et 2. ordens sallen-key lavpasfilter, som er ansvarlig for båndbegrænsning af indgangssignalet for at undgå aliasing. Da vi arbejder med kun +12v forsyning, forspænder vi op-amp ved at lave en RC spændingsdeler. der narrer op -amp til at tro, at forsyningen er 6 0 -6 volt forsyning (dual rail), hvor vg er grundreferencen for op -amp.

3) Derefter filtreres output lavpasset til blokering af DC -forskydning på 6 volt og koblet til DC på omkring 0,55 volt, fordi ADC'en vil blive konfigureret til at bruge den interne 1,1 v som Vref.

Bemærk: Forforstærkeren til elektretmikrofonen er ikke det bedste kredsløb på internettet. Et kredsløb med op-amp ville have været et bedre valg. Vi ønsker, at frekvensresponsen skal være så flad som muligt. Stereopotten på 47 kilo ohm bruges til at definere afskæringsfrekvensen, der typisk skal være halvdelen af samplingsfrekvensen. Den 10 kilo ohm forudindstillede (Den lille gryde med hvidt hoved) bruges til at indstille forstærkningen og Q -værdien af filteret. Den 10 kilo ohm trimmerpotte (en med en metallisk tuningsknap, der ligner en lille flad skrue) bruges til at indstille spændingen til at være så tæt som halv Vref.

Bemærk: Når du forbinder Nano til P. C. hold SPST -kontakten åben ellers lukket. Vær særlig opmærksom på dette, hvis dette ikke gøres, kan det skade kredsløbet/computeren/spændingsregulatoren eller en hvilken som helst kombination af ovenstående

Trin 4: Nødvendige applikationer og IDE'er

Nødvendige applikationer og IDE'er
Nødvendige applikationer og IDE'er
Nødvendige applikationer og IDE'er
Nødvendige applikationer og IDE'er
Nødvendige applikationer og IDE'er
Nødvendige applikationer og IDE'er
Nødvendige applikationer og IDE'er
Nødvendige applikationer og IDE'er
  1. Til kodning af Arduino Nano gik jeg med det primitive AVR studio 5.1, fordi det ser ud til at fungere for mig. Du kan finde installationsprogrammet her.
  2. Til programmering af Arduino Nano brugte jeg Xloader. Det er virkelig let at bruge let værktøj til at brænde.hex -filer til Arduinos. Du kan få det her.
  3. For lille bonus mini -projekt og tuning af kredsløbet, jeg brugte behandling. Du kan få det herfra, selvom der foretages store ændringer i hver revision, så du skal muligvis rode med forældede funktioner for at få skitsen til at fungere.
  4. FL studio eller anden MIDI -behandlingssoftware. Du kan få FL studio version med begrænset adgang gratis herfra.
  5. Loop MIDI opretter en virtuel MIDI -port og registreres af FL studio som om det var en MIDI -enhed. Få en kopi af det samme herfra.
  6. Hairless MIDI bruges til at læse MIDI -meddelelser fra COM -port og sende den til loop MIDI -port. Det fejler også MIDI-meddelelser i realtid, hvilket gør fejlfinding praktisk. Få Hairless MIDI herfra.

Trin 5: Relevante koder for alt

Jeg vil gerne takke Electronic Lifes MFG (Website Here !!) for det faste FFT -bibliotek, jeg brugte i dette projekt. Biblioteket er optimeret til mega AVR -familie. Dette er linket til biblioteksfiler og koder, som han brugte. Jeg vedhæfter min kode herunder. Det inkluderer også behandlingsskitsen og AVR C -koden. Bemærk, at dette er den konfiguration, der fungerede for mig, og jeg tager ikke noget ansvar, hvis du skader noget på grund af disse koder. Jeg havde også mange problemer med at få koden til at fungere. For eksempel har DDRD (Data Direction Register) DDDx (x = 0-7) som bitmasker i stedet for den konventionelle DDRDx (x = 0-7). Pas på disse fejl, mens du kompilerer. Også ændring af mikrokontrolleren påvirker disse definitioner, så hold også øje med dette, mens du beskæftiger dig med kompilationsfejl. Og hvis du undrer dig over, hvorfor projektmappen hedder DDT_Arduino_328p.rar, lad os bare sige, at det var meget mørkt om aftenen, da jeg startede, og jeg var doven nok til ikke at tænde lyset.: P

Når jeg kom til behandlingsskitsen, brugte jeg behandling 3.3.6 til at skrive denne skitse. Du skal indstille COM -portnummeret i skitsen manuelt. Du kan kontrollere kommentarerne i koden.

Hvis nogen kan hjælpe mig med at overføre koderne til Arduino IDE og den seneste behandlingsversion, ville jeg være glad og give kredit til udviklerne / bidragydere også.

Trin 6: Opsætning

  1. Åbn koden, og kompilér koden med #define pcvisual uncommented og #define midi_out kommenteret.
  2. Åbn xloader, og søg til biblioteket med kode, gennemse.hex -filen og brænd den til nano ved at vælge passende kort og COM -port.
  3. Åbn behandlingsskitsen, og kør den med passende COM -portindeks. Hvis alt går godt, skal du kunne se et spektrum af signalet på pin A0.
  4. Få en skruetrækker og drej trimmerpotten, indtil spektret er fladt (DC -komponenten skal være tæt på nul). Indtast derefter ikke noget signal til tavlen. (Monter ikke mikrofonmodulet).
  5. Brug nu ethvert fejegeneratorværktøj som dette til at give input til kortet fra mikrofonen og observere spektret.
  6. Hvis du ikke kan se et feje af frekvenser, skal du reducere skæringsfrekvensen ved at ændre modstanden på 47 kilo ohm. Forøg også gevinsten ved at bruge den 10 kilo ohm forudindstillede gryde. Prøv at opnå en flad og fremtrædende sweep -output ved at ændre disse parametre. Dette er den sjove del (den lille bonus!), Spil dine yndlingssange og nyd deres spektrum i realtid. (Se videoen)
  7. Kompilér nu den indlejrede C -kode igen denne gang med #define pcvisual kommenteret og #define midi_out ikke kommenteret.
  8. Genindlæs den nye kompilerede kode på arduino Nano.
  9. Åbn LoopMidi, og opret en ny port.
  10. Åbn FL studio eller anden MIDI -interface -software, og sørg for, at loop -midi -porten er synlig i MIDI -portindstillingerne.
  11. Åben hårløs MIDI med arduino tilsluttet. Vælg outputport for at være LoopMidi -porten. Gå til indstillinger, og indstil Baud -hastigheden til 115200. Vælg nu den COM -port, der svarer til Arduino Nano, og åbn porten.
  12. Afspil nogle "rene" toner i nærheden af mikrofonen, og du bør også høre den tilhørende note i MIDI -softwaren. Hvis der ikke er noget svar, kan du prøve at sænke up_threshold, der er defineret i C -koden. Hvis noterne bliver udløst tilfældigt, skal du øge op_grænsen.
  13. Få dit klaver og test, hvor hurtigt dit system er !! Det bedste er, at det i goldy-lock-zonen med noter nemt kan registrere flere samtidige tastetryk.

Bemærk: Når COM -porten åbnes af et program, kan det ikke læses af et andet. For eksempel hvis Hairless MIDI læser COM -port, ville Xloader ikke være i stand til at blinke kortet

Trin 7: Resultater/videoer

Det er det for nu fyre! Håber du kan lide det. Hvis du har forslag eller forbedringer i projektet, så lad mig vide det i kommentarfeltet. Fred!

Anbefalede: