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

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

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

Ответы

Ответ 1

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

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

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

Это мета-событие устанавливает темп последовательности в терминах микросекунды за четверть закодированный в три байта. Обычно это найденный в первом фрагменте трека, выравнивание по времени в одно и то же время как сообщение MIDI-часов для продвижения более точная синхронизация. Если нет установленное темповое событие, 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

Ответ 2

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

Это конвертер midi-to-text (и наоборот):
http://midicomp.opensrc.org/
Я использую его совсем немного в последнее время. довольно сложно выполнять текстовую обработку (например, поиск строки с "Темпом" ) для простых операций, когда у вас есть midi файл в виде текста. не пробовал на mac (скомпилирован без проблем на ubuntu 8.04).

В отношении темпа midfile в частности, очень легко замедлить или ускорить воспроизведение, поскольку время событий определяется в терминах "тиков", реальная продолжительность которых в секундах определяется параметром темпа, описанным в цитате Vinko. Я считаю, что подпись времени не так важна и в основном предназначена для отображения баров/ударов правильно при открытии в MIDI-секвенсере.

Кроме того, помимо pyPortMidi, есть пара других миди-модулей python.

[hmmm... кажется, я могу опубликовать только ссылку на сообщение, будучи новым пользователем. я попробую опубликовать ссылки на модули python в парах комментариев или еще пару ответов...]

Ответ 3

Вы можете использовать music21, хотя я тестировал его только на 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 лет и можете попробовать! В противном случае я надеюсь, что это поможет кому-то, кто проснулся сегодня, как я, и почесывал мою голову, пытаясь решить эту проблему легко.

Ответ 4

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

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