2009-09-06 35 views
13

Tengo música de fondo para algunas canciones disponibles en formatos .MID y .KAR, pero en cada caso se está reproduciendo más rápido de lo que me gustaría. ¿Cuál es la forma más sencilla de crear archivos .MID o .KAR con el mismo contenido pero a un tempo más lento, por ejemplo, uno ralentizado en un 20% más o menos, otro en un 15%, un tercio en un 25%, etc.?Cómo "ralentizar" un archivo MIDI (idealmente en Python)?

Idealmente, preferiría una secuencia de comandos de Python multiplataforma (ya que eso me permitiría ajustar la fuente de forma experimental para convergir al efecto exacto que quiero ;-), pero tomaré cualquier solución gratuita que se ejecute en Linux (Ubuntu 8.04 si importa) y Mac (Mac OS X 10.5, pero se prefiere la compatibilidad 10.6).

+0

¿Has echado un vistazo al formato OSC? http://en.wikipedia.org/wiki/Open_Sound_Control – magnetar

Respuesta

9

Se puede editar el archivo, como por http://www.sonicspot.com/guide/midifiles.html

A pesar de que probablemente es una lectura MIDI/escritura ya la biblioteca. De hecho, era una cuestión de ver las preguntas relacionadas: Simple, Cross Platform MIDI Library for Python

ajustar el tempo

Este metaevento marca el paso secuencia en términos de microsegundos por cuarto de nota, que es codificados en tres bytes . Por lo general es que se encuentra en el primer trozo de pista, alineado en el tiempo para que ocurra al mismo tiempo como un mensaje de reloj MIDI para promover sincronización más precisa. Si no hay ningún evento de tempo establecido , se asume 120 latidos de por minuto. La siguiente fórmula se puede usar para traducir el tempo de microsegundos por negra a latidos por minuto y atrás.

 
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

Ah, bueno, no parece que vaya a obtener ninguna técnica más directa, así que gracias por este, @Vinko. –

+0

Tanto para SO ser excelente, ¿eh? :-) Cuando ** REALMENTE ** lo necesita, siempre falla. –

13

Como dice Vinko, puede editar el archivo MIDI, pero ya que es un formato binario, exprimido en el menor número de bits posibles, esto ayuda a tener ayuda.

Este es un convertidor midi a texto (y viceversa):
http://midicomp.opensrc.org/
He estado usando un poco últimamente. es bastante trivial hacer el procesamiento de texto (por ejemplo, buscar la línea con "Tempo") para operaciones simples una vez que tenga el archivo midifile como texto. no lo he probado en mac (compilado sin problemas en ubuntu 8.04).

En cuanto midifile tempo específicamente, es muy fácil para ralentizar o acelerar la reproducción ya se especifica el tiempo de los eventos en términos de "ticks", cuya duración real en segundos se determina por el parámetro tempo se describe en la cita de Vinko. Creo que la firma de tiempo no es tan relevante, y es principalmente para mostrar barras/pulsaciones correctamente cuando se abre en un secuenciador midi.

Además, aparte de pyPortMidi, hay un par de otros módulos midi de python.

[hmmm ... parece que solo puedo publicar en el enlace por publicación, ya que soy un nuevo usuario. Voy a tratar de publicar los enlaces a los módulos de Python en un par de comentarios u otras respuestas ...]

+1

Módulo Python para leer, escribir, crear/editar archivos MIDI midi:

+0

Clase para leer y escribir archivos MIDI (esta publicación parece ser la única fuente)):

+0

También encontré esto, aunque no lo he intentado:

0

Tengo un interés similar al de su publicación.Acabo de encontrar esta biblioteca que parece muy prometedor:

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

+0

Tenga en cuenta que [las respuestas solo de enlace] (http://meta.stackoverflow.com/tags/link-only-answers/info) no se recomiendan, por lo que las respuestas deberían ser el punto final de una búsqueda de una solución (vs. otra escala más de referencias, que tienden a quedar obsoletas en el tiempo). Considere agregar una sinopsis independiente aquí, manteniendo el enlace como referencia. – kleopatra

+0

Reemplazar el objeto tempo.MetronomeMark al comienzo de cada pentagrama con uno nuevo debería ser el truco. Tenga en cuenta que actualmente music21 cuantificará cualquier archivo MIDI. Acabo de agregarlo a nuestra lista de tareas pendientes para que sea opcional. –

1

Usted puede utilizar music21 hacer esto, aunque yo sólo lo he probado en 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') 

Las compensaciones son como las marcas de tiempo de cada nota, y la duración es el tiempo que se hace sonar la nota, creo que aplicando el mismo factor de escala para cada uno es algo así como el ajuste del tempo.

Si eres como yo, estás escuchando las mismas canciones 7 años después y puedes intentarlo. De lo contrario, espero que esto ayude a alguien más que se despertó hoy como yo y me estaba rascando la cabeza tratando de resolver este problema fácilmente.

+0

fastScore = score.augmentOrDiminish (1.25) - escalará las duraciones y las compensaciones y algunas otras cosas para que la puntuación también sea correcta. –