J'écris un éditeur de forme d'onde audio dans Cocoa avec un large éventail d'options de zoom. Au plus large, il montre une forme d'onde pour une chanson entière (~ 10 millions d'échantillons en vue). Au plus étroit, il montre une représentation précise de l'onde sonore (environ 1 000 échantillons dans une vue). Je veux être en mesure de passer en douceur entre ces niveaux de zoom. Certains éditeurs commerciaux comme Ableton Live semblent le faire d'une manière très bon marché.Méthode efficace pour tracer une ligne avec des millions de points
Mon implémentation actuelle satisfait la plage de zoom souhaitée, mais elle est inefficace et instable. La conception est largement inspirée par cet excellent article sur le dessin des formes d'ondes avec du quartz:
http://supermegaultragroovy.com/blog/2009/10/06/drawing-waveforms/
Je crée plusieurs années CGMutablePathRef pour le fichier audio à différents niveaux de réduction. Quand je suis complètement zoomé, j'utilise le chemin qui a été réduit à un point par millier d'échantillons. Lorsque je suis zoomé au maximum, j'utilise ce chemin qui contient un point pour chaque échantillon. Je redimensionne un chemin horizontalement lorsque je suis entre deux niveaux de réduction. Cela devient fonctionnel, mais est encore assez cher et les artefacts apparaissent lors de la transition entre les niveaux de réduction. Une pensée sur la façon dont je pourrais rendre cela moins cher est de supprimer l'anti-aliasing. La forme d'onde de mon éditeur est anti-aliasée alors que celle d'Ableton ne l'est pas (voir la comparaison ci-dessous).
Je ne vois pas un moyen de désactiver l'anti-aliasing pour CGMutablePathRef de. Existe-t-il une alternative non-anti-alias à CGMutablePathRef dans le monde de Cocoa? Si ce n'est pas le cas, est-ce que quelqu'un connaît des classes OpenGL ou un exemple de code qui pourrait m'aider à dessiner mon énorme ligne plus efficacement?
Mise à jour 21/01/2014: Il y a maintenant une grande bibliothèque qui fait exactement ce que je cherchais: https://github.com/syedhali/EZAudio
Merci pour la réponse détaillée! On dirait que vous avez été ici aussi. En effet, je dessine la forme d'onde plus souvent que nécessaire. Je chercherai à remplacer une reprise complète par une superposition. En ce qui concerne Ableton en utilisant les valeurs s + h, quelles sont ces valeurs? Vous avez raison de supposer que ma mise en œuvre utilise une interpolation linéaire. On dirait que les lignes au carré d'Ableton pourraient être plus efficaces à dessiner, mais je ne sais pas comment je ferais ça. – tassock
@tassock vous êtes les bienvenus. par 's + h', je voulais dire les valeurs 'sample and hold' du signal. ceci dessine juste les étapes de forme d'onde exactement comme elles sont représentées dans le domaine temporel. il est préférable (imo) d'interpoler et de construire la représentation du signal. s + h est ok, mais cela devrait être une option, avec une représentation interpolée par défaut. quand je dis interpolation, je parle d'une approche plus représentative d'un signal analogique que s + h ou d'une interpolation linéaire. pour cela, il faudra probablement que vous équilibrez la performance avec précision. un sinc serait bon, (suite) – justin
mais vous pouvez probablement vous en sortir avec une spline d'ordre supérieur (par exemple). interpoler/reconstruire correctement la forme d'onde peut ajouter beaucoup de cpu à votre implémentation actuelle. – justin