299 lines
8.2 KiB
Markdown
299 lines
8.2 KiB
Markdown
---
|
||
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))
|
||
```
|