3. diel - Zvukový výstup na konzolu
V minulej lekcii, Zadávanie vstupu z klávesnice , sme si predstavili možnosti zaistenia dátového vstupu z klávesnice pomocou metód a vlastností triedy Console - Read (), ReadLine () a ReadKey ().
V dnešnom C# tutoriálu sa zoznámime s možnosťami, ako ovládať
zvukový výstup u konzolových aplikácií. Po pravde
povedané, moc tých možností nie je (prakticky sú len tri) a sú veľmi
obmedzené. Pri šikovnom použitie umožní aplikáciám zahrať
jednoduché melódie, alebo napríklad víťaznú fanfáru.
Aby sme mohli nechať zahrať melódiu, musíme našu aplikáciu naučiť
noty, resp. musíme zadať frekvencie a
dobu trvania jednotlivých tónov. V krátkej odbočke do
hudobnej teórie sa dozvieme, že s použitím správneho algoritmu to nie je
nijak zložité.
Výpis tónu
Najjednoduchšie možností, ako naučiť náš program vyludzovať zvuky, je
vypísať zvukový znak. Jeden taký zvukový znak ponúka
ASCII tabuľka, a to ASCII znak 7
(BEL
). Hoci metóda Write()
slúžia hlavne k výpisu
znakov do okna konzoly, pri výpise znaku BEL
sa ozve zvuk. Pre
výpis použijeme pretypovanie ASCII hodnoty 7
na
znak:
Console.Write((char)7);
Pípnutie
Druhou jednoduchou možnosťou pre zadanie tónu je použitie
bezparametrické metódy Beep()
:
Console.Beep();
Pri zadaní tohto príkazu konzoly vykoná krátke pípnutie, ktoré má pevne nastavenú frekvenciu 800 Hz po dobu 200 milisekúnd.
Zahranie tónu zadanej frekvencie a doby trvania
Najzaujímavejšie možností pre zahranie tónov je použitie metódy
Beep()
s dvoma parametrami typu int
. Prvý parameter
udáva frekvenciu tónu, druhý parameter určuje dobu
trvania tónu v milisekundách, ktorý nesmie byť menší, alebo
rovný 0.
Pri použití tejto metódy môžeme naše aplikácie naučiť prehrávať jednoduché melódie. K tomu ale potrebujeme do kódu zadať frekvencie jednotlivých tónov, ktoré zodpovedajú tónom tónovej osnovy, resp. tónom v notovom zápise. Aby sme nemuseli každý tón zadávať ručne podľa tabuľkových hodnôt, je možné použiť algoritmus pre rovnomerné temperované ladenie. V tomto algoritme frekvencia medzi susednými poltóny tvoria geometrickú postupnosť a môžu sa ľahko spočítať.
Frekvenčné obmedzenia
Frekvencia prehrávaných tónov má svoje obmedzenia:
- softvérové možnosti. Metódou
Beep()
môžeme definovať tóny v rozsahu od 37 Hz do 32.767 Hz. - hardvérové možnosti. Kvalita zvukovej karty a použitého výstupného zariadenia. Na ňom závisí, v akom rozsahu frekvencií dokáže zvuk reprodukovať.
- možnosti ľudského sluchu. Nemá zmysel prehrávať frekvencie, ktoré človek nepočuje (samozrejme ak sa nebavíme o aplikáciách pre ultra a infra zvuk). Oblasť počuteľných tónov pre zdravého človeka sa všeobecne udáva od 20 Hz do 20.000 Hz.
Prienikom týchto troch oblastí obmedzenia sa dostávame k prakticky využiteľný pásme frekvencií, ktoré je však pomerne široké. Bežne sa v živote stretávame s frekvenčným pásmom oveľa užším, ktoré pokrýva zhruba rozsah šiestich oktáv od 60 Hz do 4.000 Hz a zahŕňa rozsah väčšiny hudobných nástrojov. Pre zaujímavosť uveďme, že ľudský hlas sa pohybuje približne od 90 Hz (bas) po 1.100 Hz (soprán).
Krátko z hudobnej teórie
Tónová stupnica je rozdelená na oktávy. Medzi oktáva platí jednoduchá matematická závislosť: Zdvojnásobíme chcete frekvenciu akéhokoľvek tónu, dostaneme ten istý tón, ale o oktávu vyššie.
Tóny každej oktávy majú dvojnásobnú frekvenciu oproti rovnakým tónom predchádzajúcej oktávy.
Základný tón
Pre naše programátorské potreby si zvoľme tón c veľké oktávy za základný tón. Tón c veľkej oktávy má frekvenciu 65,406 Hz. Pre nás to bude najnižšia tón, aký budeme používať. To je tón na spodnej hranici prakticky využiteľného frekvenčného pásma. Od tohto tónu budeme počítať všetky ostatné tóny. Mohli by sme si samozrejme zvoliť za základný tón akýkoľvek iný tón.
Oktávy
Každá oktáva je súborom 12 tónov, počnúc tónom c. V tabuľke si ukážme tóny c šiestich oktáv, ako idú za sebou. Týchto šesť oktáv pokrýva nami požadované bežné frekvenčné pásmo zhruba od 65 Hz do 4,200 Hz:
- V 1. stĺpci je oficiálny názov oktávy v hudobnej terminológii.
- V 2. stĺpci je označenie tónu c danej oktávy opäť v hudobnej terminológii.
- V 3. stĺpci je frekvencia tónu c.
- V 4. stĺpci je násobok príslušného tónu c oproti nami zvolenému "základnému tónu".
oktáva | Označenie tónu "c" | Frekvencia (Hz) | Násobok základného tónu |
---|---|---|---|
veľká | C | 65,406 | 2 0 = 1 (základný tón) |
malá | c | 130,81 | 2 1 = 2 |
Jednočárková | c 1 | 261,63 | 2 2 = 4 |
Dvojčárková | c 2 | 523,25 | 2 3 = 8 |
Tříčárková | c 3 | 1046,50 | 2 4 = 16 |
Čtyřčárková | c 4 | 2093,00 | 2 5 = 32 |
Tóny v oktáve
Dvanásť tónov v oktáve ide po rade za sebou takto, počnúc tónom c:
Označenie tónu v oktáve: | c | cis | d | dis | e | f | fis | g | gis | a | b | h |
---|---|---|---|---|---|---|---|---|---|---|---|---|
Poradie tónu v oktáve: | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
Frekvenčný vzdialenosť medzi tónmi
Pre jednotlivé tóny v oktáve platí, že ich frekvencia je rovná frekvencii tónu predchádzajúceho vynásobeného dvanástu odmocninou čísla 2. Dvanásta odmocnina z dvoch sa nazýva poltónovú krok a u rovnomerného temperovaného ladenia ide o konštantu rovnakú pre všetkých tóny. A pretože tónov v oktáve je 12, potom platí, že po dvanástich krokoch sa dostaneme na frekvencii prvého tónu nasledujúce oktávy, ktorá musí byť dvojnásobná oproti prvému tónu našej oktávy. Platí, že:
( 2 ^ 1/12 ) ^ 12 = 2
Zoberme teda frekvenciu tónu c a vynásobia ju dvanástu odmocnina čísla 2. Tak dostaneme nasledujúce tón cis:
cis = c × 2 ^ 1/12
Teraz vezmime vypočítaný tón cis a vynásobia ho dvanástou odmocninou čísla 2. Tak dostaneme nasledujúce tón d. Toto vykonáme aj pre iné tóny:
d = cis × 2 ^ 1/12
, dis = d × 2 ^ 1/12
,
e = dis × 2 ^ 1/12
, a tak ďalej ...
Tento postup môžeme zovšeobecniť tak, že platí:
Frekvencia hľadaného tónu = c × (2 ^ 1/12) ^ i.
kde i je poradie hľadaného tónu v oktáve, počnúc
c = 0
, cis = 1
, d = 2
,
dis = 3
, atď.
Praktická ukážka
Vypočítame frekvenciu tónov dvojčárkové oktávy:
- Definujeme si frekvenciu základného tónu. Zvolíme si
napríklad tón C veľké oktávy:
zakladniTon = 65,406
- Vypočítame prvý tón c 2 požadované dvojčárkové
oktávy. Vezmeme teda základný tón a podľa vyššie
uvedenej tabuľky s poradím oktáv ho vynásobíme koeficientom
2^3
:c2 = zakladniTon × 2 ˄ 3
- Vypočítame frekvenciu všetkých 12 tónov v oktáve a tón
c^3
nasledujúce oktávy tak, že v cykle, kdei = 0
až12
vypočítame:frekvenceTonu [ i ] = c2 × ( 2 ˄ 1/12 ) ˄ i
- Pre uloženie vypočítaných hodnôt použijeme kvôli jednoduchosti dve jednorozmerné polia. V jednom poli budú uložené názvy tónov. V druhom poli budú vypočítané frekvencie. Indexy prvkov oboch polí zodpovedajú poradí tónu v oktáve.
- Nakoniec každý tón vypíšeme a zahráme. Pre kontrolu
správnosti výpočtu si môžeme overiť, že frekvencia tónu
c^3
je dvojnásobná oprotic^2
.
double zakladniTon = 65.406; string[] nazevTonu = { "c2", "cis2", "d2", "dis2", "e2", "f2", "fis2", "g2", "gis2", "a2", "b2", "h2", "c3" }; int[] frekvenceTonu = new int[13]; double c2 = zakladniTon * Math.Pow(2, 3); for (int i = 0; i <= 12; i++) { frekvenceTonu[i] = (int)Math.Round(c2 * Math.Pow((Math.Pow(2, (1.0 / 12.0))), i)); Console.WriteLine("Tón {0,-4} o frekvenci {1,4} Hz", nazevTonu[i], frekvenceTonu[i]); Console.Beep(frekvenceTonu[i], 500); } Console.ReadKey();
Vypočítanú frekvenciu tónu sme zaokrúhlili, pretože
frekvenciu tónu v parametri príkazu Beep()
je nutné zadať ako
celé číslo.
Zobrazovaný výstup:
Konzolová aplikácia
Tón c2 o frekvenci 523 Hz
Tón cis2 o frekvenci 554 Hz
Tón d2 o frekvenci 587 Hz
Tón dis2 o frekvenci 622 Hz
Tón e2 o frekvenci 659 Hz
Tón f2 o frekvenci 698 Hz
Tón fis2 o frekvenci 740 Hz
Tón g2 o frekvenci 784 Hz
Tón gis2 o frekvenci 831 Hz
Tón a2 o frekvenci 880 Hz
Tón b2 o frekvenci 932 Hz
Tón h2 o frekvenci 988 Hz
Tón c3 o frekvenci 1046 Hz
Každý výpis tónu je tiež počuteľne prehraný.
V ďalšej lekcii, Textový výstup do okna konzoly a zložené formátovanie , si ukážeme, ako ovládať textový výstup
svojich aplikácií do okna konzoly pomocou metódy Write()
s
použitím zloženého formátovania.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 13x (147.63 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#