2010-01-10 24 views
10

estoy trabajando en proyecto midi y quería visualizar la música midi como espectrografía de música Mp3 ... Quiero saber cómo convertir Midi Ticks a segundos de reproducción real ... como si hubiera un midi tick en PPQ (Pulso por negra) por ejemplo 1120. ¿Hay una fórmula para convertirlo en segundos de reproducción del mundo real?Midi Ticks a PlayBack segundos reales !!! (Midi Music)

+0

no obtengo ... Digamos que tengo una música que tiene un tempo constante de 424 BPM ... Ahora tengo fluctuaciones de tics midi en PPQ ... por ejemplo 70272,70344,70372 etc ... ahora para cada miditick quiero tener un segundo equivalente de reproducción en el mundo real .... si tomo el ejemplo 145240 PPQ (marcación midi) ... (muestra midi tick tomada del archivo de música midi de muestra) ... entonces tu fórmula es dándome este 0.9116185787866357 no de milisegundos ... que se convierte en 0.0009116185787866358 en segundos ... lo cual me desconcierta porque 145240 midi tick se produce después de 1 segundo en la reproducción de la música midi .... Ayuda por mayor – Taha

Respuesta

10

La fórmula es 60000/(BPM * PPQ) (milisegundos).

Donde BPM es el tempo de la pista (Beats Per Minute).

(es decir, una pista de 120 BPM tendría un tiempo MIDI o de (60000/(120 * 192)) 2.604 ms para 1 garrapata.

Si usted no sabe el valor de BPM entonces usted tendrá que determinar que en primer lugar. MIDI veces son totalmente . depende del tempo pista

+0

Sería genial si esta respuesta explica cómo calcular BPM. – Oddthinking

+3

@Oddthinking: calcúlalo de qué? – Aaronaught

+4

BPM no es un concepto nativo de MIDI. Se deriva de los microsegundos por trimestre Nota (de SET_TEMPO) y la firma de tiempo. Ver [esta publicación en el blog] (http://www.lastrayofhope.com/2009/12/23/midi-delta-time-ticks-to-seconds/) para obtener más detalles sobre cómo se calcula. – Oddthinking

0

60 bpm es de 1 minuto 1000 milisegundos es de 1 seg 60 segundos es de 1 minuto o 60.000 milisegundos

así para convertir milisegundos a BPM para un evento de garrapata: bpm (en milisegundos) es igual a 60000 dividido por (BpmVa Lue)

para establecer evento Tick de */8 medidas (como en 7/8): lpm (en milisegundos) es igual a 60000 dividido por (BpmValue) dividido por 2

estoy trabajando en un C# Metrónomo ahora. Si está programando, vuélvalo a entero para redondear. fracciones de milisegundos no deberían ser un problema. aunque si la precisión es tu problema, asegúrate de configurar el resultado en un punto flotante.

pregunta: ¿el objeto del temporizador C# permite el valor del punto flotante asignado a milisegundos?

cualquier comentario o sugerencia relacionado con la implementación de C# son muy apreciados. si mi matemática es defectuosa, por favor también hágamelo saber. ¡Gracias!

+1

Tenga cuidado con el uso de temporizadores C# que tienen una resolución de solo unos 15 ms. Ver http://stackoverflow.com/questions/3744032/why-are-net-timers-limited-to-15-ms-resolution – pilotcam

+1

Realmente aprecio tu comentario ya que no me di cuenta. pero para llegar a 50 mil, el tempo tendría que ser de 1120 latidos por minuto, lol – Adam

+1

, veo tu punto ahora que leí el artículo. ¿Convertir los valores en tipos enteros más pequeños mejora la velocidad de la resolución? noob aquí, así que vaya fácil – Adam