음악, 삶, 개발

Waveform 을 그리기위해 고려해야할것들 + 도움되는 외국 글들 본문

개발 Web/PixiJS

Waveform 을 그리기위해 고려해야할것들 + 도움되는 외국 글들

Lee_____ 2021. 8. 15. 03:46

< 소리에 관한 것들 >

 

https://stackoverflow.com/questions/26663494/algorithm-to-draw-waveform-from-audio

https://matt.aimonetti.net/posts/2015-12-audio-dsp-demystified-sampling/

https://matt.aimonetti.net/posts/2019-06-generating-waveform-data-audio-representation/

https://matt.aimonetti.net/posts/2019-07-drawing-waveforms-in-flutter/

https://github.com/bbc/audiowaveform

https://pudding.cool/2018/02/waveforms/

https://youtu.be/laCjGMhASp8

https://dev.opera.com/articles/drum-sounds-webaudio/

https://webaudioplayground.appspot.com

https://evan-moon.github.io/2019/07/10/javascript-audio-waveform/ <-- 한국분 정말 감사

https://runebook.dev/ko/docs/dom/web_audio_api/visualizations_with_web_audio_api

https://youtu.be/VC4GCpvIIOE <-- JUCE 튜토리얼이지만 매우 도움됨.

 

위의 글들을 살짝 요약하면, 

10초짜리 wav 파일이 있다면, 44100 * 10 = 대략 44만개의 sample 인데,

이걸 다 그리는건 매우 부하가 큰 작업이므로 , 256개 샘플씩 쪼개서 (해상도를 더 원하면 128, 64 식으로 낮춤)

이 256개의 각 sample 값을 sum 해서 점프뛰면서 그려내는것이다.

따라서 10초짜리 샘플 (44만개) 였지만, 그리는것은 256개의 합들, 즉 44만개 / 256 이므로 대략 1700개 포인트이다.

해상도 256 은 분명 어느 wav 파일이든 다 적용되는 마법의 값이 아니라 파일의 길이에 따라 dynamic 하게 변해야할것이다.

매우 긴 파일 (1시간짜리) 이라면 해상도가 훨씬 길어야할것이다.

만약 매우 짧은 oneshot 의 소리라면 기껏해야 2초인데, 이걸 256 의 해상도로 그려내게되면 정확하지않을것이다.

이때는 적어도 128의 해상도, 눈으로 보고 더 낮춰야할수도있다. (zoom 을 땡기는 상황도 고려해서)

어쩃든 그려야하는 sample 의 갯수를 최대한 줄이면서, 눈으로 봤을때는 실제 소리를 왜곡하지않는 범위내에서

적절한 해상도를 찾아내야한다.

 

아마도 사용자가 드래그한 오디오 파일의 data 를 파싱하기위해서는 WebAudio 도 필요할것같다.

아니면 드래그한 파일의 파일경로만 webView 에서 드래그로 받아서 (흠 가능한가?),

이를 Max 로 쏜뒤에, Max 에서 data 를 summary 해서 buffer 에 저장하고, 

다시 클라이언트로 socket.io 를 통해 쏴줘서 여기서 그리는 방법도 가능할것이다.

 

파형을 그리는건 어렵지않을거라 생각했는데, 이것저것 엮여있는 꽤나 복잡한 일이었다.

 

< PIXI 로 몇백만개의 선을 그리는것에 대한 이야기 - Mesh 에 대해서 알아야함>

 

https://github.com/pixijs/pixijs/discussions/7399

https://www.pixiplayground.com/#/edit/wUAri_e9qW6cM9olqeSm7