Hangok a Mathematica-ban

Takács Viola
ECADOW
Matematikus szak, II. évfolyam

1. Bevezetés

Ennek a dolgozatnak a témája a hangok, a zene egy matematikai programban - a hogyan, mit, mennyit, miért kérdésekre keresem a választ. A hang definíciója, megadása, fajtái után a Mathematica 5.0 program megfelelő függvényeit mutatom be.

Needs["Miscellaneous`Music`"]
Needs["Miscellaneous`Audio`"]

2. Mi a hang?

2.1 Hang

A hang a fül, a hallás által érzékelt inger. Az emberi beszéd, a zene, a zenei hangrendszerek alapeleme. Fizikai jellegét tekintve valamely rugalmas közeg mechanikai rezgése, e rezgés hullámként való tovaterjedése. 
Ha e rezgés frekvenciája kb. 20 Hz alatti, vagy kb. 20 kHz fölötti, akkor hallásunk nem érzékeli azt, első esetben infrahangról, a másodikban ultrahangról van szó.
A hangot mint fizikai jelenséget az akusztika, a beszédhangokat a fonetika, a zenei hangokat a zenetudomány tanulmányozza.

2.2 A hang fizikai jellemzői

Frekvencia

A frekvencia szó szerint egy ,,ismétlődés gyakoriságát” jelenti, azaz azt, hogy egy esemény hányszor ismétlődik meg egységnyi idő alatt. Mértékegysége a hertz (Hz): 1 Hz azt jelenti, másodpercenként egyszer következik be az esemény. 
Érdekességek: A normál zenei A hang szokásos definíciója 440 Hz (,,concert pitch”), amire egy zenekar hangol. Egy csecsemő kb. 20 000 Hz-ig képes hallani a hangokat, de a korral ez a felső határ csökken .

Amplitúdó

A rezgés csúcsértékét nevezzük amplitúdónak.

2.3 Rezgés, hanghullámok

Rezgésnek azt a folyamatot nevezzük, melynek állapotai időközönként ismétlődnek.
	•	periodikus rezgésről beszélünk, ha ezek az időközök egyenlőek, 
	•	nemperiodikus rezgésről egyébként. 
	
	Minden periodikus vagy nemperiodikus rezgés előállítható különböző frekvenciájú és amplitúdójú harmonikus rezgések összetevésével. Hangrezgések esetén ezeket az összetevőket részhangoknak nevezzük. Ezen a szemléleten alapul a hangelemzés, melynek matematikai alapja a Fourier-analízis. Ennek azért is van jelentősége, mert a hallásunk hasonlóképpen, hangelemzés útján különbözteti meg a hangokat, hangszíneket, és nem a hangrezgés időbeli lefolyása alapján. Például két rezgés összege fáziseltolódásuktól függően más-más rezgésformát mutathat, fülünk ennek ellenére mindig ugyanolyan hangot hall.
	Egy hang tehát nemcsak a rezgő közeg időbeli mozgásával írható le, de részhangjainak spektrumaként is ábrázolható, ha megadjuk, hogy különböző frekvenciahelyeken milyen intenzitású részhangokból tevődik össze.
	Vonalas, tehát különálló, diszkrét részhangokból álló spektrum esetén egy meghatározható hangmagasságú hangot hallunk, vagy több ilyen hangot együtt. A periodikus rezgések spektruma vonalas, ráadásul ebben az esetben a részhangok frekvenciái mindig egy alapfrekvencia többszörösei. Az ilyen tulajdonságú részhangok sorozatát nevezzük felhangsornak, az alapfrekvenciát pedig alaphangnak. Ez az alapfrekvencia határozza meg ilyen esetben a hang általunk érzékelt hangmagasságát. A dallamhangszerek "zenei” hangjai, a beszédhangok zöngéi ilyen típusú spektrumon alapulnak. 
	Folytonos a spektrum, ha a különböző frekvenciájú összetevők folytonosan helyezkednek el egymás mellett. A nemperiodikus rezgések mutatnak ilyen képet. Az így létrejövő hangot zörejszerűnek halljuk, ennek extrém esete a fehérzaj, mikor minden frekvencia megtalálható a spektrumban, ráadásul egyenlő intenzitással. A legtöbb ritmushangszer hangja, a beszédhangok közül a mássalhangzók egy része tartozik ebbe a csoportba. 
Meg kell említeni a rezgésnek egy határesetét is, amikor szigorú értelemben nincs is szó rezgésről, csak egyszeri hirtelen állapotváltozásról, mechanikai lökésről. Az ilyen folyamatot átmeneti, tranziens folyamatnak nevezzük. A fülünk ezt kattanásként, csattanásként, durranásként stb. érzékeli. Az ilyen folyamat folytonos spektrummal ábrázolható.

Hullámfajták:

Longitudinális hullámról beszélünk akkor, ha a részecskék rezgésének iránya azonos a hullám terjedésének irányával. Gázokban és folyadékokban csakis ilyen hullámok jöhetnek létre. Ezekben az esetekben a közeg térfogati rugalmassága kap szerepet, vagyis az adott anyag részecskéinek elmozdulásával összhangban annak sűrűsödése-ritkulása terjed tovább. Ha a közeg kellően tágas méretű, a hangforrás pedig pontszerű, akkor ezek a hullámok gömbhullámok, azaz az azonos rezgésállapotban lévő részecskék a hangforrás mint középpont körüli koncentrikus gömbök felületén helyezkednek el. Ebben az esetben a rezgési energia a hangforrástól távolodva egyre nagyobb felületen oszlik el, tehát a rezgés amplitúdója, intenzitása a távolság négyzetével csökken. A hang terjedésének legjellemzőbb esete, a levegőben terjedő hang, a léghang ilyen jellegű. 
	Transzverzális hullám esetén a részecskék rezgési iránya merőleges a hullámterjedés irányára, mechanikai hullám esetén ez csak szilárd halmazállapotú anyagban lehetséges. A kifeszített húron létrejövő hullámok is ilyenek. 
	Hajlítási hullámok hosszúkás vagy lapos formájú szilárd testekben keletkeznek, itt az anyag alaki rugalmassága kap szerepet, egy geometriai deformáció terjed hullámszerűen. Az idiofon hangszerek, illetve a húros hangszerek testén keletkeznek ilyen hullámok, az utóbbi esetben ezek segítségével tud például a húrok rezgése léghang formájában a térben szétterjedni. 
	Léteznek még nyúlási és torziós hullámok is, ezek hangtani szempontból kevésbé fontosak.

3. Hangok és a  Mathematica

3. 1. Reprezentáció

Play

A fenti függvény olyan hangot játszik le, melynek amplitúdóját adjuk meg az idő függvényeként, és ennek időtartamát. Íme a zenei C hang a Mathematica segítségével:

Play[Sin[220  2  π  t], {t, 0, 3}]

A következő függvényt úgy adjuk meg, hogy az intervallum egy pontjában a függvény nincs értelmezve - szingularitása van.

Play[Sin[(10/t)], {t, -2, 2}];

Play[Sin[(10/t)], {t, -2, 2}];

Play[Sin[(100/t)], {t, -2, 2}]

Play[Sin[(1000/t)], {t, -2, 2}]

Bővíthető a Play függvény további beállításokkal. Ilyen például a PlayRange is: megadja az amplitudó terjedelmét. A SampleRate minden platformon más értéket ad meg.

Options[Play, SampleRate]

Play[Sin[8192  2  π  t], {t, 0, 1}]

Play[Sin[(2^t)], {t, 8, 13}, PlayRange -> {0, 1}]

Sztereó hangokat is létrehozhatunk vele:

Play[{Sin[440 π t], Sin[660 π t]}, {t, 0, 3}]

Egy kevésbé kellemes, de hatásos:

Play[{Sin[(2^t)], Sin[(3^t)]}, {t, 7, 12}, 
      PlayRange -> {0, 1}]

ListPlay

A ListPlay függvényt így hívhatjuk meg: 
	ListPlay[{(Subscript[a, 1,]) 
            (Subscript[a, 2,  ... ])}]- formátumú hívás esetén olyan hangokat játszik le, melyeknek amplitúdóit adjuk meg a függvény hasában listával.

Először létrehozunk egy függvényt (amp), amely egy listát generál: legyenek ennek az elemei az 1/13 tört első n tizedesjegye.
Mivel a racionalis szamoknak vannak ismetlodo tizedesjegyei, igy ezek periodusait lejatszhatjuk a ListPlay segitsegevel.

ClearAll[t, p, lista, x, n, amp]
amp[n_] := First[RealDigits[N[(1/13), n]]]

ListPlay[amp[10000]]

3. 2. Miscellaneous csomag

Music

A Miscellaneous`Music` az egyik alapcsomag a Mathematicaban. Többek között segít abban, hogy át tudjunk váltani cent és hertz között, és létrehozhatunk komolyabb zenei példákat is.

Elsőként a Scale függvényt nézzük - a Show paranccsal hallgathatjuk meg. "Munkáját" elősegítendő használom a JustMajor-t is: ez egy hangközlista, mégpedig a dúr hangsoré.

JustMajor

Show[Scale[JustMajor, 220, 5]]

A JustMinor is egy hangközlista, ez adja a moll hangsort..

JustMinor

A következő egy olyan moll skálát játszik le,ami 220Hz-en kezdődik és 5 másodpercig tart.

Show[Scale[JustMinor, 220, 5]]

Az intervallumok listájának elemei nem kell, hogy növekvő vagy csökkenő sorrendben jöjjenek egymás után. Íme egy példa: 440Hz-en kezdődik, és 3 másodpercig tart minden hang.

Show[Scale[{0, 220, 110, 440}, 440, 3]]

További intervallumokat is használhatunk:

PythagoreanChromatic
Show[Scale[PythagoreanChromatic, 330, 5]]

SixthTone
Show[Scale[SixthTone, 330, 3]]

MeanMajor
Show[Scale[MeanMajor, 440, 5]]

Show[
      Scale[JustMinor[[{2, 4, 6, 8, 6, 4, 2}]], Aflat3, 3]]

A cent az exponenciális tulajdonságú frekvenciaviszonyok illetve zenei intervallumok logaritmikus skálában való lineáris kezelését lehetővé tévő mértékegység, melyet elsősorban a különféle temperálások és a bennük megalkotható hangközök összevetésére használnak. Az oktáv 1200 centből áll, a kiegyenlített hangolásban pedig 100 cent ad ki egy temperált félhangot (innen származik a mértékegység neve).

A HertzToCents és a CentsToHertz függvények az egyik mértékegység listáját konvertálják a másik mértékegység listájába. A következő sorban a lista elemei Hertzben értendőek: ezek közötti távolságot kapjuk vissza centben.

HertzToCents[{330, 440, 880}]

CentsToHertz[{498.0449, 1200. }]

Audio

Ezzel az alapcsomaggal létrehozhatunk standard hullámformákat, és többek között van egy függvénye, mellyel beolvashatunk hangfájlokat a Mathematicába. Először a Waveform paranccsal ismerkedjünk meg. A megadott típus és frekvencia szerint generál hangot:

sq := {{0, 0}, {1, 0}, {1, 1}, {2, 1}, {2, 0}, {3, 
          0}}
ListPlot[sq, PlotJoined -> True, AxesLabel -> None, 
        Frame -> True, 
        Ticks -> Automatic];
Show[Waveform[Square, 440, 0.6]]

saw := {{0, 0}, {1, 1}, {2, 0}, {3, 1}, {4, 
          0}}
ListPlot[saw, PlotJoined -> True, AxesLabel -> None, 
        Frame -> True, 
        Ticks -> Automatic];
Show[Waveform[Sawtooth, 440, 0.6]]

tr := {{1, 1}, {2, 1}, {1.5, 1 + Sqrt[3]*1/2}, {1, 
          1}}
ListPlot[tr, PlotJoined -> True, AxesLabel -> None, 
        Frame -> True, 
        Ticks -> Automatic];
Show[Waveform[Triangle, 440, 0.6]]

Plot[Sin[x], {x, 0, 2*π}]
Show[Waveform[Sinusoid, 440, 0.6]]

A Waveform-nak is létezik olyan megfelelője, melyet listákkal hívhatunk, ez a ListWaveform. Alkalmas például akkordok megszólaltatására. A majorChord egy dúr akkor hangjainak listája.

majorChord = {{1, 1}, {1.26, 1}, {1.5, 1}}

A következő tehát visszaadja az akkordunkat 493.88 kezdő Hertzen.

Show[ListWaveform[majorChord, 493.88, 1]]

Az AmplitudeModulation függvény olyan hangot hoz létre, melynek hordozó és meghatározó frekvenciája van ((Subscript[f, c]) és (Subscript[f, m])), hangnemváltozási indexe (mi) és a megadott másodpercig tart.

Show[AmplitudeModulation[220, 3, 2, 2]]

(Subscript[f, m])-et változtatva:

Show[AmplitudeModulation[220, 6, 2, 2]]

Kibővíthetjük a RingModulation-nel is ezt a függvényt. Így tartalmazza az output a frekvenciák összegét és különbségét is.

Show[
      AmplitudeModulation[440, 100, 1, 1, 
        RingModulation -> True]]

Show[
      AmplitudeModulation[220, 500, 2, 1, 
        RingModulation -> True]]

A frekvencia modulálása olyan technika, amit egyetemeken, munkaállomásokon, és az otthoni szintetizátorokon is használnak. Mindenütt elterjedt technika ez, hiszen egyszerű matematikai háttere van. A frekvencia változtatását a következő képlet adja meg: sin(2π(Subscript[f, c])t" "+" "((p  d)/(Subscript[f, m])) sin(2π(Subscript[f, m])t)) , ahol pd a maximális eltérést jelenti Hz-ben.

Show[FrequencyModulation[440, {10, 50}, 2]]

Show[FrequencyModulation[440, {10, 200}, 2]]

Ezzel a csomaggal lehetőségünk nyílik zenék beolvasására cd lemezről is. A ReadSoundFile["cím"] beolvas egy zeneszámot, és a minta számsorát alakítja -32768 és 32767 közti egészek listájába. Ez a függvény a számot közvetlenül a Mathematicába  olvassa be, de ha sztereo, akkor listák listáját kapjuk vissza, melyet a ListPlay függvénnyel játszhatunk le. Ezt a függvényt itt nem áll módomban bemutatni, hiszen technikai akadályai vannak, de érdemes kipróbálni:
zene=ReadSoundFile["zene.wav", PrintHeader->True]
ListPlay[zene]

zene = 
      ReadSoundFile["zene.wav", PrintHeader -> True]
ListPlay[zene]

3. 3. Exportálás és importálás

Export

Majd ha a fejlesztők tökéletesítik a hangokat a Mathematicaban, akkor érdemes lesz majd exportálni a zenéinket - de alapvetően nem ez a célja a programnak. Mégis tudunk hangokat exportálni fájlba, mégpedig aiff, au, snd és wav formátumba. Export["név.kit", kif] alakban fut le a függvény. Például:

zene = 
      Play[{Sin[440 π t], Sin[660 π t]}, {t, 0, 3}]

Export["zene.wav", zene]

Így létrehoztunk egy zene.wav fájlt, mely éppen a fenti függvényt adja vissza. Elérési helye a program mappájában van, amelyet a program telepítésekor hoztunk létre. Az exportált fájl lejátszható bármilyen zenelejátszó szoftverel, amely felismeri esetünkben a wav kiterjesztést.

Import

Az importálás is érdekes dolog a programban. Hangokat tudunk importálni is, ha megfelelő a formátumuk,természetesen. Hasonlóképpen mint az exportálásnál itt is az aiff, snd, au és wav fájlokat ismeri fel a program, persze csak akkor, ha jó helyen vannak. Technikai okok miatt itt sem tudok példát mutatni sajnos, de mindenképpen érdemes kipróbálni. Például azt a fájlt,amit az előbb exportáltunk, most importálhatjuk.

music := Import["zene.wav"]

Show[music]

3.4. ,,Beépített szépségek''

Végezetül néhány zene, ami beépítve megtalálható a program Helpjében, és érdemes arra, hogy megjegyezzük:

Play[
        Sin[20 t] Sin[23 t] Sin[2000 t],  {t,  0,  
          2.05}];

ϕ[{α_, β_}, 𝒜_,  f_] := 
      If[α < t < β,  𝒜 Sin[f t],  
        0]
Play[
      Evaluate[N[
          Sin[((π t)/2)] (∑_(i = 1)^36) ϕ[{(i/18), ((36 - i)/18)}, ((((Sqrt[(((((i - 36)/13)))^2)])))^2), 1000 (i + Sin[i])]]], {t, 
        0, 2}]

ψ[{α_, β_}, 𝒜_, f_] := 
      If[β > α, 
        If[α < t < β, 
          Sin[((π (t - α))/(β - α))] 𝒜 Sin[f t], 0], 0]
Play[
      Evaluate[N[
          Sin[((π t)/2)] (∑_(i = 0)^24) ψ[{(i/12), ((i + 4)/12)}, (Sqrt[(((((i - 24)/12)))^2)]), 1000 (i - 12)]]], {t, 0, 2}, 
      PlayRange -> All]

ϕ[{α_, β_}, 𝒜_,  f_] := 
      If[α < t < β,  𝒜 Sin[f t],  
        0]
SeedRandom[18934934]; 
    Play[Evaluate[
        Sin[((π t)/2)] (∑_(i = 1)^36) ϕ[
              With[{s = Random[Real, {0, 2}]}, {s, Random[Real, {s, 2}]}], 
              Random[], ((1000  i)/3) Random[]]], {t, 0, 2}, 
      PlayRange -> All]

És a kedvencem, a Riemann-féle Zeta-függvény implementációja:

Play[RiemannSiegelZ[2000 t],  {t,  0,  3}, 
      PlayRange  ->  {-20, 20}]

Természetesen kihagyhatatlan a telefon billentyűhangja, az egyik hazai nagy mobilszolgáltató régi szlogenjével:

TouchToneArray = 
      Flatten[Outer[List, {697, 770, 852, 941}, {1209, 1336, 1477}], 
        1]

TouchToneFunction[n_,  
        t_]  :=  (Sin[2 π #1 t] + 
              Sin[2 π #2 t]) &  @@  
        TouchToneArray[[n]]

PlayTouchTone[phonenumber_List]  := 
      Play[Evaluate[
          Plus  @@  MapIndexed[
              If[First[#2]/5  -  0.2  <  t  <  First[#2]/5  - 0.1,  
                  Evaluate[TouchToneFunction[#1,  t]],  0] &,  
              phonenumber /. (0  ->  11)],  {t,  0,  
            Length[phonenumber]/5}]]

PlayTouchTone[{2, 1, 2, 1, 2, 2, 3, 1, 2}]

4. Összegzés

A program bővítésével a lehetőségek is bővülnek: jó lenne például többféle formátumú zenék exportálása és importálása, esetleg mp3-aké is. Mindenesetre az egyszerű zenei szólamok, a moll és a dúr hangsor, nevezetes hangtávok megérthetőek a Mathematica segítségével, és használhatóak. 	
	A fentiek alapján egy kis betekintést nyerhettünk a Mathematica program zenei világába. Természetesen sok minden van, amiről nem esett szó, a lényeg mindenképpen itt van. Remélem, hogy ezzel a füzettel sikerül elérni azt, hogy próbálkozzanak meg az esetleges olvasók hangok létrehozásával a programban, esetleg azok exportálásával is. Így, bármilyen primtív szinten, de mindenki zeneszerző lehet.

Irodalomjegyzék

Tarnóczy Tamás: Zenei Akusztika, Zeneműkiadó (1982) (általános ötletmerítés)
Mathematica 5.0 - Help - The Mathematica Book
	1.3.4.
	1.9.12.
	2.1.4.
	2.10.18.
	2.10.19.
	2.10.20.
Wikipedia
	http: // hu . wikipedia . org/wiki/D  %  
              C3  %  BAr_sk  %  C3  %  A1la
	http://hu.wikipedia.org/wiki/Cent_%28zene%29
	http://hu.wikipedia.org/wiki/Hull%C3%A1m