Zenelejátszó
Első rész
Készíts programot, ami lejátszik a számítógép belső hangszóróján egy dallamot. A dallam egy stringben van, ami a programkód első sorában van definiálva. (Ezt később könnyű lehet továbbfejleszteni fájlból beolvasásra.) Tehát ehhez hasonlóan nézzen ki a program:
using System;
class Program
{
public static void Main(string[] args)
{
string music =
"C8C8G8G8" + "A8A8G4" + "F8F8E8E8" + "D8D8C4"+
"C8C8G8G8" + "A8A8G4" + "F8F8E8E8" + "D8D8C4"+
"G8G8F8F8" + "E8E8D4" + "G8G8F8F8" + "E8E8D4"+
"C8C8G8G8" + "A8A8G4" + "F8F8E8E8" + "D8D8C4";
}
}
És a string tartalma: az első, és aztán minden páratlanadik karakter egy nagybetű, és egy zenei hangot jelöl. A hangoknak eltérhet az időtartama, ezt a betű utáni szám jelöli. A 4 jelentése 1/4, a nyolcs jelentése 1/8. Egész ütemnek vehető például 2 másodperc.
Extrák
A program mindig írja ki az lejátszott hang betűjét.
Javasolt technikák
Hangok
A zenei hangoknak megfelelő frekvenciák |
Hang | Rendes név | Frekvencia (Hz, kerekítve)
|
C | | 262 |
#C, bD | Cisz, Desz | 277 |
D | | 294 |
#D, bE | Disz, Esz | 311 |
E | | 330 |
F | | 350 |
#F, bG | Fisz, Gesz | 370 |
G | | 392 |
#G, bA | Gisz, Asz | 415 |
A | | 440 |
#A, bH | Aisz, B | 466 |
H | | 494 |
Egy oktávval feljebb a frekvenciák duplázódnak, lejjebb pedig feleződnek.
|
Második rész
Az előbbi programmal bonyolultabb zenéket nem lehet lejátszani:
- nincsenek félhangok
- nem tud szünetet
- csak egy oktávot tud
- nem tud 1/N-től eltérő hosszúságú hangot kiadni. Például: 3/4-et. Ilyenekre pedig szükség lehet, pl.: pontozott kotta, összevonás v áthajlás v mi... (Ha egy 1/4-el és egy 1/2-el próbálkoznál egymás után, akkor maradna közöttük egy pici szünet)
Ezeken a következő "zeneformátummal" próbálunk segíteni. Legyen a hangok leírásának a hossza a stringben 4 karakter: eHxy.
- e: az előjegyzés, értéke lehet # (plusz félhang) vagy b (minusz félhang) vagy szóköz (eredeti hang)
- H: a hang. Ha nagybetű akkor olyan mint az előző részben, ha kisbetű, akkor egy oktávval lejjebb van, ha aláhúzás _, akkor pedig szünet.
- x: az ütem, a feladat első részéhez hasonlóan
- y: ütem-hosszabbítás, ha értéke 0 akkor nincs hatása, ha 1 és 9 közötti, akkor az általa jelzett ütemmel meghosszabbodik a hang, vagyis $N\cdot\left(\frac{1}{x}+\frac{1}{y}\right)$ lesz a hossza.
Vagy például a #C48 egy C plusz fél, azaz Cisz hang lesz, 1/4+1/8 = 3/8 ütem hosszúságban.
Vagy például a #_42 egy szünet lesz, 1/4+1/2 = 3/4 ütem hosszúságban.
Vagy például a hull-a-pelyhes így fog kinézni:
string music =
" C80 C80 G80 G80" + " A80 A80 G40" + " F80 F80 E80 E80" + " D80 D80 C40"+
" C80 C80 G80 G80" + " A80 A80 G40" + " F80 F80 E80 E80" + " D80 D80 C40"+
" G80 G80 F80 F80" + " E80 E80 D40" + " G80 G80 F80 F80" + " E80 E80 D40"+
" C80 C80 G80 G80" + " A80 A80 G40" + " F80 F80 E80 E80" + " D80 D80 C40";
Örömóda
string music =
" h40 h40 C40 D40" + " D40 C40 h40 a40" + " g40 g40 a40 h40" + " h48 a80 a20" +
" h40 h40 C40 D40" + " D40 C40 h40 a40" + " g40 g40 a40 h40" + " a48 g80 g20" +
" a40 a40 h40 g40" + " a40 h80 C80 h40 g40" + " a40 h80 C80 h40 a40" + " g40 a40 d40" +
" h20" +
" h40 C40 D40" + " D40 C40 h40 a40" + " g40 g40 a40 h40" + " a48 g80 g20";
Funkytown
string music =
" C80 C80bh80 C40 g40 g80" +
" C80 F80 E80 C84 _40"+
" C80 C80bh80 C40 g40 g80" +
" C80 F80 E80 C84 _40";
Javasolt további technikák
Extrák / házi feladat
1. Lejátszás előtt kérje be a program a lejátszás sebességét (egy egész ütem hosszát) és az alapoktáv számát. (0: a táblázatban szereplő, pozitív szám efölötti, negatív szám pedig ezalatti oktávot jelöl.
2. A zene stringjét egy fájl első sorából olvassa be a program, a fájl nevét pedig a billentyűzetről kérje be. Így lehet egy fájlból egy sort olvasni:
StreamReader sr;
string filename = "c:\\music.txt";
string music;
sr = File.OpenText(filename);
music = sr.ReadLine();
sr.Close();
És a program elejére, a using System után még kell egy using System.IO:
using System;
using System.IO;
3. A sebesség és az alapoktáv száma a fájl második és harmadik soraiban legyen.