Piszę edytor fal dźwiękowych w kakao z szerokim zakresem opcji zoomu. W najszerszym, pokazuje przebieg dla całej piosenki (~ 10 milionów próbek w widoku). W najwęższym miejscu pokazuje on dokładną reprezentację piksela fali dźwiękowej (~ 1 tys. Próbek w widoku). Chcę móc płynnie przechodzić między tymi poziomami powiększenia. Niektóre komercyjne edytory, takie jak Ableton Live, wydają się robić to w bardzo niedrogi sposób.Wydajna metoda narysowania linii z milionami punktów
Moja obecna implementacja spełnia żądany zakres powiększenia, ale jest nieefektywna i nierówna. Konstrukcja jest w dużej mierze zainspirowany tym znakomitym artykule na rysowanie przebiegów z kwarcu:
http://supermegaultragroovy.com/blog/2009/10/06/drawing-waveforms/
utworzyć wiele CGMutablePathRef dla pliku audio na różnych poziomach redukcji. Kiedy jestem przybliżany do końca, używam ścieżki zredukowanej do jednego punktu na x-tysiąc próbek. Kiedy jestem powiększony do końca, używam tej ścieżki, która zawiera punkt dla każdej próbki. Skaluję ścieżkę poziomo, gdy znajduję się pomiędzy poziomami redukcji. To sprawia, że jest funkcjonalny, ale wciąż jest dość drogi, a artefakty pojawiają się podczas przechodzenia między poziomami redukcji.
Jedna myśl o tym, jak mogę ją obniżyć, to wyjąć antyaliasing. Przebieg w moim edytorze jest wygładzony, podczas gdy w Abletonie nie jest (patrz porównanie poniżej).
nie widzę sposobu, aby wyłączyć wygładzanie dla CGMutablePathRef jest. Czy istnieje nie-wygładzana alternatywa dla CGMutablePathRef w świecie kakao? Jeśli nie, czy ktoś wie o niektórych klasach OpenGL lub przykładowym kodzie, który może ustawić mnie na kurs, aby bardziej efektywnie rysować moją wielką linię?
Aktualizacja 21.01.2014: Jest teraz wielka biblioteka, która robi dokładnie to, czego szukałem: https://github.com/syedhali/EZAudio
Dzięki za szczegółową odpowiedź! Brzmi, jakbyś też tu był. Rzeczywiście rysuję kształt fali częściej niż być może potrzebuję. Spróbuję zastąpić pełne ponowne rysowanie za pomocą nakładki. Co się dzieje z Abletonem przy użyciu wartości s + h? Masz rację zakładając, że moja implementacja korzysta z interpolacji liniowej. Wygląda na to, że kwadraty linii Abletona mogą być bardziej wydajne do rysowania, ale nie jestem pewna, jak to zrobię. – tassock
@tassock nie ma za co. przez "s + h" rozumiem wartości "próbki i wstrzymania" sygnału. to po prostu rysuje kroki fali dokładnie tak, jak są one reprezentowane w dziedzinie czasu. lepiej (imo) interpolować i skonstruować reprezentację sygnału. s + h jest w porządku, ale powinna być opcją, z interpolowaną reprezentacją jako domyślną. kiedy mówię interpolację, mam na myśli podejście, które jest bardziej reprezentatywne dla sygnału analogowego niż s + h lub interpolacja liniowa. w tym przypadku prawdopodobnie będzie wymagało zrównoważenia wydajności z dokładnością. sinc byłoby dobre, (cd) – justin
, ale prawdopodobnie można uciec spline wyższego rzędu (jako jeden przykład). interpolacja/rekonstrukcja przebiegu poprawnie może dodać dużo procesora do twojej obecnej implementacji. – justin