Comment « ralentir » un fichier MIDI (idéalement en Python)?
Question
J'ai la musique de fond pour quelques chansons disponibles dans les deux formats .MID et .KAR, mais dans chaque cas, il est joué un peu plus vite que je le voudrais. Quelle est la façon la plus simple de créer soit des fichiers .MID ou .KAR avec le même contenu, mais à un rythme plus lent - par exemple, un ralentissait de 20% ou, une autre de 15%, un troisième de 25%, et ainsi de suite?
Idéalement, je préfère un script Python multi-plateforme (car cela me permettrait d'ajuster facilement expérimentalement la source à converger vers l'effet exact que je veux ;-), mais je vais prendre une solution gratuite qui fonctionne en Linux (Ubuntu 8.04 si elle importe) et Mac (Mac OS X 10.5, mais la compatibilité 10.6 préférée).
La solution
Vous pouvez modifier le fichier, comme par http://www.sonicspot.com/guide /midifiles.html
Bien qu'il y ait sans doute une lecture MIDI / écriture déjà bibliothèque. En fait, il était question de voir les questions connexes: simple, multi-plateforme MIDI bibliothèque pour Python
Set Tempo
Cet événement méta définit la tempo de la séquence en termes de microsecondes par quart de note qui est codé sur trois octets. Il est généralement trouvé dans le premier tronçon de voie, temps-alignés se produise en même temps comme un message d'horloge MIDI pour promouvoir synchronisation plus précise. Sinon set événement de tempo est présent, 120 battements par minute est supposé. Le suivant La formule de peut être utilisé pour traduire le tempo de microsecondes par quart de note à battements par minute et retour.
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
Autres conseils
Comme le dit Vinko, vous pouvez éditer le fichier MIDI, mais comme il est un format binaire, pressé dans le plus petit nombre de bits possibles, il est utile d'avoir de l'aide.
Ceci est un convertisseur MIDI-texte (et vice-versa):
http://midicomp.opensrc.org/
Je l'ai utilisé un peu ces derniers temps. il est assez trivial de faire du traitement de texte (par exemple la recherche de la ligne avec « Tempo ») pour les opérations simples une fois que vous avez la midifile sous forme de texte. ont pas essayé sur mac (compilé sans problème sur ubuntu 8.04).
En ce qui concerne le tempo de midifile Plus précisément, il est vraiment facile de ralentir ou d'accélérer la lecture depuis le calendrier des événements est spécifié en termes de « tiques », dont la durée réelle en secondes est déterminée par le paramètre de tempo décrit dans la citation de Vinko. Je crois que la signature de temps n'est pas si pertinente, et est principalement pour l'affichage des barres / bat correctement lorsqu'il est ouvert dans un séquenceur MIDI.
En outre, en dehors de pyPortMidi, il y a deux autres modules midi python autour.
[hmmm ... il semble que je ne peux poster sur le lien par courrier, étant un nouvel utilisateur. Je vais essayer de poster les liens vers les modules Python dans un commentaire couple ou d'une autre réponse couple ...]
Vous pouvez utiliser music21 pour ce faire, bien que je n'ai testé sur 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')
Décalages sont comme les horodatages de chaque note, et la durée est combien de temps la note retentit, je crois que le même facteur présente une demande d'échelle à chacun est un peu comme le réglage du tempo.
Si vous êtes comme moi, vous écoutez les mêmes chansons 7 ans plus tard et peut donner à ce essayer! Sinon, j'espère que cela aide quelqu'un d'autre qui me suis réveillé aujourd'hui comme moi et était me gratter la tête en essayant de résoudre ce problème facilement.
J'ai un intérêt similaire à votre poste. Je viens suis tombé sur cette bibliothèque qui semble très prometteur: