Как «замедлить» MIDI-файл (в идеале на Python)?

StackOverflow https://stackoverflow.com/questions/1384588

  •  21-09-2019
  •  | 
  •  

Вопрос

У меня есть фоновая музыка для некоторых песен, доступная как в форматах .MID, так и в .KAR, но в каждом случае она воспроизводится несколько быстрее, чем хотелось бы.Какой самый простой способ создать файлы .MID или .KAR с тем же содержимым, но в более медленном темпе — скажем, один замедляется примерно на 20 %, другой — на 15 %, третий — на 25 % и так далее?

В идеале я бы предпочел кросс-платформенный скрипт Python (поскольку это позволило бы мне легко экспериментально настроить исходный код для достижения именно того эффекта, который я хочу ;-), но я возьму любое бесплатное решение, работающее в Linux (Ubuntu). 8.04, если это имеет значение) и Mac (Mac OS X 10.5, но предпочтительна совместимость с 10.6).

Это было полезно?

Решение

Вы можете редактировать файл, как http://www.sonicspot.com/guide/midifiles.html

Хотя, вероятно, уже существует библиотека чтения/записи MIDI.Фактически, это был вопрос просмотра связанных вопросов: Простая кроссплатформенная MIDI-библиотека для Python

Установить темп

Это мета-событие устанавливает темп последовательности с точки зрения микросекунд в четверть ноты, который кодируется в трех байтах.Обычно он обнаруживается в первом кусочке трассы, который вызывает время, которое происходит в то же время, что и сообщение Midi Clock, чтобы способствовать более точной синхронизации.Если нет установленного события темпа, предполагается 120 ударов в минуту.Следующие формулы могут использоваться для перевода темпа с микросекундов в четверть ноты на биты в минуту и ​​обратно.

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

Другие советы

Как говорит Винко, вы можете отредактировать Midifile, но, поскольку это бинарный формат, сжатый в наименьшее количество возможных битов, это помогает иметь помощь.

Это конвертер MIDI-TEXT (и наоборот):
http://midicomp.opensrc.org/
Я использовал это в последнее время. Довольно тривиально выполнять обработку текста (например, поиск строки с «темпом») для простых операций, как только вы получите Midifile в качестве текста. Не пробовал на Mac (скомпилировано без проблем на Ubuntu 8.04).

Относительно среднего темпа, то действительно легко замедлить или ускорить воспроизведение, так как время событий указано с точки зрения «клещей», чья реальная продолжительность за считанные секунды определяется параметром темпа, описанным в цитате Винко. Я считаю, что подпись времени не так уместна и в основном предназначена для правильного отображения стержней/ударов при открытии в MIDI -секвенсоре.

Кроме того, кроме Pyportmidi, вокруг есть пара других модулей Python Midi.

Хммм ... кажется, я могу публиковать только по ссылке за сообщение, будучи новым пользователем. Я попробую опубликовать ссылки на модули Python в паре комментариев или еще пару ответов ...

Вы можете использовать музыка21 Для этого, хотя я тестировал его только на 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') 

Смещения похожи на временные метки каждой ноты, а продолжительность - это то, как долго звучит нота, я считаю, что применение одного и того же масштабного коэффициента к каждому - это похоже на корректировку темпа.

Если вы похожи на меня, то вы слушаете те же песни через 7 лет и можете попробовать! В противном случае, я надеюсь, что это поможет кому -то еще, кто проснулся сегодня, как я, и почесал мою голову, пытаясь легко решить эту проблему.

У меня такой же интерес, как ваш пост. Я только что наткнулся на эту библиотеку, которая выглядит очень многообещающе:

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top