2013-06-26 11 views
6

Sto cercando di implementare un sistema in grado di produrre un foglio di musica per un pezzo di pianoforte come e quando viene riprodotto, vale a dire, dovrebbe essere una trascrizione in tempo reale e non quella di una registrazione pezzo.Trascrizione di musica in tempo reale

Finora ho testato su wav file, utilizzando FFt on MATLAB, ma quando si tratta di tempo reale, il sistema deve essere veramente-veramente veloce.

Qualche suggerimento su che tipo di approccio che ho potuto utilizzare, il tipo di scheda (Ho pensato di usare Arduino). Ho potuto utilizzare, perché mi piacerebbe trasferire direttamente il mio MATLAB code invece di convertirlo in C.

+1

+1 progetto interessante, che non ha funzionato con la trascrizione sulla musica, ma a mio parere sarà necessario registrare il pezzo in piccoli frammenti e li trascrivere. –

+0

Immagino che questo tipo di approccio sarebbe adatto solo per la trascrizione di note stand-alone. Gli accordi di trascrizione probabilmente non porteranno buoni risultati. Una tastiera midi sarebbe molto più semplice. –

+0

Progetto molto interessante. Puoi dirci quanto velocemente funziona la tua attuale implementazione basata su fft? Pensavo che fft fosse dovuto a O (n log (n)), che è già molto veloce. – Oli

risposta

1

Qualche suggerimento su quale tipo di approccio che ho potuto utilizzare, il tipo di pensione (ho pensato di utilizzare Arduino). Ho potuto utilizzare, perché mi piacerebbe trasferire direttamente il mio codice MATLAB invece di convertirlo in C.

Si possono avere diversi approcci al progetto che mi viene in mente:

  1. Prima c'è sono alcuni pianoforti che hanno un dispositivo elettronico in grado di emettere le note suonate attraverso un'interfaccia midi, con velocità e posizione. È la soluzione più precisa e veloce per tenere traccia delle note suonate, anche se non molto fai da te. Dal punto di vista del computer, avrete solo bisogno di un'interfaccia midi (che può essere fatta facilmente usando un arduino) e di un software che trasforma le note MIDI in una partitura;
  2. Quindi, è possibile simulare tale comportamento, collegando la tastiera del piano a sensori che saranno in grado di misurare la velocità e quale nota è stata riprodotta. Ci sono molte strategie che puoi usare (dall'uso dei laser sulla meccanica, ai pressostati ...), tutto dipende dall'investimento che sei pronto a fare; Lì un arduino (come il mega o il dovuto) può essere una buona soluzione.
  3. Ma come stavi parlando di FFT, presumo che tu voglia registrare il suono prodotto dal piano e rilevare i tasti. Lì raggiungi una conoscenza all'avanguardia nella ricerca musicale, il problema che incontrerai è lo multiple f0 detection inpolyphonic music, anche se ci sono strategies specific to piano, è ancora un campo di ricerca molto attivo.
  4. Supponiamo che tu stia facendo solo il rilevamento monofonico per la trascrizione. Il problema sarà che il convertitore analogico-digitale incluso nell'arduino fa solo schifo, ha una definizione di 10 bit che è troppo bassa per rilevare qualcosa di utile. Con Arduino DUE, potresti avere un po 'più di definizione dato che presenta un ADC da 1-bit 1-bit a 12-canali a 16-canali. Quale non è ancora molto per una buona trascrizione. Quindi dovrai creare un ADC esterno come lo Linear LTC2383-16 che è 16 bit 1Msps e ha un'interfaccia SPI, il minimo per iniziare a giocare. Dietro dovrai trovare il microfono corretto e creare una buona elettronica tra l'ADC e il microfono (di cui non so molto).
  5. Infine, non sarebbe più semplice prendere un piccolo computer (come lo Beaglebone o il RaspberryPI 5), collegare una scheda audio/ADC USB davvero buona e usare quella scheda per sondare la trascrizione? Potresti anche eseguire il tuo software su un server cloud (come google appengine o AWS) che ha abbastanza processore per far funzionare felicemente il tuo Matlab.

Quindi, per fare un buon tempo reale e la trascrizione incorporata della musica, la soluzione migliore è la prima soluzione (o seconda se si vuole davvero fare il fai-da-te). Se vuoi davvero passare attraverso le interfacce "aeree", penso che la buona soluzione sia la quinta.

Infine, per quanto riguarda il codice, consiglierei di convertire il codice da Matlab a Python (se non si desidera scrivere codice C/C++) verrà eseguito molto più velocemente. Così puoi capire quanto sia brutto Matlab, quando lavoravo per l'IRCAM, ho scritto uno strumento che converte il codice sorgente Matlab in codice sorgente C++, e una volta compilato il risultato era 40 volte più veloce.

HTH