Я неоднократно создаю репетиционные файлы для моего хора из миди-файлов, то есть я загружаю миди-файл песни (или создаю его сам), импортирую его в секвенсор, а затем качаю разные аудиофайлы, где части смешаны так, что один из них слышно лучше остальных.
Это довольно трудоемкий процесс, и хотя мне удалось убрать некоторые его части из сценария (путем микширования каждой дорожки в виде отдельного аудиофайла, а затем использования sox в сценарии bash для создания всех файлов), я Я все еще в поиске чего-то еще более эффективного.
Есть ли какая-то программа, которая принимает миди-файлы и на вход и создает репетиционные аудиофайлы на выходе?
Если я правильно понимаю, у вас есть миди-файл с N разными дорожками, и вы хотите создать из него N звуковых файлов, где для каждого звукового файла одна из дорожек пропорционально громче всех остальных дорожек.
Если это так, вы можете сделать это с помощью python и фантастической библиотеки music21 :
from music21 import *
##Load in a MIDI file
st = converter.parse(filePath)
Затем для каждого файла, который вы хотите создать, и для каждой партии в потоке music21 отрегулируйте громкость всех нот + аккордов.
for n in streamPart.notes:
n.volume.velocity = (n.volume.velocity * scaleFactorForPart)
где scaleFactorForPart равно (например) 1, если это та часть, которую вы хотите сделать громче, или 0,8 (например) для всех остальных частей.
Наконец, сохраните MIDI-файлы:
mf = midi.translate.streamToMidiFile(finalStream)
fileName ="whatever.mid"
mf.open(fileName, 'wb')
mf.write()
mf.close()
Очевидно, что эти фрагменты кода являются псевдокодом, и я упустил немного логики. После того, как вы сохранили все файлы MIDI, вы можете использовать сценарий bash и конвертер для преобразования файлов MIDI в MP3/Wav/что угодно.
Спелдоса
Спелдоса
midicsv
вместо предложенной программы в этом ответе. Я все еще пытаюсь понять миди-звуковую часть (это можно сделать черезfluidsynth
иsoundfonts
, но это звучит не особенно хорошо, даже при использовании самых качественных).Майкл Скотт Асато Катберт
finalStream.write('midi', fp="whatever.mid")
.