2009-09-06 7 views
13

Ho musica di sottofondo per alcuni brani disponibili in entrambi i formati .MID e .KAR, ma in ogni caso viene riprodotto un po 'più veloce di quanto mi piacerebbe. Qual è il modo più semplice per creare file .MID o .KAR con lo stesso contenuto ma con un tempo più lento, ad esempio uno rallentato del 20% circa, un altro del 15%, un terzo del 25% e così via?Come "rallentare" un file MIDI (idealmente in Python)?

Idealmente, preferirei uno script Python multipiattaforma (poiché ciò mi permetterebbe di sperimentare facilmente la sorgente per convergere sull'effetto esatto che voglio ;-), ma prenderò qualsiasi soluzione gratuita che venga eseguita in Linux (Ubuntu 8.04 se è importante) e Mac (Mac OS X 10.5, ma la compatibilità 10.6 è preferibile).

+0

Hai dato un'occhiata al formato OSC? http://en.wikipedia.org/wiki/Open_Sound_Control – magnetar

risposta

9

è possibile modificare il file, come da http://www.sonicspot.com/guide/midifiles.html

Anche se probabilmente c'è una lettura MIDI/scrittura libreria già. In realtà, si trattava di una questione di vedere le relative domande: Simple, Cross Platform MIDI Library for Python

Set Tempo

Questa meta evento imposta il tempo sequenza in termini di microsecondi per quarto di nota quali è codificato in tre byte . Di solito è trovato nel primo pezzo della traccia, allineato nel tempo che si verifica allo stesso tempo come messaggio di clock MIDI per promuovere la sincronizzazione più accurata . Se non è presente l'evento di tempo impostato , si presume 120 battiti al minuto. Le seguenti formule possono essere utilizzate per tradurre il tempo da microsecondi per quarto di battuta al minuto e indietro.

 
MICROSECONDS_PER_MINUTE = 60000000 

BPM = MICROSECONDS_PER_MINUTE/MPQN 
MPQN = MICROSECONDS_PER_MINUTE/BPM 
 
Meta Event Type Length Microseconds/Quarter-Note 
255 (0xFF) 81 (0x51) 3 0-8355711 
+0

Ah bene, non sembra che avrò più tecnica diretta, quindi grazie per questo, @Vinko. –

+0

Così tanto per SO essere eccellente, eh? :-) Quando ** REALMENTE ** ne hai bisogno, fallisce sempre. –

13

Come dice Vinko, è possibile modificare i file MIDI, ma dal momento che si tratta di un formato binario, spremuto nel minor numero di bit possibili, aiuta ad avere aiuto.

Questo è un midi-to-text converter (e viceversa):
http://midicomp.opensrc.org/
ho usato un po 'ultimamente. è piuttosto banale eseguire l'elaborazione del testo (ad esempio cercare la linea con "Tempo") per operazioni semplici una volta che si ha il midifile come testo. non ho provato su mac (compilato senza problemi su Ubuntu 8.04).

Per quanto riguarda specificamente il tempo midifile, è davvero facile rallentare o accelerare la riproduzione poiché il tempo degli eventi è specificato in termini di "tick", la cui durata reale in secondi è determinata dal parametro tempo descritto nella citazione di Vinko. Credo che la firma del tempo non sia così rilevante, ed è principalmente per la visualizzazione di barre/battute correttamente quando aperto in un sequencer midi.

Inoltre, a parte pyPortMidi, ci sono un paio di altri moduli midi Python in giro.

[hmmm ... sembra che posso postare solo per link per post, essendo un nuovo utente. proverò a postare i link ai moduli python in un paio di commenti o in un altro paio di risposte ...]

+1

Modulo Python per leggere, scrivere, creare/modificare file midi:

+0

Classe per leggere e scrivere file midi (questa pubblicazione sembra essere l'unica fonte):

+0

Ho anche trovato questo, anche se non l'ho provato:

0

Ho un interesse simile al tuo post.Ho appena imbattuto in questa biblioteca che sembra molto promettente:

http://web.mit.edu/music21/

+0

Si noti che [risposte solo per collegamento] (http://meta.stackoverflow.com/tags/link-only-answers/info) sono scoraggiate, pertanto le risposte devono essere il punto finale di una ricerca di una soluzione (vs. ancora un altro scalo di riferimenti, che tendono a diventare stantii nel tempo). Si prega di considerare l'aggiunta di una sinossi autonoma qui, mantenendo il collegamento come riferimento. – kleopatra

+0

Sostituire l'oggetto tempo.MetronomeMark all'inizio di ogni pentagramma con uno nuovo dovrebbe fare il trucco. Nota che attualmente music21 quantizzerà qualsiasi file MIDI. Appena aggiunto alla nostra lista di cose da fare per renderlo facoltativo. –

1

È possibile utilizzare music21 per fare questo, anche se ho solo testato su OSX 10.10.1.

import music21 

fctr = 1.25 # scale (in this case stretch) the overall tempo by this factor 
score = music21.converter.parse('song.mid') 
newscore = score.scaleOffsets(fctr).scaleDurations(fctr) 

newscore.write('midi','song_slow.mid') 

Offset sono come i timestamp di ogni nota, e la durata è quanto a lungo la nota è suonato, credo applicando lo stesso fattore di scala a ciascuno è un po 'come la regolazione del tempo.

Se sei come me, stai ascoltando le stesse canzoni 7 anni dopo e puoi provarlo! Altrimenti, spero che questo aiuti qualcun altro che si è svegliato oggi come me e mi stava grattando la testa cercando di risolvere facilmente questo problema.

+0

fastScore = score.augmentOrDiminish (1.25) - ridimensiona le durate e gli offset e alcune altre cose per rendere correttamente anche il punteggio. –