Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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
Presnosť frekvencie zvoleného základného tónu je tu uvedená na tri desatinné miesta, pretože základný tón berieme za základ pre výpočty. Vidíme, že frekvencia tónu c každej nasledujúcej oktávy je dvojnásobkom tónu c predchádzajúci oktávy. Frekvencia vypočítaných tónov je informatívne zaokrúhlená na dve desatinné miesta, čo je pre naše účely postačujúca.

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
Pre lepšiu predstavu o tónovej rade sa pozrime na obrázok nižšie. Jednu oktávu si môžeme predstaviť ako časť klaviatúry klavíra:
Konzoly C # .NET a jej možnosti

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:

  1. Definujeme si frekvenciu základného tónu. Zvolíme si napríklad tón C veľké oktávy: zakladniTon = 65,406
  2. 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
  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, kde i = 012 vypočítame: frekvenceTonu [ i ] = c2 × ( 2 ˄ 1/12 ) ˄ i
  4. 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.
  5. 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á oproti c^2.
Kód je nasledujúci:
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#

 

Predchádzajúci článok
Zadávanie vstupu z klávesnice
Všetky články v sekcii
Konzoly C # .NET a jej možnosti
Preskočiť článok
(neodporúčame)
Textový výstup do okna konzoly a zložené formátovanie
Článok pre vás napísal Luděk Novotný
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor je technik, má rád stručné a jasné texty, a tak se také snaží psát články pro vás.
Aktivity