Come “rallentare” un file MIDI (idealmente in Python)?
Domanda
Ho musica di sottofondo per alcune canzoni disponibili in entrambi i formati MID e .KAR, ma in ogni caso è in riproduzione un po 'più veloce di quanto mi piacerebbe. Qual è il modo più semplice per creare sia i file mid o .KAR con lo stesso contenuto, ma ad un ritmo più lento - per esempio, uno rallentato del 20% o giù di lì, un altro 15%, un terzo del 25%, e così via?
Idealmente, avrei preferito uno script Python cross-platform (dal momento che mi permettesse di modificare facilmente sperimentalmente la fonte a convergere verso l'esatto effetto che voglio ;-), ma mi prendo alcuna soluzione gratuita che viene eseguito in Linux (Ubuntu 8.04 se è importante) e Mac (Mac OS X 10.5, 10.6, ma la compatibilità preferito).
Soluzione
Si potrebbe 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 questioni relative: semplice, Cross Platform MIDI Biblioteca per Python
Set Tempo
Questo meta evento imposta la sequenza tempo in termini di microsecondi per quarto di nota che è codificati in tre byte. Di solito è trovato nel primo blocco pista, tempo allineato a verificarsi contemporaneamente come messaggio MIDI clock per la promozione sincronizzazione più accurata. Se no evento set tempo è presente, 120 battiti per minuto è assunto. Il seguente La formula di può essere utilizzato per tradurre il tempo da microsecondi per quarto di nota a battiti 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
Altri suggerimenti
Come dice Vinko, è possibile modificare il 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. è abbastanza banale da fare l'elaborazione del testo (ad esempio la ricerca di linea con "Tempo") per le operazioni semplici una volta che avete il file midi come testo. non hanno provato su Mac (compilato senza alcun problema su Ubuntu 8.04).
Per quanto riguarda midifile tempo specifico, è davvero facile per rallentare o accelerare la riproduzione in quanto la tempistica degli eventi è specificato in termini di "zecche", la cui durata effettiva in secondi è determinato dal parametro tempo descritto in citazione di Vinko. Credo che firma il tempo non è così rilevante, ed è principalmente per la visualizzazione di bar / beat correttamente quando viene aperto in un sequencer MIDI.
Inoltre, a parte pyPortMidi, ci sono un paio di altri moduli Python midi intorno.
[hmmm ... Sembra che io possa pubblicare solo su link per posta, essendo un nuovo utente. Cercherò postare i link ai moduli Python in un paio di commenti o un altro paio di risposte ...]
È possibile utilizzare music21 per fare questo, anche se ho testato solo 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 siete come me allora si sta ascoltando le stesse canzoni 7 anni più tardi e può dare a questo una prova! In caso contrario, spero che questo aiuta qualcun altro che si è svegliato oggi, come me, ed era graffiare la mia testa cercando di risolvere questo problema con facilità.
Ho un interesse simile come il tuo post. Ho appena imbattuto in questa biblioteca che sembra molto promettente: