Generování hudby na piezo měniči
Michal Vojtek, Vladimír Mejzlík, UREL, FEEC, VUT Brno
mvojtek
centrum.cz
tection
atlas.cz
Obsah:
- Úvod
- Realizace
- Závěr
- Literatura
Cílem projektu bylo vytvořit fungující program, jež umožní generování hudby na piezoměniči připojeném vhodným způsobem k mikroprocesoru.
Ideou bylo naprogramovat zdrojový kód co nejvíce univerzální, jež by nebyl omezen použitou taktovací frekvencí krystalu a obecně použitým hardwarem.
Základem celého projektu je generování tónu o požadované frekvenci.
Toho je dosaženo střídavým spínáním a rozpínáním elektroakustického měniče.
Signál k němu přivedený má tedy tvar obdélníku se střídou 1:1.
Frekvence s níž je vyvolávána změna stavu (sepnutí) musí být tedy dvakrát vyšší,
než je požadovaná generovaná frekvence.
Možností generování takového kmitočtu je u mikroprocesoru hned několik.
Nejméně přesná a nejnáročnější na odlazení je varianta s použitím zpoždění, tzn. nejčastěji
cyklů trvajících známý časový interval.
Mnohem výhodnější a přesnější je použití vlastního čítače/časovače,
který je v mikroprocesoru integrován. I zde se nabízí několik cest řešení,
vycházejících z možnosti využít velkého množství režimů čítače/časovače.
- První varianta je použítí klasického režimu,
kdy přerušení je vyvoláno přetečením čítače. Tato je také použita zvláště pro svoují analogii s čítačem u 8051.
Čítač je inkrementován s frekvencí danou frekvencí oscilátoru
(zde frekvence oscilátoru a strojového cyklu je rovna narozdíl od 8051) a použitou předděličkou.
Když napočítá do svého maxima (16bit čítač = 65535 dekadicky), je vyvoláno přerušení,
které se vhodně obslouží a čítač čítá opět od nuly popřípadě od čísla vloženého do příslušného registru čítače.
V tom případě je číslo do kterého je čítáno rovno 65535- číslo vložené do registru čítače
-
Druhou, pravděpodobně výhodnější variantou je užití PWM módu, kdy obsah čítače (registru) je porovnáván s dalším registrem.
Pokud nastane rovnost, je vyvoláno přerušení. Tento postup je pravděpodobně i srozumitelnější.
Tyto dvě varianty a mnohé další do hloubky rozebírá [1]. Z hudební teorie je zřejmé, že nota A4 je povážováná za základní,
její frekvence je 440Hz, frekvenci dalších not je možné vypočíst ze vzorce f = 2^(n/12) × 440 Hz,
kde n udává počet kroků, o které je námi požadovaná nota vzdálena od základní noty A4 (n může být i záporné pro noty níže A4).
Zdrojový kód je k dispozici zde.
Je vhodně zakomentován a vzhledem k jednoduchosti je sem vložen jen základní popis:
Nebyly použity žádné „extra“ funkce. Do pole melodie[100] se zadávají jednoduché noty a doby těchto not.
A to tak, že první se zadává „doba“ a následně „nota“.
Výběr jednotlivých not a dob je tvořené pomoci ukazatele na jednotlivé adresy v tomto poli.
Je důležité zachovat pořadí, nejprve „doba“ (reprezentovaná číslem) a potom „nota“
(reprezentovaná písmenem v anglickém hudebním zápisu (B=H)). Určení těchto parametrů se provádí pomoci příkazu SWITCH.
Celá nota má čtyři doby a ta je reprezentována „1“.
Půlová nota má dvě doby a ta je reprezentovaná „2“.
Čtvrťová nota má jednu dobu a ta je reprezentovaná „4“.
Následně je inkrementován ukazatel na pole a pomoci stejného příkazu je vybrána nota.
Samotný proces trvání „doby“ je tvořen příkazem for.
Zde se inkrementuje pomocná proměnná „pom“ do určité „doby“ která byla
experimentálně zvolena a je definovaná na začátku programu. Taktéž konstanty
pro generování zvolených not, respektive jim náležících frekvencí, jsou zvoleny
experimentálně (meřením).
Při řešení projektu bylo dosaženo základní funkčnosti programu a generování not,
jakožto i přehrání celé skladby podle not definovaných základní stupnicí a dobou trvání noty (taktem).
Nebylo dosaženo univerzálnosti a nezávislosti na taktovací frekvenci použitého hardware.
Program sebekriticky označujeme jako holou kostru. To, kam jsme mířili,
ale čeho jsme nedosáhli zvláště kvůli špatnému "time managementu"
je shrnuto v následujících bodech. Ty také vyjadřují, kam by se projekt ubíral v případě jeho plného dokončení:
- definice skladby (sledu not a taktu) do paměti programu, tak aby se zbytečně nezabírala RAM
- použití matematiky pro přepočet frekvence tónu z frekvence krystalu zadané softvarově (jako definovaná konstanta)
- definice not samotných využívající MIDI standardu (každé notě přísluší číslo), z tohoto čísla je pak možné vypočíst příslušnou frekvenci
- použití polyfonie, například hlavní melodie v základní tónině a sub melodie hraná o oktávu níž
- nástavba v podobě generování neharmonických (bicí, perkuse) nástrojů za použití generování šumu
Výše zmíněné body mohou být inspirací pro možné pokračovatele tohoto projektu.
Závěrem ještě jednou odkaz nazdrojový kód..
[1] MATOUŠEK, D. Práce s mikrokontroléry ATMEL AVR - 4. díl. 1. vyd., Praha: BEN –
technická literatura, 2006. 320 s. ISBN 80-7300-174-8.