Pergunta

Eu tenho música de fundo para algumas músicas disponíveis nos formatos .mid e .kar, mas em cada caso está sendo tocado um pouco mais rápido do que eu gostaria. Qual é a maneira mais simples de criar arquivos .mid ou .kar com o mesmo conteúdo, mas em um ritmo mais lento - digamos, um desacelerou em 20%ou mais, outro em 15%, um terço em 25%e assim por diante?

Idealmente, eu preferiria um script python de plataforma cruzada (já que isso me permitiria ajustar facilmente experimentalmente a fonte para convergir para o efeito exato que eu quero ;-), mas vou pegar qualquer solução gratuita que seja executada no Linux (Ubuntu 8.04 Se importa) e Mac (Mac OS X 10.5, mas 10.6 Compatibilidade preferida).

Foi útil?

Solução

Você pode editar o arquivo, conforme http://www.sonicspot.com/guide/midifiles.html

Embora provavelmente já exista uma biblioteca de leitura/escrita MIDI. De fato, era uma questão de ver as perguntas relacionadas: Biblioteca Midi simples e cruzada para Python

Defina o ritmo

Este meta-evento define o ritmo de sequência em termos de microssegundos por semestre, que é codificado em três bytes. Geralmente é encontrado no primeiro pedaço de faixa, alinhado ao tempo para ocorrer ao mesmo tempo que uma mensagem de relógio MIDI para promover a sincronização mais precisa. Se nenhum evento de ritmo definido estiver presente, 120 batidas por minuto serão assumidas. As fórmulas a seguir podem ser usadas para traduzir o ritmo a partir de microssegundos por quarto para batidas por minuto e voltar.

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

Outras dicas

Como Vinko diz, você pode editar o Midifile, mas como é um formato binário, espremido no menor número de bits possíveis, ajuda a ter ajuda.

Este é um conversor médio para texto (e vice-versa):
http://midicomp.opensrc.org/
Eu tenho usado um pouco ultimamente. É bastante trivial fazer o processamento de texto (por exemplo, pesquisando a linha com "Tempo") para operações simples depois de ter o Midifile como texto. Não experimentei o Mac (compilado sem problemas no Ubuntu 8.04).

Em relação ao ritmo médio especificamente, é realmente fácil desacelerar ou acelerar a reprodução, já que o momento dos eventos é especificado em termos de "ticks", cuja duração real em segundos é determinada pelo parâmetro do tempo descrito na citação de Vinko. Acredito que a assinatura do tempo não é tão relevante e é principalmente para exibir barras/batidas corretamente quando aberta em um sequenciador MIDI.

Além disso, além de Pyportmidi, existem alguns outros módulos Python Midi ao redor.

Hmmm ... parece que só posso postar no link por postagem, sendo um novo usuário. Vou tentar postar os links para os módulos Python em alguns comentários ou outro casal respostas ...

Você pode usar Music21 Para fazer isso, embora eu tenha testado apenas no 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') 

As compensações são como os registros de data e hora de cada nota, e as durações são quanto tempo a nota é soa, acredito que aplicar o mesmo fator de escala a cada um é como ajustar o ritmo.

Se você é como eu, então está ouvindo as mesmas músicas 7 anos depois e pode tentar! Caso contrário, espero que isso ajude alguém que acordou hoje como eu e estivesse coçando minha cabeça tentando resolver esse problema facilmente.

Eu tenho um interesse semelhante ao da sua postagem. Acabei de me deparar com esta biblioteca que parece muito promissor:

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top