BABE S¸ -B OLYAI U NIVERSITY C LUJ –NAPOCA FACULTY OF M ATHEMATICS AND I NFORMATICS S PECIALIZATION : C OMPUTER S CIENCE Diploma Thesis
Musical information processing Abstract
There will be a lot of citation from this book [Zölzer, 2008] This work is the result of my own activity. I have neither given nor received unauthorized assistance on this work.
2011 J UNE
A LBERT C SANÁD - I STVÁN
A DVISOR : T EACHING ASSISTANT B ODÓ Z ALÁN -P ÉTER , P H D.
U NIVERSITATEA BABE S¸ -B OLYAI , C LUJ –NAPOCA FACULTATEA DE M ATEMATICÃ SI ¸ I NFORMATICÃ S PECIALIZAREA I NFORMATICÃ
Lucrare de diploma˘
Procesarea informat¸iei muzicale
˘ C ONDUC ATOR STIIN ¸ TIFIC ¸ :
A BSOLVENT:
A SISTENT UNIVERSITAR DR , B ODÓ Z ALÁN P ÉTER .
I UNIE 2011
A LBERT C SANÁD - I STVÁN
BABE S¸ -B OLYAI T UDOMÁNYEGYETEM KOLOZSVÁR M ATEMATIKA ÉS I NFORMATIKA K AR I NFORMATIKA S ZAK
Diplomadolgozat
´ o´ feldolgozasa ´ Zenei informaci
T ÉMAVEZET O˝ : DR . B ODÓ Z ALÁN TANÁRSEGÉD .
S ZERZ O˝ : - P ÉTER , E GYETEMI
2011 J ÚNIUS
A LBERT C SANÁD - I STVÁN
Tartalomjegyzék 1. Digit´alis jelfeldolgoz´as . . . . . . . . .
3 3 3 3 4 4 5 6 6 7
2.1. Alkalmazási terület, célközönség . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2. Motiváció . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8 8 8
1.1. DSP . . . . . . . . . . . . . 1.1.1. Jel . . . . . . . . . . 1.1.2. Jelfeldolgozás . . . . 1.2. Analóg-Digitális konvertálás 1.2.1. Mintavételezés . . . 1.2.2. Kvantálás . . . . . . 1.2.3. Kódolás . . . . . . . 1.3. Digitális hangfeldolgozás . . 1.4. Fast Fourier transzformáció .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
2. Alkalmaz´asi terulet ¨
´ ak, API-k 3. Technologi´ 3.1. A JavaTM Sound API . . . . . . . 3.1.1. javax.sound.sampled . . . 3.1.2. javax.sound.midi . . . . . 3.2. Fast fourier Transzformáció (FFT)
10 . . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
10 10 11 12
4.1. Célok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13 13
4. Dokument´acio´ am´ıg jobb c´ım nem jut az eszembe....
2
1. fejezet
´ ´ Digitalis jelfeldolgozas Összefoglaló: Ebben a fejezetben általánosságban fogjuk tárgyalni a digitális jelfeldolgozást, az analóg jelnek digitálissá való átalakítását, a digitális hangfeldolgozást és a fast Fourier transzformációt.
1.1. DSP A digitális jelfeldolgozás már az 1960-as években elkezdett rohamosan fejl˝odni, majd a processzoroknak a gyors fejl˝odése tette lehet˝ové, hogy a digitális jelfeldolgozásra kifejlesztett algoritmusok igazán használhatóak legyenek.[Hayes, 1999] A digitális jelfeldolgozásnak az egyik f˝o célja az analóg jelnek a digitális formában való tárolása, értelmezése és feldogozása.
1.1.1. Jel A jel [Proakis és Manolakis, 1995] az id˝o, tér vagy más független változónak a függvényében változó fizikai mennyiség. Ezeket a jeleket le lehet írni pontosan függvények segítségével (pl.: f (t) = t2 ), bár általában ez nem lehetséges, mert vagy nem ismerünk függvényt, ami leírná, vagy ha ismerünk, akkor túl komplikált, hogy használható legyen valamire. Például a beszédet nem lehet leírni egyszer˝u függvények segítségével, de le lehet írni különböz˝o (frekvenciájú, amplitúdójú) szinuszoid függvények összegeként.
1.1.2. Jelfeldolgozás A jeleket fel tudjuk dolgozni analóg úton: sz˝urhetjük, megnövelhetjük a frekvenciáját és az amplitúdóját. Ugyanezeket a m˝uveleteket, más komplexebb m˝uveleteket és olyan m˝uveleteket is elvégezhetünk digitálisan, amikre nem érdemes áramkört tervezni, illetve gyártani, ehhez a jelet át kell alakítani digitálissá, majd általában vissza analóggá, ezeket analog-to-digital konverterrel (ADC) illetve digital-to-analog konverterrel (DAC) valósítják meg [Proakis és Manolakis, 1995]. A digitális jelfeldolgozásnak rengeteg el˝onye van az analóg jelfeldolgozással szemben, ezek közül talán a legfontosabb, hogy sokkal összetettebb m˝uveleteket lehet végezni a jelen. Egy másik fontos el˝onye, hogy sokkal költséghatékonyabb, ha egy analóg jelfeldolgozót más célra szeretnénk átalakítani, akkor általában az egész áramkört újra kell tervezni és építeni, míg a digitálisnál csak a szoftvert kell kicserélni. Egy másik nagy el˝onye, hogy míg az analóg feldogozás során a jelnek a pontosságát nagyon nehéz meg˝orizni, szinte lehetetlen, addig a digitális jelfeldolgozásnál, miután megtörtént a digitális jellé való átalakítás, gyakorlatilag nem veszít a jel a pontosságából. 3
1. FEJEZET: D IGITÁLIS JELFELDOLGOZÁS A digitális jelfeldolgozásnak megvannak a hátrányai is az analóggal szemben: ha egy nagyon egyszer˝u m˝uveletet akarunk végezni a jelen, akkor sokkal drágább a digitális megoldás, mint az analóg. Ha olyan jeleket szeretnénk feldolgozni, amelyeknek nagyon magas a frekvenciájuk, vagy nagyon nagy a sávszélességük, akkor olyan ADC-re van szükségünk, amelynek nagyon magas a mintavételezési frekvenciája, ami nagyon költséges, de egy bizonyos szint fölött már lehetetlen megfelel˝o konvertert készíteni, ilyenkor maradnak az analóg megoldások.
1.2. Analóg-Digitális konvertálás A digitális jelfeldolgozás egyik kulcsfontosságú része az analóg adatok digitálissá való alakítása, mivel a digitális jelek nagy részét analóg jelekb˝ol nyerjük (hang, rádió, videó), nagyon kevés kivétellel, ilyen például a valutaárfolyam. Ezt általában analog-to-digital konverterekkel (ADC) szoktuk elérni. A ma használatban lev˝o asztali számítógépek többsége rendelkezik legalább egy ilyen konverterrel, mégpedig a hangkártyán található mikrofonbemenettel, ami a hangot alakítja át digitális jellé. Az átalakítás folyamata három f˝o részb˝ol áll: a mintavételezésb˝ol, a kvantálásból és a kódolásból.
1.2.1. Mintavételezés A mintavételezés folyamán megmérjük a bemen˝o folytonos jelet. Ha xa (t) a bemen˝o jel, akkor xa (nT ) ≡ x(n), ahol T a mintavételezési id˝o [Proakis és Manolakis, 1995]. A mintavételezés mikéntjére rengeteg megoldás ismeretes, ezekb˝ol a legelterjedtebb az egyenl˝o id˝oközönként való mintavételezés (periodikus), aminek a lényege, hogy T id˝oközönként veszi a mintát, ahogy ez a 1.1 ábrán is látszik. A T -t mintavételi
.
1.1. ábra. Analóg jelnek periodikus mintavételezése [Proakis és Manolakis, 1995] 4
1. FEJEZET: D IGITÁLIS JELFELDOLGOZÁS id˝onek nevezzük és ennek a fordítottját ( 1/T = Fs ) mintavételi frekvenciának nevezzük, az angol nyelv˝u szakirodalomban sampling rate vagy sampling frequency néven ismert. Ennek a mintavételi frekvenciának a helyes kiválasztására érdemes odafigyelni, különben el˝ofordulhat a 1.2 ábrán megfigyelhet˝o aliasing jelenség, ahol túl kicsinek van megválasztva a mintavételezési frekvencia (1Hz), és így a 7/8Hz-es jelb˝ol 1/8Hz-es jel fog látszani a digitalizálás után. Ha ugyanezt a 7/8Hz-es jelet 7/8Hz-es mintavételezési frekvenciával próbálnánk digitalizálni, akkor egy nulla amplitúdójú jelet kapnánk, ami bizonyos esetekben még rosszabb, mint az el˝oz˝o esetben kapott 1/8Hz-es jel.
1.2. ábra. Aliasing Ennek a jelenségnek az elkerülésére az általános megoldás, hogy minimum kétszer akkorára választjuk meg a mintavételezési frekvenciát, mint a digitalizálni kívánt analóg jelnek a maximális frekvenciája. Tehát ha az analóg jelünk 30Hz és 50Hz között mozog, akkor másodpercenként minimum 100 alkalommal kell mintát vegyünk a jelb˝ol, hogy ugyanazt a frekvenciájú jelet tudjuk majd visszanyerni, ami volt.
1.2.2. Kvantálás A kvantálás folyamán a folytonos értékkészletet diszkrétté alakítjuk, minden mintának egy értéket feleltetünk meg egy véges értékkészletb˝ol. xq (n) = Q[x(n)] A kvantálási folyamat során felosztjuk a bejöv˝o x(n) analóg jelnek az amplitúdóját L intervallumra. Ha egy x(n) érték beleesik egy ilyen [x(k), x(k + 1)] intervallumba, akkor egy xq (k) értéket rendelünk hozzá ebb˝ol az intervallumból.
5
1. FEJEZET: D IGITÁLIS JELFELDOLGOZÁS
1.3. ábra. Kvantálás .
[Hayes, 1999] A véges értékkészletb˝ol kifolyólag a még nem kvantált érték és a kvantált érték kis eltérést fog
mutatni, ezt kvantálási hibának, kvantálási zajnak nevezzük. eq (n) = xq (n) − x(n) Gyakorlatban ezt a hibát minimálisra, elhanyagolható szintre le lehet csökkenteni, de ennek ellenére az átalakítással mindig fog elveszt˝odni információ, mert mindig lesz két (vagy sokszor több száz) analóg érték, amihez a kvantáló ugyanazt a kvantált értéket fogja rendelni, emiatt a kvantálás vissza nem fordítható folyamat, a kvantált jelb˝ol csak egy bizonyos pontossággal lehet visszaállítani az eredetit.
1.2.3. Kódolás A kódolás folyamán minden kvantálási szinthez egy egyedi bináris számot rendelünk. Ha L intervallumra osztottuk fel az analóg jel amplitúdóját a kvantálási folyamatban, akkor b ≥ log2 L bites szóhosszúságú számokra lesz szükség a kódoláshoz.
1.3. Digitális hangfeldolgozás A digitális jelfeldolgozás egy nagyon ágas-bogas tudományággá n˝otte ki magát, rengeteg területen alkalmazható, ezek közül az egyik terület a hangfeldolgozás. A hangfeldolgozás a digitális jelfeldolgozás azon területe, amellyel majdnem minden ember találkozott már, hiszen ott van a számítógépeinkben, a mobiltelefonjainkban és az mp3-lejátszóinkban. Egy zenefájlnak a stúdiótól, addig a pontig, amíg mi halljuk, rengeteg feldolgozáson megy keresztül. Az els˝o lépés a stúdióban a felvétel, ahol a hangot mikrofonok segítségével analóg elektronikus jellé alakítják, majd ezt ADC segítségével digitalizálják, ezzel a digitalizált jellel a stúdióban gyakorlatilag bármit el tudnak végezni, hogy élvezhet˝obb, tetszet˝osebb legyen: visszhang hozzáadása, zajsz˝urés, több külön felvett sáv összekeverése stb. Majd miután a üzletekb˝ol a számítógépünkbe vagy lejátszónkba kerül, megint egy sor digitális jelfeldolgozáson megy keresztül, miel˝ott megint analóg, számunkra hallható hang lesz bel˝ole: gondoljunk itt arra, amikor a kedvenc zenelejátszónknak a hangszínszabályzójában (equalizer) felhúzzuk a basszust, ami tulajdonképpen a 40Hz körüli frekvenciák amplitúdóját növeli meg, vagy az mp3-lejátszónkon beállítjuk
6
1. FEJEZET: D IGITÁLIS JELFELDOLGOZÁS a zenestílust, amit hallgatunk, és máris sokkal élvezhet˝obb lesz a zene. A fizikai hangmagasságnak nincsenek korlátai, azonban az emberi hallásnak vannak (16−25000Hz), és ennek a tartománynak is a fels˝o határa már fülsért˝o, fájdalmat okoz az ember számára [Kesztler, 2000]. Ezért a digitális hangfeldolgozásban a vizsgált frekvenciatartomány lényegesen lesz˝ukül, így viszonylag olcsó berendezésekkel már el˝oállíthatjuk az analóg jelb˝ol a pontos digitális jelet. Ha tovább szeretnénk a berendezésen spórolni, akkor érdemes megnézni, hogy a hang milyen célt fog szolgálni. Egy telefonbeszélgetésnél elégséges csak 3200Hz alatti tartományt vizsgálni, így egy általában 8000Hz-es mintavételezési frekvenciát használunk a telekommunikációban, ugyanez a 3200Hz az ember számára hallható frekvenciatartomány körülbelül 16%-a, mégis a hasznos információnak körülbelül 90%-át tartalmazza. Viszont ha zenér˝ol van szó, akkor legalább 20000Hz-ig kell vizsgálni, amire általában 44100Hz-es mintavételezési frekvenciát használhatunk. Ezen kívül a vételezett mintákat is más hosszúságú szavakban tárolhatjuk: egyszer˝u beszédnél elég egy 8 bites szó, míg ha zenér˝ol van szó, akkor legalább egy 16 bites szó kell a tároláshoz. Ezeket figyelembe véve, sokkal kisebb számítási kapacitással kell rendelkeznie egy egyszer˝u beszédet feldolgozó rendszernek (≈ 64kbit/s), mint egy zenére kifejlesztett rendszernek (≥ 706kbit/s) [Smith, 1997].
1.4. Fast Fourier transzformáció A diszkrét Fourier transzformációk alapja, hogy minden jelet fel tudunk írni szinuszoid függvények sorozataként. A diszkrét Fourier transzformációk átviszi a jelet az id˝o tartományából a frekvencia tartományba, így lehet˝ové teszi számtalan m˝uveletet elvégzését a jellel, amelyek nem lennének lehetségesek az id˝o tartományában, például spektrumanalízis vagy egy rendszer frekvenciaválaszának az elemzése. A diszkrét Fourier transzformációnak egyik megoldási módszere a fast Fourier (gyors Fourier) transzformáció. Amint a neve is mutatja, az egyik f˝o tulajdonsága az, hogy gyors, ezzel az algoritmussal ugyanolyan pontos eredményt lehet elérni, mint más diszkrét Fourier transzformációt számoló algoritmusokkal, csak sokkal hatékonyabban. A fast Fourier transzformáció tette lehet˝ové a digitális jelfeldolgozásban ma használt módszereknek a kialakulását. A fast Fourier transzformáció nagyon rövid, de nagyon bonyolult algoritmus, egyike a legbonyolultabbaknak, amit használ a digitális jelfeldolgozás.
1
A fast Fourier
transzformáció kiszámítására több algoritmus is ismert: – Radix-2 (Cooley-Turkey): 2n méret˝u mintákra, oszd meg és uralkodj módszeren alapszik, a legelterjedtebb. – Prim factor: N méret˝u mintákra, ahol N felírható N = N1 N2 formában, ahol N1 és N1 relatív prímek. B˝ovebben a pontos algoritmusokat megtalálhatjuk a [Hayes, 1999] könyvben.
1. Részlet Smith [1997] könyvéb˝ol:
„While the FFT only requires a few dozen lines of code, it is one of the most complicated algorithms in DSP.”
7
2. fejezet
´ terulet Alkalmazasi ¨ Összefoglaló: Ebben a fejezetben a programnak a célcsoportjáról, alkalmazási területér˝ol, megírásának a motivációjáról lesz szó.
2.1. Alkalmazási terület, célközönség Az el˝oz˝o fejezetben láthattuk, hogy a digitális jelfeldolgozás nagyon nagy tudományág, ezen belül a digitális hangfeldolgozás szintén külön tudományágnak tekinthet˝o. A program ebb˝ol a nagy tudományágból egy kis részt ragad ki, ezzel kíván foglalkozni, mégpedig hogy hogyan lehet kinyerni egy audiofájlból a zeneileg fontos információkat, valamint, hogy ezekkel az információkkal mit lehet kezdeni, hogyan lehet feldolgozni ezeket. A program els˝osorban otthoni használatra készült, a célcsoportjába olyan kreatív, alkotni vágyó emberek tartoznak, akiknek van minimális zenei ismeretük, tudják értelmezni, amit a képerny˝on látnak, tehát tisztában vannak a hangmagasságokkal, az akkordokkal. Ez utóbbinak a hiánya viszont nem jelenthet nagy akadályt, hiszen ez hamar pótolható, például [Kesztler, 2000] könyvéb˝ol vagy a [Muszty és Dobay, 2005] könyvb˝ol. Az els˝o, az alkotni vágyás, az nem szerezhet˝o be sajnos könyvekb˝ol. Egy másik potenciális célcsoportba tartoznak a már komolyabb zenei ismeretekkel rendelkez˝o emberek, akik a hangjukat szeretnék képezni. De ha valaki ezekb˝ol egyikre sem akarja használni, akkor akár metronómként is használható, vagy egyszer˝uen hangfelvevésre, illetve lejátszására. A programnak nem célja, hogy a zeneszerz˝ok munkáját elvegye, inkább pályakezd˝oknek, amat˝oröknek kedvcsináló, hogy szorgalmazza az alkotást. Nem tudja helyettesíteni a zenetanárt, aki megmondja, hogyan formáljuk a hangot, tehát ez a program segédeszköz lehet az alkotáshoz, de önmagában nem garancia sem a fejl˝odésre, sem az igazi, egyedi zene készítésére.
2.2. Motiváció A program megírásául szolgáló f˝o motiváció talán az volt, hogy elkezdtem gitározni tanulni, így elkerülhetetlenül, ezzel párhuzamosan, elkezdtem gondolkodni azon, hogyan lehetne el˝osegíteni, megkönnyíteni számítógép segítségével akár a tanulást, akár a „zenealkotást„. Ennek eredményeként született meg ez a program is. A megírás másik mozgatórugója az volt, hogy hasonló program jelenleg a piacon nem túl sok van, és ezek közül, ami ingyenes, az nem versenyképes, ami meg versenyképes, annak 40$ körüli ára van.
8
2. FEJEZET: A LKALMAZÁSI TERÜLET Egy hasonló programot említenék meg: a Microsoftnak a SongSmith nev˝u programját. A SongSmithszel véleményem szerint az a legnagyobb baj, hogy azért az árért, amiért árulják, viszonylag keveset nyújt, akinek csak azok a funkciók kellenek, amiket a SongSmith nyújt, az nem feltétlenül fog kifizetni érte 40$-t. Aki viszont zenével keresi a kenyerét, tehát megéri neki, hogy belefektessen, annak nem nyújt eleget a program. A programnak a kinézete is azt sugallja, hogy inkább egy játék, mint komoly alkalmazás. Egy ilyen jelleg˝u programnál a minimális elvárás, hogy tudja felvenni a hangokat mikrofonon keresztül, tudja lementeni azt, tudja lejátszani, és hogy ajánljon akkordokat a felvett éneknek a függvényében. A program ezeken az alapfunkciókon kívül még képes más programban felvett audiofájloknak a megnyitására is
1
és ezt ugyanúgy tudja kezelni megnyitás után, mintha most vettük volna fel. Valamint
nemcsak akkordokat ajánl a felvett hangok függvényében, hanem még ki is írja, hogy milyen hangokat énekeltünk. Ez a funkció szerintem nagyon lényeges, hiszen így nyomon tudjuk követni, hogy tényleg azt énekeltük-e amit szerettünk volna, vagy elcsúsztunk egy félhanggal, netán egy egész hanggal, és akkor tudjuk, hogy a hangunkon még van, amit csiszolni.
1. Amennyiben a megfelel˝o audioformátumban volt lementve.
9
3. fejezet
´ ak, ´ API-k Technologi Összefoglaló: Ebben a fejezetben a programban használt API kerül bemutatásra, illetve a hangmagasság detektálásra használt FFT.
3.1. A JavaTM Sound API A program, mivel hangokkal dolgozik, fel kell vennie a hangokat, le kell játszania a hangokat. Ezt a JavaTM Sound API-nak a használatával valósítottam meg. A JavaTM Sound API alsó szint˝u támogatást nyújt audio és MIDI adatok lejátszásához, felvevéséhez és feldolgozásához.[Oracle, 2001] Az alapimplementáció támogatja: – Az AIFF, AU és WAV audiofájl formátumokat, ezekb˝ol a programban a WAV fájlformátum van használva. – A lineáris, az a-law és a mu-law kódolásait a fent felsorolt fájlformátumoknak. – Az RMF, MIDI 0 és 1-es típusú zenefájl formátumokat. – A 8 és 16 bites, a mono és sztereó, 8000 Hz és 48000 Hz közötti mintavételezési frekvenciájú hangformátumokat. – A MIDI hardverekhez való hozzáférést. – Hangszintézist szoftverb˝ol. A program szempontjából az API-nak 2 csomagja érdekes (ezeken kívül még kett˝o van, de ezek az API-nak a kib˝ovítésére szolgálnak): – javax.sound.sampled – javax.sound.midi
3.1.1. javax.sound.sampled Ahhoz, hogy a JavaTM Sound API segítségével letudjunk játszani, vagy fel tudjunk venni egy hangot legalább három dologra van szükségünk: formázott audioadatra, kever˝ore és egy sávra. A formázott audioadatot nem szabad összekeverni az audiofájlnak a formátumával. Az audioadat formátuma tartalmazza az összes információt, ami az audioadatnak a lejátszásához, vagy rögzítéséhez szükséges. Ezek az információk: 10
3. FEJEZET: T ECHNOLÓGIÁK , API- K – encoding: lineáris, vagy valamelyik nemlineáris kvantálási algoritmus volt használva (lineáris: PCM, nemlineáris: a-law, mu-law) – sampleRate: mintavételezési frekvencia – sampleSizeInBits: hány bites egy minta – channels: mono vagy sztereó hang – frameSize: általában: chanels ∗ sampleSizeInBytes, de tartalmazhat plusz információkat is, ilyenkor másképpen kell számolni – frameRate: ez általában egyenl˝o a sampleRate-el, de ha a frame tartalmaz más információt akkor nem – bigEndian: big-endian vagy little-endian sorrendben vannak egy mintán belül a byte-ok, csak ha nagyobb a minta mint 8 bit akkor releváns A kever˝o (mixer) lényegileg hasonlít a fizikai kever˝okhöz, amiket koncerteken, hangosításoknál használnak. A JavaTM Sound API-ban minden fizikai audio eszköznek (pl.: hangkártya) megfelel egy kever˝o, valamint fordítva: több bemenetet szétválasztani, vagy összekeverni audiofolyamokba. A sávot (line) egy fizikai kever˝onek a ki és bemeneti csatlakozóihoz lehet hasonlítani. A sávok segítségével küldhetünk adatokat a kever˝onek, vagy kaphat adatokat a kever˝ob˝ol. Leegyszer˝usítve a hang lejátszása így néz ki a JavaTM Sound API segítségével: 1
6
11
16
21
public void play(AudioInputStream playbackInputStream) { AudioFormat format = playbackInputStream.getFormat(); DataLine.Info info = new DataLine.Info(SourceDataLine.class, format); SourceDataLine line = (SourceDataLine) AudioSystem.getLine(info); line.open(format, bufSize); byte[] data = new byte[bufferLengthInBytes]; int numBytesRead = 0; line.start(); while (true) { if ((numBytesRead = playbackInputStream.read(data)) == −1) { break; } int numBytesRemaining = numBytesRead; while (numBytesRemaining > 0) { numBytesRemaining −= line.write(data, 0, numBytesRemaining); } } line.drain(); line.stop(); line.close(); }
3.1.2. javax.sound.midi A MIDI (Musical Instrument Digital Interface) a számítógépek és az elektronikus hangszerek közti kommunikációra fogalmaz meg egy protokollt. A program szempontjából ez annyiban érdekes, hogy a segítségével könnyedén tudjuk utánozni majdnem bármilyen hangszernek a hangját. Ehhez a csomagból fontos:
11
3. FEJEZET: T ECHNOLÓGIÁK , API- K – Synthesizer: a csomagnak ez az objektuma állítja el˝o (szintetizálja) a hangszereknek a hangját. midiüzenetek (ShortMessages, SysexMessages, MetaMessages) segítségével lehet kommunikálni vele. Az objektum audioadattá alakítja a midiüzeneteket. – programChange(): ennek a metódusnak a segítségével adhatjuk meg, hogy milyen hangszernek a hangján szeretnék utánozni. – noteOn(int noteNumber, int velocity): ez egy ShortMessages, ennek a metódusnak a segítségével mondhatjuk meg a Synthesizernek, hogy melyik hangot, és milyen hanger˝ovel szeretnénk lejátszani. Analógia állítható fel a metódus között és a zongorának a billenty˝ui között: note megfelel a lenyomott billenty˝unek, a velocity a lenyomásnak a gyorsaságával 3.1. – noteOff(int noteNumber, int velocity): hasonló a noteOn-hoz, csak ez elhallgattat egy hangot.
.
3.1. ábra. MIDI, zongora analógia http://en.wikipedia.org/wiki/Musical_Instrument_Digital_Interface Egy hangnak a lejátszása a JavaTM Sound API segítségével:
4
9
public void playMidi(int note, int volume, int duration) throws Exception{ Synthesizer synth = MidiSystem.getSynthesizer(); synth.open(); Soundbank soundbank = synth.getDefaultSoundbank(); synth.loadAllInstruments(soundbank); MidiChannel[] channels = synth.getChannels(); MidiChannel channel = channels[0]; channel.programChange(46); //Hárfa channel.noteOn(note, volume); Thread.currentThread().sleep(duration); channel.noteOff(note, volume); }
B˝ovebben lehet olvasni a JavaTM Sound API-ról a [Oracle, 2001] weboldalán.
3.2. Fast fourier Transzformáció (FFT) Ezt nem tudom, hogy ide kéne-e írjam, vagy a fontosabb algoritmusok bemutatásához...
12
4. fejezet
´ o´ am´ıg jobb c´ım nem jut az Dokumentaci eszembe.... Összefoglaló: Ebben a fejezetben a projektnek a specifikációja kerül tárgyalásra, illetve még néhány fontosabb dokumentum.
4.1. Célok A projekt f˝o célja egy olyan platformfüggetlen, ingyenes szoftvernek az elkészítése, amely zenei kíséretet készít a felhasználó énekére.
4.1.1. Felhasználói követelmények – Biztosítson lehet˝oséget a felhasználónak, hogy egy mikrofon segítségével fel tudjon venni egy éneket. – Biztosítson metronómot a felvételhez. – A metronómnak lehessen állítani a tempót és az ütemet. – A felvételt lehessen lementeni, illetve betölteni. – A szoftver jelenítse meg a felvételt hanghullám formájában. – A hanghullámon jelenítse meg az ütemeket. – Minden ütemre ajánljon egy akkordot (kíséretet), amit a hanghullám fölött jelenítsen meg. – Adjon lehet˝oséget a kíséret stílusának a megválasztására. – Adjon lehet˝oséget a stílus, tempó és az ütemnek utólagos módosítására.
13
Irodalomjegyzék Hayes, M. H. Schaum’s Outline of Theory and Problems of Digital Signal Processing. Schaum’s Outline series. The McGraw-Hill Companies, 1999. Kesztler, L. Zenei alapismeretek. Lyceum könyvek. Atheneum 2000 Kiadó, 2 edition, 2000. Muszty, B. és Dobay, A. Új Gitáriskola és daloskönyv. Muszty-Dobay Bt., 2005. Oracle, . Java tm sound programmer guide. http://download.oracle.com/javase/1.5.0/docs/guide/ sound/programmer_guide/, October 2001. Proakis, J. G. és Manolakis, D. G. . Digital Signal Processing - Principles, Algorithmi, Applications. PRENTICE-HALLINTERNATIONAL, 3 edition, 1995. Smith, S. W. The Scientist and Engineer’s Guide to Digital Signal Processing. California Technical Publishing, 1997. Zölzer, U. Digital Audio Signal Processing. John Wiley & Sons, 2 edition, 2008.
14