2.4 Tímalengd með hjúpum

# Tímalengd með hjúpum

Í fyrri kafla sáum við hvernig við getum notað `sleep` skipunina til að stjórna hvenær hljóð eru ræst. En við getum enn ekki stjórnað tímalengd hljóðanna.

Sonic Pi er með einfalda en öfluga leið til að *stjórna tímalengd* hljóðanna. Til þess er notað fyrirbærið *ADSR amplitude envelope* sem mætti þýða *ADSR sveifluvíddarhjúpur* (ADSR verður útskýrt síðar í þessum hluta). Með sveifluvíddarhjúpi fáum við tvenns konar stjórnun:

* stjórn yfir tímalengd hljóðs
* stjórn yfir sveifluvídd (hljóðstyrk) hljóðs

## Tímalengd

Tímalengd er sá tími sem hljóðið endist. Meiri tímalengd þýðir að þú heyrir hljóðið lengur. Öll hljóð Sonic Pi hafa stillanlegan sveifluvíddarhjúp og heildartímalengd þess hjúps er tímalengd hljóðsins. Þannig að með því að stjórna hjúpnum stjórnar þú tímalengdinni.

## Sveifluvídd (amplitude)

ADSR hjúpurinn stjórnar ekki bara tímalengdinni, heldur gefur það þér *nákvæma stjórn á sveifluvídd hljóðsins*. Öll heyranleg hljóð byrja og enda á þögn og þar á milli er hluti sem er ekki þögull. Með hjúpnum getur þú breytt og/eða haldið stöðugri sveifluvídd þess hluta sem ekki er þögull. Það er eins og að gefa einhverjum fyrirmæli um að hækka og lækka hljóðstyrkinn á gítarmagnara. Þú gætir t.d. beðið einhvern að "byrja á þögn, hækka svo rólega í fullan styrk, halda honum í smástund, og lækka svo hratt niður í þögn." Í Sonic Pi er getur þú notað hjúpinn til að forrita svona hegðun hljóðs.

Til að rifja upp frá því áður, þá er sveifluvíddin 0 sama og þögn og sveifluvíddin 1 er venjulegur hljóðstyrkur.

Nú skulum við líta á hvern af þeim hlutum sem hjúpa hafa.

## Losunarfasinn

Eini hluti hjúps sem er til staðar sjálfkrafa er sleppitíminn (release time). Það er tíminn sem tekur hljóð gervilsins að dofna. Allir gervlar hafa sjálfkrafa sleppitímann 1 sem þýðir að tímalengd þeirra er einn taktur eða 1 sekúnda (venjulega):

```
play 70
```

Nótan mun heyrast í 1 sekúndu. Taktu tímann ef þú efast :o) Þetta er stytting á lengri og ítarlegri útgáfu:

```
play 70, release: 1
```

Taktu eftir að þetta hljómar alveg eins (hljóðið endist í eina sekúndu). En nú er mjög auðvelt að breyta tímalengdinni með því að breyta tölunni fyrir kostinn `release` (sleppitímann):

```
play 60, release: 2
```

Við getum látið gervilinn hljóma mjög stutt með þvi að nota mjög lítinn sleppitíma:

```
play 60, release: 0.2
```

Lengd sleppitíma hljóðsins er kölluð *sleppifasi* (release phase) hjúpsins og er sjálfgefið línuleg umbreyting (þ.e. bein lína). Eftirfarandi mynd sýnir þessa umbreytingu:

![release envelope](../../../etc/doc/images/tutorial/env-release.png)

Lóðrétta línan lengst til vinstri í myndinni sýnir að hljóð byrjar með 0 sveifluvídd (hljóðstyrk) en fer upp í fulla sveifluvídd samstundis (þetta er svonefndur sóknarfasi (attack phase) sem við tölum um næst). Eftir að hafa náð fullri sveifluvídd stefnir hún í beinni línu niður í núll á tímanum sem `release:` segir til um. *Lengri útspilstímar láta gervil veikjast (fade-out) lengur.*

Þú getur þess vegna breytt tímalengd hljóðsins með því að breyta sleppitímanum. Prófaðu nú að bæta sleppitímum (release) við tónlistina þína.

## Árásarfasinn

Sjálfgefið er *árásarfasinn* (attack phase) 0 fyrir alla gervla sem þýðir að þeir fara frá 0 sveifluvídd til 1 samstundis. Þetta gefur gervlinum ásláttarhljóm í upphafi. En þú gætir viljað láta hljóðið styrkjast smám saman (fade in). Þetta er gert með kostinum `attack:` Prófaðu að láta einhver hljóð styrkjast:

```
play 60, attack: 2
sleep 3
play 65, attack: 0.5
```

Þú getur notað marga kosti samtímis. Til dæmis til að fá stuttan sóknartíma og langan sleppitíma gætirðu prófað:

```
play 60, attack: 0.7, release: 4
```

Svona hjúpur með stutta sókn og langa sleppingu er sýndur í þessari mynd:

![attack release envelope](../../../etc/doc/images/tutorial/env-attack-release.png)

Auðvitað mætti snúa þessu við. Prófaðu langa sókn og stutta sleppingu:

```
play 60, attack: 4, release: 0.7
```

![long attack short release envelope](../../../etc/doc/images/tutorial/env-long-attack-short-release.png)

Loks gætirðu fyrir styttri hljóð haft bæði stutta sókn og stutta sleppingu.

```
play 60, attack: 0.5, release: 0.5
```

![short attack short release envelope](../../../etc/doc/images/tutorial/env-short-attack-short-release.png)

## Uppihaldsfasinn

Enn einn hluti af tímalengd hjúpsins auk sóknar- og sleppitíma er uppihaldstíminn (sustain time) sem stjórnar *uppihaldsfasanum*. Á uppihaldstímanum er sveifluvíddinni haldið stöðugri á milli sóknar- og sleppifasanna.

```
play 60, attack: 0.3, sustain: 1, release: 1
```

![ASR envelope](../../../etc/doc/images/tutorial/env-attack-sustain-release.png)

Uppihaldstíminn er gagnlegur fyrir mikilvæg hljóð sem þú vilt láta njóta sín til fulls áður en mögulegur sleppifasi tekur við. Auðvitað er alveg í lagi að stilla bæði `attack:` og `release:` kostina á 0 og nota bara uppihaldið til að láta hljóðið hvorki styrkjast né dofna. En það ber að varast því að slepping sem er 0 getur orsakað smelli í hljóðinu og það er oft betra að hafa mjög litla tölu eins og 0.2.

## Dölunarfasi

Til að fá enn meiri stjórn getur þú líka skilgreint dölunartíma (decay time). Þessi fasi hjúpsins er á milli sóknar- og uppihaldsfasanna og skilgreinir tímalengd þegar sveifluvíddin lækkar frá sóknarstöðunni (`attack_level:`) niður í dölunarstöðuna (`decay_level:`), sem er sama og uppihaldsstaðan (`sustain_level`) nema þú breytir því. Sjálfgefið hefur kosturinn `decay:` gildið 0 en `attack:`  og `sustain:` gildið 1, svo að þú verður að skilgreina þau til að `decay:` hafi áhrif:

```
play 60, attack: 0.1, attack_level: 1, decay: 0.2, sustain_level: 0.4, sustain: 1, release: 0.5
```

![ADSR envelope](../../../etc/doc/images/tutorial/env-attack-decay-sustain-release.png)

## Dölunarstig

Eitt trix enn er að þó að kosturinn `decay_level:` hafi að óbreyttu sama gildi og `sustain_level:` getur þú gefið þeim önnur gildi til að hafa fulla stjórn á umslaginu. Þannig getur þú búið til svona umslög:

```
play 60, attack: 0.1, attack_level: 1, decay: 0.2, decay_level: 0.3, sustain: 1, sustain_level: 0.4, release: 0.5
```

![ASR envelope](../../../etc/doc/images/tutorial/env-decay-level.png)

Það líka hægt að gefa `decay_level:` hærra gildi en `sustain_level:`:

```
play 60, attack: 0.1, attack_level: 0.1, decay: 0.2, decay_level: 1, sustain: 0.5, sustain_level: 0.8, release: 1.5
```

![ASR envelope](../../../etc/doc/images/tutorial/env-decay-level-2.png)

## ADSR umslög

Til að taka þetta saman, þá hafa ADSR umslög Sonic Pi þessa fasa:

1. *sóknartíma* (attack time) frá sveifluvídd 0 upp í gildi `attack_level`;
2. *dölunartíma* (decay time) þegar sveifluvíddin breytist úr `attack_level` í `decay_level`,
3. *stöðugleikatíma* (sustain time) þegar sveifluvíddin færist frá `decay_level` til `sustain_level`,
4. *sleppitíma* þegar sveifluvíddin færist frá `sustain_level` til 0

Það er mikilvægt að skilja að tímalengd hljóðs er summan af tímum þessara fasa. Þess vegna mun eftirfarandi hljóð hafa tímalengdina 0,5 + 1 + 2 + 0,5 = 4 takta:

```
play 60, attack: 0.5, attack_level: 1, decay: 1, sustain_level: 0.4, sustain: 2, release: 0.5
```

Nú ættir þú að prófa að setja hljóðin þín í umslög með þessum kostum...
