Estoy escribiendo un editor de forma de onda de audio en Cocoa con una amplia gama de opciones de zoom. En su parte más ancha, muestra una forma de onda para una canción completa (~ 10 millones de muestras a la vista). En su parte más estrecha, muestra una representación precisa de píxeles de la onda de sonido (~ 1 000 muestras en una vista). Quiero poder hacer una transición suave entre estos niveles de zoom. Algunos editores comerciales como Ableton Live parecen hacer esto de una manera muy económica.Método eficiente para trazar una línea con millones de puntos
Mi implementación actual satisface mi rango de zoom deseado, pero es ineficaz y entrecortado. El diseño está inspirado en gran medida por este excelente artículo en la elaboración de formas de onda con cuarzo:
http://supermegaultragroovy.com/blog/2009/10/06/drawing-waveforms/
puedo crear múltiples de CGMutablePathRef para el archivo de audio en varios niveles de reducción. Cuando estoy zoom todo el camino, uso la ruta que se ha reducido a un punto por x-mil muestras. Cuando estoy enfocando todo el camino hacia adentro, uso esa ruta que contiene un punto para cada muestra. Escalo un camino horizontalmente cuando estoy entre los niveles de reducción. Esto lo hace funcional, pero sigue siendo bastante caro y aparecen artefactos cuando se realiza la transición entre los niveles de reducción.
Un pensamiento sobre cómo puedo hacer esto menos costoso es eliminar el anti-aliasing. La forma de onda en mi editor es anti-alias mientras que la de Ableton no lo está (vea la comparación a continuación).
no veo una manera de desactivar el anti-aliasing para CGMutablePathRef de. ¿Hay una alternativa no anti-aliased a CGMutablePathRef en el mundo de Cocoa? Si no, ¿alguien sabe de algunas clases de OpenGL o código de muestra que podría ponerme en curso para dibujar mi gran línea de manera más eficiente?
Actualización 21/01/2014: Ahora hay una gran biblioteca que hace exactamente lo que estaba buscando: https://github.com/syedhali/EZAudio
¡Gracias por la respuesta detallada! Parece que has estado aquí también. De hecho, estoy dibujando la forma de onda con más frecuencia de la que podría necesitar. Consideraré sustituir un re-draw completo con una superposición. Con respecto a Ableton usando los valores de s + h, ¿cuáles son esos? Está en lo cierto al suponer que mi implementación usa interpolación lineal. Parece que las líneas cuadradas de Ableton podrían ser más eficientes para dibujar, pero no estoy seguro de cómo voy a hacer eso. – tassock
@tassock de nada. por 's + h', quise decir los valores 'sample and hold' de la señal. esto solo dibuja los pasos de forma de onda exactamente como están representados en el dominio de tiempo. es mejor (imo) interpolar y construir la representación de la señal. s + h está bien, pero debería ser una opción, con una representación interpolada como el valor predeterminado. cuando digo interpolación, me refiero a un enfoque que es más representativo de una señal analógica que s + h o interpolación lineal. para eso, es probable que requiera que equilibre el rendimiento con precisión. un sinc sería bueno, (cont) – justin
pero es probable que salga con una spline de orden superior (como un ejemplo). interpolar/reconstruir la forma de onda correctamente puede agregar mucha CPU a su implementación actual. – justin