2009-09-06 18 views
13

Mam podkład muzyczny dla niektórych piosenek dostępnych w obu formatach .MID i .KAR, ale w każdym przypadku jest odtwarzany nieco szybciej, niż bym chciał. Jaki jest najprostszy sposób utworzenia plików .MID lub .KAR z tą samą zawartością, ale w wolniejszym tempie - powiedzmy, jeden spowolnił o 20%, inny o 15%, o jedną trzecią o 25% itd.?Jak "zwolnić" plik MIDI (najlepiej w Pythonie)?

Idealnie, wolałbym wieloplatformowy skrypt w języku Python (ponieważ to pozwoliłoby mi łatwo eksperymentalnie podkręcić źródło, by uzyskać dokładnie taki efekt, jakiego potrzebuję ;-), ale wezmę dowolne bezpłatne rozwiązanie, które działa w systemie Linux (Ubuntu 8.04, jeśli ma to znaczenie) i Mac (Mac OS X 10.5, ale preferowana jest zgodność z 10.6).

+0

Czy spojrzałeś na format OSC? http://en.wikipedia.org/wiki/Open_Sound_Control – magnetar

Odpowiedz

9

Można edytować plik, zgodnie http://www.sonicspot.com/guide/midifiles.html

Chociaż prawdopodobnie jest czytanie MIDI/pisania już bibliotekę. W rzeczywistości była to kwestia widząc pokrewnych pytania: Simple, Cross Platform MIDI Library for Python

Ustaw Tempo

Ta meta wydarzenie ustawia tempo sekwencji w kategoriach mikrosekundy na ćwierćnutowych która zakodowany w trzech bajtów . Zazwyczaj jest to znalezione w pierwszym kawałku ścieżki, wyrównane czasowo, aby występować w tym samym czasie jako komunikat zegara MIDI w celu promowania dokładniejszej synchronizacji . Jeśli nie ma ustawionego zdarzenia tempa, przyjmuje się 120 bitów na minutę. Poniższe formuły można wykorzystać do przeliczenia tempa z mikrosekund na ćwierćnuta na uderzenia na minutę i powrotem z powrotem do .

 
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

No cóż, nie wygląda na to, że otrzymam bardziej bezpośrednią technikę, więc dziękuję za to, @ Vinko. –

+0

Tyle dla tego, że TAK jest doskonałe, co? :-) Kiedy ** NAPRAWDĘ ** potrzebuje tego, zawsze zawiedzie. –

13

Jak mówi Vinko można edytować midifile, ale ponieważ jest to format binarny, wcisnął się w najmniejszej liczbie bitów możliwe, to pomaga na pomoc.

To midi-to-Text Converter (i vice versa):
http://midicomp.opensrc.org/
Używam go trochę ostatnio. przetwarzanie tekstu (np. wyszukiwanie linii za pomocą "Tempo") jest dość banalne dla prostych operacji, gdy plik pośredni jest tekstem. nie próbowałem na mac (skompilowany bez problemu na Ubuntu 8.04).

W szczególności w odniesieniu do tempa midi, bardzo łatwo jest zwolnić lub przyspieszyć odtwarzanie, ponieważ czas zdarzeń jest określony jako "tyknięcia", którego rzeczywisty czas trwania w sekundach jest określony przez parametr tempa opisany w cytacie Vinko. Uważam, że sygnatura czasowa nie jest tak istotna i służy głównie do poprawnego wyświetlania pasków/uderzeń po otwarciu w sekwenserze midi.

Oprócz pyPortMidi istnieje również kilka innych modułów midi Pythona.

[hmmm ... wygląda na to, że mogę publikować posty tylko w jednym poście, będąc nowym użytkownikiem. Spróbuję opublikować linki do modułów Pythona w kilku komentarzach lub kilku innych odpowiedziach ...]

+1

Moduł Pythona do czytania, pisania, tworzenia/edytowania plików MIDI:

+0

Klasa do czytania i pisania plików midi (ten post wydaje się być jedynym źródłem):

+0

Również znalazłem to, chociaż go nie wypróbowałem:

0

Mam podobne zainteresowania jak twój post.Właśnie natknąłem tej biblioteki, która wygląda bardzo obiecująco:

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

+0

Należy pamiętać, że [odpowiedzi dotyczące tylko łącza] (http://meta.stackoverflow.com/tags/link-only-answers/info) są odradzane, odpowiedzi na pytania powinny być punktem końcowym wyszukiwania rozwiązania (vs. jeszcze jeden przystanek referencji, które z czasem zanikają). Proszę rozważyć dodanie samodzielnego streszczenia tutaj, zachowując odnośnik jako odniesienie. – kleopatra

+0

Zastąpienie obiektu tempa.MetronomeMark na początku każdego pięciolinii nowym zadaniem powinno załatwić sprawę. Zauważ, że obecnie muzyka21 będzie kwantyzować dowolny plik MIDI. Właśnie dodaliśmy do naszej listy rzeczy do zrobienia, aby to opcjonalne. –

1

Można wykorzystać music21 to zrobić, chociaż mam tylko testowałem go na 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') 

Kanały są jak znaczniki czasu każdej nucie, a czas trwania to, jak długo jest uwaga brzmiała, wierzę, stosując ten sam współczynnik skali, aby każdy jest trochę jak dostosowanie tempa.

Jeśli jesteś podobny do mnie, słuchasz tych samych piosenek siedem lat później i możesz spróbować! W przeciwnym razie, mam nadzieję, że pomoże to komuś, kto obudził się dzisiaj tak jak ja, i drapał się po głowie, próbując łatwo rozwiązać ten problem.

+0

fastScore = score.augmentOrDiminish (1,25) - przeskaluje czasy trwania i przesunięcia oraz kilka innych rzeczy, aby wynik punktacji był poprawny. –