# MusicBox Ściślej: Collaborative Text Music Box Chodzi o minimalistyczną aplikację przeglądarkową, gdzie mamy dostępne pole tekstowe. Na podstawie tego co wpiszemy jest tworzona w pętli muzyka. Piszemy np.: ``` 4/4 |BcccTccc|BcBcTcccBcBcTccc| - linia perkusyjna |B |B.......| |Am|Dm...| ``` ## Moduły * parser (front) * engine (front) * synchronizacja stanu (websocket do backendu) * sample statyczny na backendzie - (B -> bass.mp4, t -> hat.mp4) ``` text -> parser -> format pośredni -> player -> podświetlanie składni ``` ## Do przygotowania * synteza prostego rytmu (tone.js?) musimy wiedzieć jak będzie wyglądał pośredni format ``` |bc|bc| |Am|Bm| ``` * podświetlanie składni w textbox (aktualnie grana kolumna, błędy itp) * websocket, aktualizacja stanu (wysyłamy nasz text box, dostajemy text box pozostałych) * wirtualna maszyna w touku * wizualizacja - wyciągnięcie z spektrum sensowne wartości dla nussrapera, ewentualnie może tome.js lub inna jest w stanie od razu dać jakieś wartości * metronom na gębie - nusstronom * frontend - pole tekstowe ``` 4/4 tempo: 90 |BcccTccc| -> parser -> reprezentacja wewnętrzna reprezentacja wewnętrzna -> engine (player) (sample / synteza tone.js) -> ścieżka ``` * zmiana? - na koniec taktu - po pętli (<- najprostrze) - ctrl + Enter (na koniec taktu, po pętli) ``` mode: takt|loop|ctrl+enter 1: |BcccTcxc| 2: |BcBcTc| #|1|1|1|2| |1|1|1|bccis| |Am Bm | |bc|bc| |Am|Bm| ``` ## Multiplayer Do rozpatrzenia dwa warianty: * każdy ma swoje pole do edycji np.: ``` user1: ------------ |BcccTccc|BcBcTccc| ------------ user2: ------------ |Am...|Dm...| ------------ ``` * lub jedno wspólne - tak jak w google docs (fajniejsze i trudniejsze ;) ## Dodatkowe opcje * nussraper * wizualizacja na podstawie spektrum (https://www.youtube.com/watch?v=VXWvfrmpapI&t=108s&ab_channel=Frankslaboratory) * pokoje * kolekcje (zapisywanie tego co się uda stworzyć) * efekty * syntezacja tekstu i rapowanie (nth zwiększający fun factor :D) * eksport do midi / mp4 * transpozycja * jakieś opcje odsłuchu/zapętlenia poszczególnych taktów * vocaloid ## Notacja wewnętrzna ```javascript // |kccc| // |AmAm| -> |Am Am | // |kccc| -> |k c c c | // |Am| -> |Am | // |kcccsccc| -> |kcccsccc| let takt = [ ['p:k:16n', 'g:Am:1n'] [], ['p:h:16n'] ... ] ``` ``` engine.graj(doZagrania) { 'p:k:16n' let insturment let note let duration if (insturment = perkusja) players.player(note).play(duration) } ``` ```javascript let seq = new Tone.Sequence(function(time, idx) { takt[idx].forEach((doZagrania) => engine.graj(doZagrania)) }, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], '16n') Tone.Transport.start('+0.4') seq.start() ``` * Do rozkminienia co z tym time ## Stack * frontend: czysty typescript + snowpack (raczej bez frameworków)? * komunikacja frontend - backend - websocket, opcjonalnie fajnie byłoby sprawdzić p2p na webRTC? * backend: wiadomo - w kotlinie :P ### Synteza dźwięku https://tonejs.github.io/examples/stepSequencer https://github.com/tonaljs/tonal - teoria muzyki w js https://www.devbridge.com/articles/tonejs-coding-music-production-guide/ ### Instrumenty https://editor.p5js.org/ada10086/sketches/BynF7xdcQ https://tonejs.github.io/examples/jump ## Inspiracje https://notes.ameo.design/fm.html https://gibber.cc/alpha/playground/ https://tidalcycles.org/Mini_notation_syntax - perkusja https://nestup.cutelab.nyc/ - język / notacja muzyczna # Backend ```json //client -> ws { room: 1 name: 'rgl' } //client -> swój stan (text) - on update + rebounce { msgType: 'update' state: { rgl: '|pccckccc|...' } } //server -> stan wszystkich { room: 1 msgType: 'update' state: { rgl: '' rsr: '' ... } } ```