Come si può determinare il tempo/BPM di una canzone a livello di programmazione? Quali algoritmi sono comunemente usati e quali considerazioni devono essere fatte?Come rilevare il BPM di una canzone in php
risposta
Eseguire un Fourier transform e trovare picchi nello spettro di potenza. Stai cercando picchi al di sotto del limite di 20 Hz per l'udito umano. Immagino che tipicamente nell'intervallo 0.1-5ish Hz sia generoso.
SO domanda che potrebbe aiutare: Bpm audio detection Library
Inoltre, ecco una delle diverse domande "picco finding" su SO: Peak detection of measured signal
Edit: Non che io faccio l'elaborazione audio. E 'solo una supposizione basata sul fatto che siete alla ricerca di una proprietà nel dominio della frequenza del file ...
un'altra modifica: Vale la pena notare che i formati di compressione con perdita come mp3, negozio di dominio di Fourier dati piuttosto che dati sul dominio del tempo, in primo luogo. Con un po 'di intelligenza, puoi risparmiare un grosso calcolo ... ma guarda il commento di cobbal.
Questo è difficile da spiegare in un singolo post di StackOverflow. In generale, gli algoritmi di rilevamento del battito più semplici funzionano individuando i picchi nell'energia sonora, che è facile da rilevare. I metodi più sofisticati utilizzano comb filters e altri metodi statistici/forme d'onda. Per una spiegazione dettagliata inclusi campioni di codice, selezionare this GameDev article out.
FYI, so che è un vecchio post, ma l'articolo del gioco dev dà un 404 – avanderw
Lo prenderò in considerazione, scusa non ci ho pensato e stavo cercando di essere più informativo che criticare. – avanderw
5 anni dopo l'articolo di GameDev non 404 ツ (Inoltre puoi spesso usare webarchive.org, come da http://web.archive.org/web/20120525085210/http://archive.gamedev.net/archive/reference /programming/features/beatdetection/index.html) – earcam
Ecco uno free program analizzerà e scriverà BPM al tag ID3V2. Non ho idea di quanto è buono
ora è il 2015, c'è qualcosa di nuovo in questo? eventuali app/librerie open source che lo fanno meglio? – user63898
Se si riesce ad interfacciarsi con codice Python nel progetto, Echo Nest Remix API è un'API piuttosto liscia per Python:
C'è un metodo analysis.tempo
che vi darà il BPM. Si può fare molto di più che semplice BPM, come si può vedere dalla documentazione API o this esercitazione
Mi immagino che questo sarà più facile nel 4-4 musica da ballo, come ci dovrebbe essere una sola basso frequenza tonifica circa due volte al secondo.
L'estrazione del battito comporta l'identificazione delle strutture metriche cognitive nella musica. Molto spesso questi non corrispondono all'energia sonora fisica - per esempio, nella maggior parte della musica c'è un livello di sincopazione, il che significa che il battito del "battito del piede" che percepiamo non corrisponde alla presenza di un suono fisico. Ciò significa che si tratta di un campo completamente diverso dal rilevamento di , che è il rilevamento dei suoni fisici e viene eseguito in un modo diverso.
Si può provare la libreria Aubio, che è una semplice libreria C che offre sia strumenti di estrazione sia di inizio e fine.
C'è anche lo Echonest API online, anche se questo comporta il caricamento di un MP3 in un sito Web e il recupero di XML, quindi potrebbe non essere così adatto ..
EDIT: Mi sono imbattuto in questa scorsa notte - una libreria C/C++ dall'aspetto molto promettente, sebbene non l'abbia mai usata io. Vamp Plugins
Hai deciso quale usare? –
Il rilevamento accurato del BPM è molto difficile. Vedi this stackoverflow question e la mia risposta ad esso.
Per ripubblicare la mia risposta: il modo più semplice per farlo è di fare in modo che l'utente tocchi un pulsante a ritmo con il ritmo e contenga il numero di tocchi divisi per il tempo.
Esistono diversi metodi per ottenere il BPM, ma quello che trovo più efficace è lo "spettro del battito" (descritto here). Questo algoritmo calcola una matrice di similarità confrontando ogni breve campione della musica con tutti gli altri. Una volta calcolata la matrice di similarità è possibile ottenere una somiglianza media tra ciascuna coppia di campioni {S (T); S (T + 1)} per ciascun intervallo di tempo T: questo è lo spettro delle battute. Il primo picco alto nello spettro delle battute è il più delle volte la durata del battito. La parte migliore è che puoi anche fare cose come la struttura della musica o l'analisi del ritmo.
Altri hanno già descritto alcuni metodi di rilevamento del battito. Voglio aggiungere che ci sono alcune librerie disponibili che forniscono tecniche e algoritmi per questo tipo di attività.
Aubio è uno di questi, ha una buona reputazione ed è scritto in C con un wrapper C++ in modo da poterlo integrare facilmente con un'applicazione di cacao (tutte le cose audio nei framework Apple sono anche scritte in C/C++) .
L'area generale di ricerca che ti interessa è chiamata sulla musica RECUPERO
Ci sono molti diversi algoritmi che fanno questo, ma tutti sono fondamentalmente concentrati intorno INSORGENZA DI RILEVAMENTO.
Il rilevamento di inizio misura l'inizio di un evento, l'evento in questo caso è una nota in riproduzione. È possibile cercare modifiche nella trasformata di Fourier ponderata (contenuto ad alta frequenza) per cercare grandi cambiamenti nel contenuto spettrale. (Differenza spettrale). (ci sono un paio di documenti che ti consiglio di esaminare più in basso). Una volta applicato un algoritmo di rilevamento dell'inizio, scegli dove sono i battiti tramite la soglia.
Ci sono vari algoritmi che è possibile utilizzare una volta ottenuta la localizzazione del tempo in quel momento. Puoi trasformarlo in un treno di impulsi (creare un segnale che è zero per tutti i tempi e 1 solo quando il tuo battito accade) quindi applicare una FFT a quella e BAM ora hai una frequenza di offset al picco più grande.
Ecco alcune carte di guidarvi nella direzione giusta:
http://www.elec.qmul.ac.uk/people/juan/Documents/Bello-TSAP-2005.pdf
http://bingweb.binghamton.edu/~ahess2/Onset_Detection_Nov302011.pdf
Qui è un'estensione di quello che alcune persone stanno discutendo:
Qualcuno ha detto cercando nell'applicare un algoritmo di apprendimento automatico: in pratica raccolgono una serie di funzioni dalle funzioni di rilevamento delle fasi iniziali (menzionate sopra) e combinarli con il segnale grezzo in una rete neurale/regressione logistica e imparare ciò che rende un battito un battito.
sguardo dottor Andrew Ng, deve liberi lezioni di apprendimento automatico presso la Stanford University in linea (non i video conferenze prolisso, non v'è in realtà un corso a distanza on-line)
Le parole chiave per cercare sono "Beat Detection" , "Beat Tracking" e "Music Information Retrieval". Ci sono molte informazioni qui: http://www.music-ir.org/
C'è un (forse) contest annuale chiamato MIREX dove diversi algoritmi sono testati sulle loro prestazioni di rilevamento del battito.
http://nema.lis.illinois.edu/nema_out/mirex2010/results/abt/mck/
Questo dovrebbe dare un elenco di algoritmi per testare.
Un algoritmo classico è Beatroot (google it), che è bello e facile da capire. Funziona così:
- FFT a orario ridotto la musica per ottenere un sonogramma.
- Sommare aumenta di dimensioni su tutte le frequenze per ogni intervallo di tempo (ignorare le diminuzioni). Questo ti dà una funzione variabile nel tempo 1D chiamata "flusso spettrale".
- Trova i picchi utilizzando qualsiasi algoritmo di rilevamento picco precedente. Questi sono chiamati "onset" e corrispondono all'inizio dei suoni nella musica (inizi di note, colpi di batteria, ecc.).
- Costruire un istogramma di intervalli di interferenza (IOI). Questo può essere usato per trovare i tempi probabili.
- Inizializza un set di "agenti" o "ipotesi" per il risultato di tracciamento del battito. Alimenta questi agenti gli insiemi uno alla volta in ordine. Ogni agente tiene traccia dell'elenco di insiemi che sono anche i battiti e la stima del tempo corrente. Gli agenti possono accettare gli insiemi, se si adattano strettamente al loro ultimo ritmo e tempo tracciati, ignorarli se sono molto diversi, o generare un nuovo agente se sono in mezzo. Non tutti i battiti richiedono un esordio - gli agenti possono interpolare.
- A ogni agente viene assegnato un punteggio in base a quanto è precisa la sua ipotesi: se tutte le sue battute sono alte, ottiene un punteggio più alto. Se sono tutti regolari ottiene un punteggio più alto.
- L'agente con il punteggio più alto è la risposta.
aspetti negativi di questo algoritmo per la mia esperienza:
- Il picco di rilevamento è piuttosto ad hoc e sensibile ai parametri di soglia e quant'altro.
- Alcuni brani musicali non hanno un'evidente differenza sui beat. Ovviamente non funzionerà con quelli.
- Difficile sapere come risolvere il problema 60bpm-vs-120bpm, in particolare con il monitoraggio in tempo reale!
- Lancia un lotto di informazioni utilizzando solo un flusso spettrale 1D. Penso che si possa fare molto meglio con alcuni flussi spettrali a banda limitata (e forse uno a banda larga per la batteria).
Here è una dimostrazione di una versione live di questo algoritmo, che mostra il flusso spettrale (linea nera in basso) e insorgenze (cerchi verdi). Vale la pena considerare il fatto che il beat viene estratto da solo le cerchie verdi.Ho riprodotto gli offset proprio come i clic e, sinceramente, non credo di poter sentire il battito da loro, quindi in qualche modo questo algoritmo è migliore delle persone con rilevamento dei battiti. Penso che la riduzione a un segnale così basso dimensionalmente sia il suo passo debole.
Annoyingly ho trovato un sito molto buono con molti algoritmi e codice per il rilevamento dei battiti qualche anno fa. Tuttavia, non sono riuscito a rifarlo.
Modifica: Trovato!
Ecco alcuni link che dovrebbe iniziare:
Difficile costruire Vamp Plugin per target OSX. Nessun problema con le dipendenze, ma con l'os typedefs per darwin. Prova make -f build/Makefile.osx dopo aver cambiato sdk in .../Developer/SDKs/iPhoneOS7.0.sdk per vedere cosa intendo. – loretoparisi
tuttavia, mp3 raggiunge è compressione tagliando le frequenze al di fuori dell'udito umano. Fourier potrebbe non essere lo strumento giusto qui. – cobbal
AH. Bene, questo. – dmckee
L'MP3 non "taglia" le frequenze al di fuori dell'udito umano ed esegue trasformazioni del coseno (correlate a quelle di Fourier) singolarmente a finestre avvolte di circa 1 ms ciascuna. Vorrei provare il primo suggerimento di dmckee su finestre lunghe 10 s e vedere cosa viene fuori. – TrayMan