Sto scrivendo un editor di forme d'onda audio in Cocoa con una vasta gamma di opzioni di zoom. Nel suo punto più largo, mostra una forma d'onda per un'intera canzone (~ 10 milioni di campioni in vista). Al suo punto più stretto, mostra una rappresentazione accurata dei pixel dell'onda sonora (~ 1mila campioni in una vista). Voglio essere in grado di passare senza problemi tra questi livelli di zoom. Alcuni editori commerciali come Ableton Live sembrano farlo in un modo molto economico.Metodo efficiente per tracciare una linea con milioni di punti
La mia attuale implementazione soddisfa il mio intervallo di zoom desiderato, ma è inefficiente e mosso. Il design è in gran parte ispirato da questo ottimo articolo su disegno le forme d'onda con quarzo:
http://supermegaultragroovy.com/blog/2009/10/06/drawing-waveforms/
creo CGMutablePathRef multipli di per il file audio a vari livelli di riduzione. Quando ho eseguito lo zoom completo, utilizzo il percorso ridotto a un punto per x-mille campioni. Quando sono ingrandito completamente, utilizzo quel percorso che contiene un punto per ogni campione. Scala un tracciato orizzontale quando sono tra i livelli di riduzione. Ciò lo rende funzionale, ma è ancora piuttosto costoso e appaiono artefatti durante la transizione tra i livelli di riduzione.
Un pensiero su come rendere questo meno costoso è eliminare l'anti-aliasing. La forma d'onda nel mio editor è anti-alias mentre quella in Ableton non lo è (vedi confronto sotto).
Non vedo un modo per disattivare l'anti-aliasing per CGMutablePathRef di. Esiste un'alternativa non anti-alias a CGMutablePathRef nel mondo di Cocoa? In caso contrario, qualcuno sa di alcune classi OpenGL o codice di esempio che potrebbe mettermi sulla buona strada per disegnare la mia enorme linea in modo più efficiente?
Aggiornamento 2014/01/21: ora C'è una grande libreria che fa esattamente quello che stavo cercando: https://github.com/syedhali/EZAudio
Grazie per la risposta dettagliata! Sembra che tu sia stato anche qui. In effetti sto disegnando la forma d'onda più spesso di quanto potrebbe essere necessario. Vedrò di sostituire un completo re-draw con una sovrapposizione. Per quanto riguarda Ableton usando i valori s + h, quali sono quelli? Hai ragione di presumere che la mia implementazione utilizza l'interpolazione lineare. Sembra che le linee squadrate di Ableton potrebbero essere più efficaci da disegnare, ma non sono sicuro di come farei. – tassock
@tassock prego. per 's + h', intendevo i valori 'sample and hold' del segnale. questo semplicemente disegna i passi della forma d'onda esattamente come sono rappresentati nel dominio del tempo. è meglio (imo) interpolare e costruire la rappresentazione del segnale. s + h è ok, ma dovrebbe essere un'opzione, con una rappresentazione interpolata come predefinita. quando dico interpolazione, mi riferisco a un approccio che è più rappresentativo di un segnale analogico rispetto a s + h o interpolazione lineare. per questo, probabilmente richiederà il bilanciamento delle prestazioni con precisione. un sinc sarebbe buono, (cont) – justin
ma è probabile che si possa ottenere una spline più alta (come un esempio). interpolando/ricostruendo correttamente la forma d'onda può aggiungere molta cpu all'attuale implementazione. – justin