musique/doc/wprowadzenie.md
2022-11-20 16:14:12 +01:00

299 lines
8.2 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: Wprowadzenie do języka Musique
date: 2022-11-12
author: Robert Bendun <robben@st.amu.edu.pl>
---
# Wprowadzenie do języka Musique
W dalszej części tekstu przyjmujemy następujące konwencje:
`>` jest to [znak zachęty](https://pl.wikipedia.org/wiki/Znak_zach%C4%99ty) i wskazuje gotowość programu Musique do wprowadzania tekstu. Jeżeli widzisz taki znak, oznacza to, że jesteś w programie Musique.
Przykładowo:
```
> 3 + 4
7
>
```
W tym przykładzie wykonujemy `3 + 4` , zatwierdzając ENTEREM, w zwrocie otrzymując w tym konkretnym przypadku wynik operacji.
Przykłady w tym wprowadzeniu mogą rozpoczynać się od `>` oznacza to, że polecenia wprowadzono w sesji interaktywnej, lub bez tego znaku wtedy traktujemy przykład jako zapisany plik z poleceniami.
Nie ma różnic pomiędzy wykonywaniem poleceń języka Musique zawartych w pliku, a poleceniami wprowadzanymi w sesji interaktywnej wybór pozostawiamy użytkownikowi.
Można wykonać złożone polecenia (które w pliku zostałyby rozbite na kilka linii) w sesji interaktywnej - należy wtedy wpisać je w formie jednej linii.
## Nuty, pauzy, akordy
W tej sekcji zostanie omówione tworzenie prostych utworów z wykorzystaniem nut, akordów oraz prostych sekwencji.
### Nuty
Aby zagrać nutę C wpisz `play c` w uruchomionym programie Musique.
```
> play c
```
Możesz zagrać inną nutę jak E:
```
> play e
```
lub wiele nut po kolei należy umieścić je w nawiasach okrągłych, rozdzielone przecinkami:
```
> play (c, e, g)
```
Dostępne dźwięki bazowe to kolejno: `c`, `d`, `e`, `f`, `g`, `a`, `b`. Można je modyfikować poprzez znaki:
- `#` lub `s` podwyższający wysokość dźwięku o pół tonu (krzyżyk, **s**harp)
- `b` lub `f` obniżający wysokość dźwięku o pół tonu (**b**emol, **f**lat)
pozwala to przykładowo tworzyć:
- `c#` - dźwięk Cis
- `c##` - dźwięk D
- `eb` - dźwięk Dis
Aby dźwięk został odtworzony w wybranej oktawie można dołączyć do znaku dźwięku liczbową wartość oktawy - `c4` to dźwięk C w 4 oktawie, `c#8` to dźwięk Cis w 8 oktawie, itp.
```
> play (c4, c5, c6)
```
Aby dźwięk trwał określoną długość należy podać jako dodatkowy parametr pożądaną wartość, przykładowo:
Sekwencja złożona z dźwięku C w 4. oktawie trwającym ćwierćnutę, dźwięku D w 5. oktawie trwającym półnutę oraz dźwięku E w 4. oktawie trwającym całą nutę wygląda następująco:
```
> play (c4 (1/4), d5 (1/2), e4 1)
```
Można uprościć zapis korzystając z predefiniowanych czasów dźwięków:
| nazwa | czas trwania | liczbowo |
| :-: | :-: | :-: |
| `wn` | cała nuta | `1` |
| `dwn` | cała nuta z kropką | `3/2` |
| `hn` | półnuta | `1/2` |
| `dhn` | półnuta z kropką | `3/4` |
| `qn` | ćwierćnuta | `1/4` |
| `dqn` | ćwierćnuta z kropką | `3/8` |
| `en` | ósemka | `1/8` |
| `den` | ósemka z kropką | `3/16` |
| `sn` | szesnastka | `1/16` |
| `dsn` | szesnastka z kropką | `3/32` |
| `tn` | trzydziestkadwójka | `1/32` |
Korzystając z tych długości możemy powyższy przykład zapisać równoważnie w ten sposób:
```
> play (c4 qn, d5 hn, e4 1)
```
### Pauzy
Pauzy stosuje się poprzez użycie litery `p`:
```
> play (c4 hn, p qn, c4 hn, p qn, c4 hn)
```
Pauzy zachowują się identycznie jak nuty opisane powyżej.
### Akordy
Aby odegrać akord należy umieścić symbole dźwięków, z których miałby się składać, w wywołaniu funkcji `chord`:
```
> play (chord (c, e, g))
```
W utworze możemy chcieć częściej używać tych samych akordów czy sekwencji. Przypisanie ich do wybranej nazwy wyglądałoby tak:
```
> sekwencja := (c, e, g)
> sekwencja
(c, e, g)
```
Wpisanie samej nazwy pozwala zobaczyć co się pod nią znajduje.
Zapisaną sekwencję możemy przerobić na akord, ponownie wykorzystując funkcję `chord`:
```
> C := chord sekwencja
> C
chord (c, e, g)
```
i następnie go odtworzyć:
```
> play C
```
Należy zwrócić uwagę, że Musique rozróżnia wielkość liter. Ponadto nazw będących oznaczeniami dźwięków jak `c` bądź `cffff` nie można używać jako nazw dla zmiennych.
## Metody tworzenia sekwencji
### Wielokrotne powtarzanie tego samego dźwięku
Wielokrotne powtarzanie tego samego dźwięku można osiągnąć poprzez mnożenie dźwięku przez ilość powtórzeń:
```
> 3 * c
(c, c, c)
> c * 3
(c, c, c)
> 3 * (c, e)
(c, e, c, e, c, e)
```
Operacja ta zachowuje długości i oktawy:
```
> 3 * (e4 qn, f8 tn)
(e4 1/4, f8 1/32, e4 1/4, f8 1/32, e4 1/4, f8 1/32)
```
### Wybieranie losowego dźwięku z grupy
Funkcja `pick` pozwala na wybór losowego elementu z sekwencji. Można użyć jej np. do grania dźwięku o losowej długości:
```
> play (c4 (pick qn hn))
```
W powyższym przykładzie dźwięk C w oktawie 4. zostanie zagrany losowo z długością ćwierćnuty lub półnuty.
### Losowe ustawienie elementów sekwencji
Funkcja `shuffle` pozwala na tworzenie sekwencji z losową kolejnością elementów, np:
```
> shuffle (c, e, f, g)
(f, g, e, c)
```
### Generowanie sekwencji w oparciu o liczbę półtonów
`dźwięk + liczba` przesuwa dany dźwięk o daną liczbę półtonów. Pozwala to tworzyć następujące sekwencje:
```
> c4 + (0, 1, 2, 3)
(c4, c#4, d4, d#4)
```
Podobny efekt można uzyskać funkcję `up` jako generator wartości liczbowych:
```
> up 5
(0, 1, 2, 3, 4)
> c4 + up 4
(c4, c#4, d4, d#4, e4)
> play (c4 + up 4)
```
Analogicznie działa funkcja `down`, generująca wartości liczbowe w kierunku zera:
```
> down 5
(4, 3, 2, 1, 0)
> c4 + down 5
(e4, d#4, d4, c#4, c4)
> play (c4 + down 5)
```
Możemy złączyć sekwencje przy pomocy operatora `&`:
```
> up 5 & down 5
(0, 1, 2, 3, 4, 4, 3, 2, 1, 0)
> play (c4 + up 5 & down 5)
```
Jeśli przeszkadza nam podwójnie zagrana nuta `e4` możemy ją wyeliminować funkcją `uniq`, która usuwa sąsiadujące ze sobą powtórzenia:
```
> uniq (up 5 & down 5)
(0, 1, 2, 3, 4, 3, 2, 1, 0)
> play (c4 + uniq (up 5 & down 5))
```
## Metody odtwarzania sekwencji
Musique posiada trzy główne metody odtwarzania sekwencji:
- `play` które odtwarza dźwięki w kolejności
- `par` które odtwarza pierwszy dźwięk równocześnie z pozostałymi
- `sim` który odtwarza każdą podaną mu sekwencję równocześnie
Każda z nich w momencie napotkania dźwięku z nieokreśloną oktawą lub długością wypełni ją według wartości *domyślnej* (wartości domyślne to: 4. oktawa, 120 bpm, ćwierćnuta).
Wartości domyślne można ustawiać przy pomocy funkcji `oct`, `len` oraz `bpm`. Poniższy przykład ustawia domyślną oktawę na 5, domyślną długość na półnutę oraz domyślne tempo na 100 uderzeń na minutę:
```
> oct 5
> len hn
> bpm 100
```
### `play`
`play` przechodzi kolejno przez elementy sekwencji i kończy się po odtworzeniu wszystkich dźwięków.
Jeśli chcemy wykonać kilka `play` po sobie, możemy to osiągnąć rozdzielając je przecinkami analogicznie do wspomnianych wcześniej sekwencji:
```
play (c qn, e qn, g hn),
play (16 * (f sn)),
play (c qn, e qn, g hn),
```
Uwaga powyższy przykład reprezentuje polecenia zapisane w pliku (stosujemy konwencję rozszerzenia `.mq`) wskazuje na to brak znaku zachęty `>`.
Można ten zapis uprościć:
```
play (
(c qn, e qn, g hn),
(16 * (f sn)),
(c qn, e qn, g hn),
),
```
gdzie wcięcia i nowe linie zostały dodane dla poprawy czytelności.
### `par`
`par` umożliwa wykonanie pierwszego argumentu przez całą długość trwania pozostałych - niezależnie od tego jaka długość dźwięku została określona dla pierwszego z nich, zostanie dopasowany do sumy długości pozostałych dźwięków.
Przykład inspirowany Odą do Radości, w którym akord trwa przez całą długość odtwarzania sekwencyjnie pozostałych dźwięków. Wcześniej ustawiamy domyślną oktawę jako 5, by nie musieć powtarzać jej przy każdym dźwięku:
```
oct 5,
par (chord c3 g3 c4) (e, e, f, g)
```
### `sim`
`sim` umożliwia wykonywanie równocześnie kilku sekwencji.
Poniżej "niepoprawna" metoda stworzenia akordu poprzez równocześne odtworzenie dźwięków c, e, g:
```
> sim c e g
```
Trzy dźwięki C w domyślnej oktawie o długości ćwierćnuty odtwarzane równocześnie wraz z pauzą ćwierćnutową i czterema dźwiękami D w 5. oktawie o długości szesnastki:
```
> sim (3 * c qn) (p qn, 4 * (d5 sn))
```