2011-02-07 13 views
8

Ho un progetto sulla trascrizione musicale utilizzando Java, il fatto è che "Ho creato un'applet che registra il suono e lo salva in un file WAV, il lettore deve solo suonare il pezzo vorrei trascrivere, dopo di che sono bloccato al punto dovevo ottenere informazioni dal file WAV salvato e usare queste informazioni per creare un file MIDI, e dopo aver creato il file MIDI devo generare un punteggio musicale per esso (Partitura) e tutti questi devono essere fatti in Java.Trascrizione musicale di file Wav in Java

Ho cercato ovunque una chiara spiegazione su come queste cose possono essere fatte, ma non ho trovato nulla di diretto :(dal momento che sono nuovo di Java, vorrei che qualcuno mi aiutasse con questo per favore, gli argomenti che ho sto avendo programmazione problemi sono:

  1. per informazioni sulle note in riproduzione nel file WAV
  2. Conoscere le note
  3. Creazione di un file MIDI equivalente al file WAV
  4. generare un punteggio da... il file MIDI.

Ho anche provato Fast Fourier Transform dopo aver eseguito segmentazione dei dati in fase di lettura, ma penso che è andato assolutamente nella direzione sbagliata :(

Per favore, se qualcuno mi può aiutare sui temi di cui sopra, e come programmarli solo in Java, sarebbe molto apprezzato :)

A proposito, il progetto è:
Il giocatore suona le note sul Pianoforte >> Registra il suo modo di suonare >> Il giocatore ottiene il PUNTEGGIO della sua esecuzione.

+1

possibile duplicato di [conversione wav-to-midi] (http://stackoverflow.com/questions/2126193/wav-to-midi-conversion) –

+0

Per curiosità, non è possibile leggere direttamente l'input in MIDI formato? La maggior parte degli strumenti supporta una sorta di output MIDI (nel caso del piano, una tastiera MIDI) e sembra che ciò eliminerebbe completamente la necessità di eseguire questa difficile post-elaborazione. – templatetypedef

+0

no al progetto di generare una partitura per i file WAV non avendo un MIDI già presente: D – Xtremeaiy

risposta

3

Non sono affatto un esperto in questo settore, quindi mi scuso in anticipo se tutto questo è spazzatura.

Per ottenere le note dal file, penso che sia necessario eseguire uno FFT (Fast Fourier Transform) sul file WAV, ma con solo 10ms di suono alla volta. Poi trovi il picco più alto sulla FFT per quel periodo di tempo, e vai al prossimo "frame" di 10ms, o qualsiasi altra cosa. Fai di nuovo la FFT e se il picco più alto è una frequenza diversa dal picco precedente, allora dirà che è una nuova nota. Per vedere quanto sono lunghe le note, conta il numero di picchi entro una certa soglia e moltiplicali per il tempo che usi per ogni fotogramma (10ms, ecc.)

Dirò di nuovo, non sono esperto e probabilmente ci sono altri modi per farlo.

A parte questo, spero che questo aiuti ... anche un po '.

+0

sì mi ha aiutato un po 'con l'idea dei segmenti 10ms grazie :) – Xtremeaiy

+0

Prego!Sono felice che il post sia di _some_ use :-) – Bojangles

0

C'è un ottimo editor audio open source chiamato Audacity. Sì, è scritto in C++ ma potresti trovare le risposte che stai cercando nel suo codice sorgente. Tradurre il codice C++ in Java non è così difficile.

+0

grazie mille :) ma sto cercando qualcosa già disponibile in Java per aiutarmi a far funzionare questa cosa, grazie mille cercherò di ottenere tutte le informazioni che ho bisogno di Audacity: D – Xtremeaiy

1

Non sono un esperto in quella zona ma una volta giocavo un po 'con Xuggler (java ffmpeg wrapper). Questa libreria è stata in grado di estrarre molti dati interessanti dal file multimediale, consente la transcodifica dei file e molte altre interessanti funzionalità. Ecco il link: http://www.xuggle.com/xuggler/

+0

grazie mille :) – Xtremeaiy

1

Che cosa si vuole fare è attualmente impossibile. Lo scopo di ciò che hai descritto è al di là di tutto ciò che gli attuali programmi musicali professionali possono fare, e hanno letteralmente investito centinaia di anni-uomo di tempo da programmatori.

Potresti ottenere qualcosa se tagli radicalmente le tue esigenze.

  • per trovare l'altezza del suono, utilizzare FFT; questa è la parte più facile; dovrai limitarti a note singole qui, non sarai in grado di leggere gli accordi in modo pulito.

  • non sarà in grado di scoprire ciò che l'indicazione del tempo o la velocità (BPM) del brano - la tua unica possibilità è quella di includere una sorta di metronomo nella propria applicazione e costringere il giocatore ad aderire al ritmo. Se vuoi supportare il tempo di swing, deve anche essere configurato dal giocatore.

  • Quando si effettuano midi, quantitize tutte le note (= spostare le loro partenze e finali al più vicino 1/4, 1/8 o 1/16 di misura)

  • utilizzare un sistema di composizione pronto a creare la Punto; il musictex potrebbe funzionare per te; la generazione di un file tex sarà molto più semplice che fare il disegno da solo; se fossi in te, vorrei ignorare alcune delle regole della musica composizione (certamente cadere le travi, ci sono molte regole che li riguardano)

Se ti limitare a un'unica melodia, scelgo di ignorare gran parte della composizione musicale, fai in modo che il pianista usi il tuo metronomo e limiti le sue scelte ritmiche, potresti riuscire.

1

Ho avuto la stessa idea in mente e ho provato una soluzione molto semplice ma incompleta. Come ha sottolineato il post di fdreger, anche il software professionale non è in grado di eseguire correttamente questa attività. (Ho provato alcune versioni demo di IntelliScore, AudioScore e altri software e nessuno di questi sembrava particolarmente efficace quando si lavora con musica polifonica)

Ma se si vuole provare da solo, ho usato il codice sorgente trovato qui: http://www.psychicorigami.com/2009/01/17/a-5k-java-guitar-tuner/ che mi ha aiutato a scoprire come determinare la frequenza. (FFT sarà più preciso, ma un po 'più complesso).

Per visualizzare le note sullo schermo, ho usato la biblioteca abc4j che può essere trovato qui: http://code.google.com/p/abc4j/

Ma, come sottolineato in precedenza, funziona solo con la musica monofonica (una sola voce).

Buona fortuna!