Informatika gyűjtemény

Egy szinttel feljebb ZeneLejátszó

2004050607080910

NézetNyomtat

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";
        //ne feledd
        //hogy ez egy közönséges string, csak az olvashatóság
        //érdekében van több darabból összefűzve

        //és ide jön a lejátszóprogram
    }
}
É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
HangRendes névFrekvencia (Hz, kerekítve)
C262
#C, bDCisz, Desz277
D294
#D, bEDisz, Esz311
E330
F350
#F, bGFisz, Gesz370
G392
#G, bAGisz, Asz415
A440
#A, bHAisz, B466
H494
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.