FULLTEXT02

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 19

TVE 11 034

Examensarbete 15 hp
September 2011

Chord King
Guitar Hero for acoustic guitars

Mattias Johansson
Peter Nordström
Sebastian Ärleryd
Abstract
Chord King

Mattias Johansson, Peter Nordström, Sebastian Ärleryd

Teknisk- naturvetenskaplig fakultet


UTH-enheten A game for acoustic guitars has been written in the Python programming language.
The game has a graphical user interface and there are several song to choose from.
Besöksadress: The game shows to the user what chords and string plucks should be played and
Ångströmlaboratoriet
Lägerhyddsvägen 1 when to play them. Points are awarded if the correct chord or string pluck is played.
Hus 4, Plan 0 The game works well in a moderately quiet environment if the guitar is played
somewhat clean. There are a lot of room for improvement.
Postadress:
Box 536
751 21 Uppsala

Telefon:
018 – 471 30 03

Telefax:
018 – 471 30 00

Hemsida:
http://www.teknat.uu.se/student

Handledare: Lars-Johan Brännmark


Ämnesgranskare: Tomas Olofsson
Examinator: Urban Lundin
ISSN: 1401-5757, TVE 11 034
Table of Contents
1 Inledning............................................................................................................................................3
2 Målsättning........................................................................................................................................ 3
3 Teori...................................................................................................................................................4
3.1 Musikteori.......................................................................................................................................4
3.2 Ljudalstring på gitarr...................................................................................................................... 5
3.3 Ljudanalys...................................................................................................................................... 6
4 Metod.................................................................................................................................................7
4.1 Harmonic Product Spectrum metoden............................................................................................8
4.2 Strängplock.....................................................................................................................................8
4.3 Ackord............................................................................................................................................ 9
4.4 Ljudanalys i realtid......................................................................................................................... 9
5 Resultat............................................................................................................................................ 10
5.1 Språket.......................................................................................................................................... 10
5.2 Färdig kod.....................................................................................................................................11
5.3 Ljudinläsning................................................................................................................................ 11
5.4 Grafik och användargränssnitt......................................................................................................12
5.5 Låtfiler och låtinläsning................................................................................................................12
5.6 Att spela........................................................................................................................................ 12
6 Diskussion....................................................................................................................................... 14
6.1 Metoddiskussion...........................................................................................................................14
6.2 Resultatdiskussion........................................................................................................................ 16
6.3 Programförbättringar.................................................................................................................... 17
7 Slutsatser..........................................................................................................................................17
8 Referenser........................................................................................................................................18

2
1 Inledning
Många är vi som har en akustisk gitarr hemma någonstans. Det skulle vara roligt att lära sig spela
men det är svårt att komma igång med själva övandet. Än fler är vi som tycker det är roligt att spela
musikspel såsom Activisions Guitar Hero. [1] Detta spel har blivit populärt och många har spelat
det i timmar. Nackdelen med det är att hur mycket man än spelar så blir man inte bättre på att spela
gitarr. Plastgitarren som medföljer musikspelet har endast sex knappar och liknar en riktig gitarr
endast till formen.

För att spelaren ska bli bättre på att spela gitarr måste musikspelet vara mer verklighetstroget. Det
allra bästa vore om en riktig gitarr användes för att styra musikspelet. På detta sätt får spelaren träna
på riktigt samtidigt som den blir motiverad av och får saker att öva på från musikspelet.

Vi har tagit fram just ett sådant musikspel. För att spela vårt spel behöver man bara en vanlig
persondator med mikrofon och en akustisk gitarr. I spelet visas vilka ackord och strängplock som
ska spelas och när man ska spela dem. Om spelaren spelar rätt delas poäng ut.

2 Målsättning
Målsättningen med detta projekt är att utveckla ett verklighetstroget musikspel för gitarrer till
persondatorer. Spelet ska fungera både som underhållning och som en sätt att lära sig spela gitarr på
riktigt. Det ska kunna spelas på de allra flesta persondatorer utrustade med en mikrofon bara
spelaren har en egen akustisk gitarr.

Spelet ska använda sig av datorns mikrofon för att läsa in ljud och analysera detta i realtid. Under
ljudanalysen ska spelet kunna hitta ackord och enskilda strängplock, en sträng anslagen på ett band.
De ackord vi vill att spelet ska kunna hitta är treklang-ackorden C, D, E, F, G, A och B i dur och
moll spelade på vanligt sätt. Spelet ska kunna avgöra om spelaren spelat rätt eller fel genom att
jämföra inlästa ackord och plock med en fördefinierad sång. Om spelaren spelar rätt ska spelet dela
ut poäng.Vi kräver inte att programmet hittar när man spelat rätt 100% av gångerna, men det ska
vara tillräckligt ofta för att det ska vara spelbart utan större störningsmoment.

För att visa spelaren vad den ska spela ska spelet ha ett grafiskt användargränssnitt. Spelet ska visa
grafiska element som representerar sången som spelas. Det ska synas tydligt vilket ackord eller
vilken sträng och vilket band spelaren ska spela. Det ska också vara tydligt när spelaren ska spela
dessa.

För att störningar på ljudsignalen inte ska göra analysen för svår begränsar vi oss till att spelet ska
fungera i en relativt tyst miljö där ljudnivån inte överstiger normal talnivå. Vi begränsar oss även
genom att kräva att den akustiska gitarren som används är välstämd samt att den är nylonsträngad
då övertonernas styrkor skiljer sig mycket mellan nylon- och stålsträngade gitarrer.

Våra huvudmål utgörs alltså av följande. Spelet ska:


• kunna spelas på en vanlig dator med mikrofon,
• kunna användas med en vanlig, välstämd nylonsträngad akustisk gitarr,
• känna igen de vanliga treklang-ackorden C, D, E, F, G, A och B i dur och moll,
• ha få störningsmoment och
• ha ett grafiskt användargränssnitt.

3
3 Teori
Teorikapitlet går igenom den grundläggande teori som krävs för att utföra ljudanalysen i vårt
program. Kapitlet inleds med en beskrivning av den grundläggande musikteorin. Med denna som
grund beskrivs hur gitarren fungerar som musikinstrument. Kapitlet avslutas med teori för själva
ljudanalysen.

3.1 Musikteori
Avsnittet tar upp hur vi människor klassificerat de frekvenser som finns i musiken i det vanliga
tonsystemet i västvärlden. Det går även igenom hur toner harmonierar i ett ackord.

Musik är uppbyggt av så kallade toner. En ton är en ljudvåg av hörbar frekvens. I det västerländska
musiksystemet har toner namngivits enligt bokstäver i tolv steg från A till G och placerats i så
kallade oktaver. Varje oktav har sin egen uppsättning toner från A till G. Oktaver ligger i
frekvensspektrumet på så sätt att det frekvensmässigt alltid finns en oktav ovanför och en oktav
under. En oktavs toner har dubbla frekvensen jämfört med tonerna i oktaven under och halva
frekvensen jämfört med tonerna i oktaven ovanför.

För att fixera detta system definieras ofta en A ton till 440 Hz. Detta A kallas ofta A4, A tonen i den
fjärde oktaven. Nästa A, A5, som tillhör oktaven ovanför har frekvens 880 Hz. Det A som tillhör
oktaven under har frekvens 220 Hz och kallas A3.

Varje oktav har också halvtoner. En halvton är tonen man får om man går ett halvt steg från en ton
mot en annan. Dessa är också döpta enligt bokstäver och namnges efter den ton man utgår från och
om man går ett halvt steg upp eller ner från denna ton. Till exempel kallas tonen halvvägs mellan C
och D både för C#, vilket uttalas ciss, eller D♭, vilket uttalas des, beroende på om man utgår från C
eller D. Eftersom det bara är tolv steg av toner i en oktav är tonerna upplagda på så sätt att det inte
finns halvtoner mellan varje ton. De toner som finns är C, C#/D♭, D, D#/E♭, E, F, F#/G♭, G,
G#/A♭, A, A#/B♭ och B. När man går från en av dessa toner till nästa kallas det att man gått upp en
halvton. Frekvensen har då ökat med en faktor 2 1/12.

Förutom de motsvarande tonerna i andra oktaver har också varje ton sina egna övertoner. En given
tons övertoner är alla toner vars frekvens är en heltalsmultipel av tonens frekvens. Till exempel har
A4 på 440 Hz övertonerna 880 Hz, 1320 Hz, 1760 Hz, 2200 Hz och så vidare. Spelar man en ton
kommer de allra flesta instrument också att ge ifrån sig många övertoner av betydande intensitet.
Denna samling övertoner spelar stor roll i hur instrumentets ljud upplevs.

På många instrument kan man spela flera toner på samma gång. Det kallas då att man spelar ett
ackord. Då ger instrumentet ifrån sig både flera toner och övertoner till dessa toner. Det finns många
olika typer av ackord. Den typ av ackord vi koncentrerar oss på kallas treklang-ackord och består av
tre toner. Den första tonen kallas grundtonen och är den tonen som de två andra utgår från. Nästa
ton ligger en stor eller liten ters ovanför grundtonen. En stor ters är 5/4 av grundtonens frekvens och
en liten ters är 6/5 av grundtonens frekvens. Den sista tonen kallas kvinten, och den är 3/2 av
grundtonens frekvens.

4
3.2 Ljudalstring på gitarr
Detta avsnitt beskriver vad som händer i en gitarrsträng efter anslag. Det tar upp hur strängen
svänger, hur dessa svängningar bildar ljud och hur detta kan skapa musikaliska toner.

De flesta gitarrer har sex strängar och är stämda på samma sätt. I denna stämning är den lägsta
strängen stämd i E2 med de resterande strängarna är stämda i A2, D3, G3, B3 och den högsta i E4.
Det är denna stämning vi använder och när vi skriver om välstämda gitarrer är det denna stämning
vi syftar på.

När en gitarrsträng anslås bildas stående vågor av flera olika frekvenser i strängen. Dessa vågor
svänger i strängens grundfrekvens samt heltalsmultiplar av denna. [2] Den lägsta av dessa
frekvenser är grundtonens frekvens och heltalsmultiplarna är övertonernas frekvenser. Tillsammans
bildar dessa toner en ljudsignal. Figur 3.2-1 visar en strängs grundton och tre övertoner.

Figur 3.2-1: Överst syns en gitarrsträng som svänger i sin grundton. Under syns samma sträng
som svänger i sin första, andra och tredje överton.

Stående vågor är indelade i segment som svänger och punkter där strängen inte svänger. Punkterna
som inte svänger kallas noder och de punkter som svänger som mest kallas bukar. Grundtonens och
dess övertoners amplituder kommer att vara beroende av hur strängen slogs an. Detta har att göra
med var övertonernas noder och bukar ligger. På grund av att grundtonens buk ligger mitt på
strängen kommer dess amplitud bli så stor som möjligt om man slår an mitt på strängen. Slår man
an någon annanstans på strängen kommer man få en annan kombination av amplituder på
grundtonen och övertonerna i ljudsignalen. På grund av detta är det i princip omöjligt att få samma
kombination två gånger trots att man slår an på (nästan) samma ställe. Det kommer dock låta
tillräckligt lika för att det mänskliga örat inte ska kunna skilja på ljudsignalerna.

För att kunna spela fler grundtoner än de sex grundtoner som strängarna är stämda i kan man trycka
ned en gitarrs strängar på de band som finns längs dess hals. Den del av strängen som kommer att
svänga då den anslås blir då kortare vilket resulterar i att tonen blir högre, den svänger i en högre
frekvens. Banden är separerade på så sätt att tonen höjs eller sänks med en halvton om man trycker
ned strängen vid ett band längre ned eller upp då man anslår den.

Som resultat av hur banden är upplagda och den vanliga stämningen kommer tonerna från lägre
strängarna att komma igen på de högre strängarna. Spelas till exempel det femte bandet på den
lägsta strängen fås samma ton som om den näst lägsta strängen spelats utan att hålla ner något band.
På grund av detta kan till exempel en gitarr med 18 band på den högst stämda strängen spela 42
olika halvtoner.

5
3.3 Ljudanalys
Detta avsnitt förklarar teori bakom grundläggande ljudanalys.

Vanliga toner spelade på instrument så som en gitarr beter sig som periodiska signaler. Dessa kan
beskrivas som summan av ett oändligt antal sinussignaler av olika amplituder och frekvenser. För
en enskild sträng består dessa frekvenser och amplituder av grundtonen och övertonernas frekvenser
och amplituder. En sådan signal som består av en amplitud som förändras över tid sägs ligga i
tidsdomänen. Med hjälp av Fouriertransformen kan man överföra en sådan signal till
frekvensdomänen och på så sätt få reda på amplituderna hos de frekvenser som bygger upp
signalen. [3]

Ljudsignaler som vi hör är kontinuerliga signaler med ett oändligt antal amplitudnivåer för ett givet
tidsintervall. När en sådan signal spelas in till en dator med en mikrofon fås, på grund av hur datorer
fungerar, en representation av signalen som en samling amplitudvärden av diskret storlek. Varje
amplitudvärde kallas då sampel och tiden mellan varje sampel är oftast konstant. I de fall tiden
mellan samplen är konstant beskrivs den lättast av den så kallade samplingsfrekvensen. För att
Fouriertransformera en tidsdiskret signal används den diskreta Fouriertransformen, eller med fördel
den snabbare ekvivalenta varianten av denna som kallas Fast Fourier Transform. Figur 2 visar en
signal samt dess Fast Fourier Transform.

Figur 3.3-1: Övre grafen visar signalen y(t) = 20sin(5*2pi*t) + 12sin(10*2pi*t) + 15sin(15*2pi*t).
Det syns hur de olika sinussignalerna samverkar för att skapa en signal som varierar periodiskt
över tiden.Undre grafen visar Fast Fourier transformen av signalen i den övre grafen. Denna visar
de relativa amplituderna på de sinussignaler som ingår i signalen.

För att kunna rekonstruera en signal från tidsdiskreta samplingar behövs två samplingar per period
hos den högsta frekvens som ingår i signalen man vill kunna återskapa. På grund av detta kommer
en tidsdiskret inspelning av en ljudsignal bara kunna rekonstruera de delar av ljudsignalen vars
frekvenser är under halva samplingsfrekvensen. Denna gräns ges a Nyquist/Shannons
samplingsteorem och kallas Nyquistfrekvensen. Frekvenser i signalen som befinner sig ovanför
Nyquistfrekvensen kan uppfattas som låga frekvenser när man samplar dem varför filtrering av
höga frekvenser innan analys kan vara nödvändigt. Vi har dock inte filtrerat de signaler vi
Fouriertransformerar.

Längden på den signal man samplar bestämmer hur stor noggrannhet man får när man försöker
urskilja frekvenser ur den. Upplösningen är direkt omvänt proportionell mot inspelningstiden.
Samplas till exempel en signal under två sekunder kommer Fast Fourier transformen ha en

6
upplösning på en halv Hertz. [4]

4 Metod
Detta kapitel beskriver hur de metoder som används i programmet fungerar och hur problem som
uppstår vid ljudanalys har lösts.

För att kunna skapa ett spel enligt målsättningen behövs metoder för att hitta vilket ackord eller
strängplock som spelats. För att kunna ta fram dessa metoder behöver man först få en bild av hur
ljudet från en gitarr ser ut. Detta gjordes genom att studera gitarrens frekvensspektrum i olika
situationer. Till detta användes det matrisbaserade beräkningsprogrammet MATLAB. [5] Detta
program har mycket inbyggd funktionalitet som är användbar vid ljudanalys. Med MATLAB kan
ljud spelas in via inbyggda funktioner och analyseras med Fast Fourier transformen och
vektormanipulationer.

När ljudet från en gitarr analyseras upptäcks snabbt att amplituderna på ett strängplocks grundton
och övertoner är väldigt oförutsägbara. I regel är grundtonen och de första övertonerna starkast men
det går inte att förutse vilken av dessa toner som kommer vara allra starkast. Detta ställer till med
problem när ett program ska ta ut grundtonen från ett spektrum. Figur 4-1 visar ett spektrum när A-
strängen spelats.

Figur 4-1: Spektrum för en spelad A-sträng. Grundtonen är 110 Hz och de två första övertonerna
syns vid 220 Hz respektive 330 Hz.

7
4.1 Harmonic Product Spectrum metoden
Detta avsnitt går igenom en metod som löser problemet med att grundtonen och dess övertoner till
gitarrsträngar har oförutsägbar styrka.

Denna metod kallas Harmonic Product Spectrum metoden och utnyttjar att en tons övertoner ligger
på heltalsmultiplar av tonens frekvens. [6] Idéen är att efter denna metod utförts ska bara
frekvenstoppar som har ett visst antal övertoner inom spektrumet finnas kvar.

Vi utför denna metod genom att kopiera vektorn med spektrumet för det inspelade ljudet ett flertal
gånger. Antalet gånger spektrumet kopieras motsvarar hur många övertoner som ska användas. I
den första kopian behålls var annat element, i den andra behålls var tredje element och så vidare.
Detta kallas att man nedsamplar spektrumsvektorn. Efter att kopiorna fyllts ut med nollor tills de är
lika långa som spektrumsvektorn multipliceras alla vektorer elementvis med varandra. Resultatet
har endast toppar på de ställen alla vektorerna hade toppar. Det sätt som spektrumsvektorn
nedsamplades kommer resultera i att alla kopior har toppar där det i spektrumsvektorn fanns en
grundton. I Figur 4.1-1 visas ett exempel på detta, där den nedersta grafen visar resultatet efter
multiplicering av vektorerna.

Figur 4.1-1: Harmonic Product Spectrum metoden. Ett spektrum och två stycken nedsamplingar
samt resultatet vid elementvis multiplikation av dessa. Här syns hur det, efter elementvis
multiplikation mellan spektrumet och dess nedsamplingar, endast återstår en topp vid grundtonen.

4.2 Strängplock
För att hitta strängplock bland inspelat ljud används den ovan nämnda Harmonic Product Spectrum
metoden. Vi använde fem övertoner för att få ett bra resultat. Denna metod fungerar även då det
finns bakgrundsbrus i det inspelade ljudet. Eftersom bruset vid vanliga inspelningar kan antas
komma från slumpmässiga ljud, dålig mikrofon och andra ickemusikaliska källor utan övertoner
försvinner detta brus då metoden används. Därav fungerar metoden mycket bra då strängplock från
en gitarr ska hittas i ett spektrum där en mängd andra ljud också spelats in.

8
4.3 Ackord
För att hitta ett ackord bland inspelat ljud letar vi i spektrumet efter frekvenser som ingår i ackordet.
Medelvärdet av dessa frekvensers amplituder i spektrumet ses som ett mått på ackordets styrka. På
detta sätt jämförs styrkorna på de fördefinierade treklang-ackorden C, D, E, F, G, A och B i dur och
moll. Det ackord med högst sådant medelvärde anses då vara det som sannolikt har spelats.

De frekvenser vi letar efter för treklang-ackorden är grundfrekvensen, kvinten och tersen. Att leta
efter dessa frekvenser har vi upptäckt ger bättre resultat än att leta efter grundtonen för de
strängplock som ingår i varje ackord. Anledningen till att detta fungerar bättre är att grundtonerna
för de låga strängplocken i ett ackord ofta har övertoner som överlappar grundtonerna hos de höga
strängplocken i ackordet. Om en metod då letar efter varje enskild grundton hos ett ackords
strängplock kommer den då även att mäta bidrag från låga strängars övertoner. Detta resulterar i ett
oväntat högt amplitudmedelvärde och kan resultera i att fel ackord hittas, till synes av en slump.

4.4 Ljudanalys i realtid


Ett spel som styrs av en gitarr måste analysera ljud i realtid. På grund av detta räcker det inte med
att göra en lång inspelning som sedan analyseras. Spelet måste dela upp ljudinspelningen i mindre
tidsintervall och analysera dessa inspelningar under spelets gång. Desto kortare inspelningstiden är
desto kortare tid tar det innan spelet kan reagera på vad som spelats. Problemet här är, enligt slutet
på teoriavsnittet 3.3, att möjligheten att skilja mellan frekvenser som ligger nära varandra blir sämre
med kortare inspelningstid. Här måste en avvägning göras mellan noggrannheten i när ett ackord
eller strängplock spelats och noggrannheten i avläsningen av vilka frekvenser det innehöll.

Det viktigaste här är att spelet kan se skillnad på grundtonen hos de strängplock som kan spelas på
en gitarr. Som nämns i teoriavsnittet 3.2 är skillnaden i ton mellan två efterföljande strängplock en
halvton. Detta steg är i sin tur, enligt teoriavsnittet 3.1, proportionellt mot tonen man tar steget från.
Alltså är inte skillnaden mellan två efterföljande strängplock fix, den beror istället på deras
grundtoner och ökar med högre frekvens. Den minsta skillnaden som fås på en gitarr är mellan den
öppna låga E strängen och när samma sträng anslås då första bandet är nedtryckt. Den öppna låga E
strängen har en frekvens på 82.4 Hz och när det första bandet hålls ned ökar tonen med en halvton
och frekvensen 87.3 Hz fås. Skillnaden här är 4.9 Hz. Således måste punkterna i spektrumet efter att
Fast Fourier Transformen utförts ligga 4.9 Hz ifrån varandra eller närmare för att dessa två
frekvenser ska hamna på varsin punkt i spektrumet. Om detta uppnås kommer varje strängplock på
gitarren att hamna minst en punkt i spektrumet ifrån sin närmsta granne.

Den inspelningstid som detta motsvarar kan lätt räknas ut. Som nämns i slutet på teoriavsnittet 3.3
är inspelningstiden direkt omvänt proportionell mot frekvensupplösningen. Ett punktavstånd i
spektrumet på 4.9 Hz motsvarar en inspelningstid på 1 / 4.9 s = 204 ms. För att kunna urskilja den
minsta skillnaden i grundton mellan strängplocken på en gitarr behöver alltså inspelningens längd
vara mer än 204 ms.

Med detta kan spelet skilja på alla gitarrens strängplock. Dock kan det inte avgöra om två toppar
precis bredvid varandra i spektrumet kommer från två närliggande frekvenser eller om det är en
enda frekvenstopp mitt emellan frekvenserna för punkterna som ”runnit över” på dessa. Detta
händer dock endast då två låga strängplock spelas snabbt i följd och hamnar i samma inspelning. En
enkel lösning skulle vara att bara förlänga inspelningstiden. Dock skulle detta också föra med sig en
ökad osäkerhet i när ackord och strängplock spelats. Vi har inte tagit fram någon lösning på detta
och det blir istället en felkälla för oss vid inspelning av ackord och strängplock.

9
5 Resultat
I detta kapitel beskrivs programmet. Här står vilket programmeringsspråk som använts, vilken
färdig kod programmet bygger på, programmets olika delar beskrivs och hur spelet fungerar för
användaren förklaras samt bilder på programmet visas.

Programmet är i form av ett spel. Spelet består av menyer och spelskärmen. När spelet startas visas
huvudmenyn varifrån det går att klicka vidare till ackordhjälpmenyn som visar hur de ackord spelet
använder sig av spelas och en meny med en låtlista. Väljs en låt i låtlistan visas spelskärmen och
spelet börjar. När låten är slut visas poängmenyn där de uppnådda poängen skrivs ut och hur många
noter som träffats och så vidare.

Figur 5-1: Spelets huvudmeny. I mitten av bilden ses tre knappar. Via knapparna kan spelaren
klicka sig till låtlistan, ackordhjälpmenyn samt stänga spelet.

5.1 Språket
Programmet är skrivet i programmeringsspråket Python. [7] Python är ett så kallat skriptspråk och
har ett simpelt syntax. Språkuppbyggnaden liknar Java och C++ då det har de vanliga byggstenarna
så som if-satser, for-loopar, while-loopar, funktioner och klasser.

Fördelarna med Python som gjorde att vi valde språket är att det är enkelt, plattformsoberoende och
att det finns mycket färdig kod att använda. En av nackdelarna med Python är att processor-
intensiva program många gånger inte blir lika snabba som program skrivna i t.ex. C++ eller Java.
Trots att vi skulle göra ett spel, som generellt sett är väldigt krävande program, tyckte vi att
fördelarna med Python övervägde nackdelarna. Språkets enkelhet gör att det går snabbt och lätt att
skriva kod i det. Detta var viktigt för oss då vi ville koncentrera oss på ljudanalysen och att hinna få
fram ett fungerande spel. Plattformsoberoendet var också viktigt för oss eftersom två av oss kör
Windows medan en kör Mac. Det var avgörande att mycket färdig kod finns att tillgå gratis. Utan
färdig kod skulle vi inte haft möjlighet att slutföra projektet på given tid. Den färdiga koden vi
använder presenteras i avsnitt 5.2.

10
5.2 Färdig kod
Förutom den grundläggande funktionaliteten som finns inbyggd i Python använde vi oss av fem
samlingar av färdig kod, kallade kodbibliotek. För inläsning av ljud använde vi oss av PyAudio, för
grafik och fönster använde vi Pygame, för vektorberäkningar använde vi NumPy, för den diskreta
Fouriertransformen använde vi SciPy och för att läsa in våra låtfiler använde vi PyYAML. [8-12]

PyAudio är ett kodbibliotek som använder sig av PortAudio, ett kodbibliotek för
programmeringsspråket C. Detta kodbibliotek klarar av att läsa in och spela upp ljud på flera olika
plattformar, inklusive Windows, Linux och Mac. Man kan bland annat välja samplingsfrekvens,
bufferstorlek och samplestorlek. [8]

Pygame är ett kodbibliotek som använder sig av SDL, Simple DirectMedia Layer, ett kodbibliotek
för programmeringsspråket C. Med detta kodbibliotek kan man öppna grafiska fönster, rita
tvådimensionell grafik och hantera mus och tangentbord. Vi har använt detta kodbibliotek för att
rita all grafik som syns i spelet samt för att ta emot musrörelser och klick och tangentbordstryck. [9]

NumPy är ett kodbibliotek som har funktionalitet för att hantera stora vektorer och matriser.
Kodbiblioteket innehåller också många väldigt optimerade matematiska operationer man kan utföra
på dessa vektorer och matriser. Använder man dessa vektorer och matriser och de medföljande
operationerna på dessa kan man skriva kod som går nästan lika snabbt som samma kod skriven
snabbare språk så som C. Tack vare NumPy kan vårt spel utföra ganska många operationer på stora
vektorer utan att det går sakta. [10]

SciPy är ett kodbibliotek som har funktionalitet för signalanalys, diskret Fouriertransform,
bildanalys, optimering etc. SciPy använder sig av NumPys vektorer och matriser. Vi använde SciPy
för att utföra den diskreta Fouriertransformen på ljudet vi läst in med PyAudio. [11]

PyYAML är ett kodbibliotek som kan läsa och skriva dataserialiseringsspråket YAML. Detta språk
liknar andra dataserialiseringsspråk så som XML och JSON men är till för att vara lättare att läsa för
människor. Det går snabbt och lätt att strukturera upp ett filformat med YAML som sedan lätt kan
läsas in i ett program. Vi använde PyYAML för att läsa in våra låtfiler skrivna i YAML. [12]

Förutom dessa fem kodbibliotek använde vi en färdig metod för att hitta amplitudtoppar i vektorer.
Metoden hittades på internet och används i programmet för att avgöra vilka frekvenser som är
starkast i en inspelad ljudsignal. [13]

5.3 Ljudinläsning
Ljudet läses in via mikrofon med hjälp av PyAudio. Detta görs genom att en separat
exekveringstråd startas vars enda uppgift är att läsa ljuddata med PyAudio och skicka vidare denna
data till spelets huvudtråd. I huvudtråden körs huvudloopen som sköter ljudanalys, mus och
tangentbord, jämföring av funna ackord och strängplock med sången och uppritning av grafik.
Under ljudanalysen används den diskreta Fouriertransformen i form av Fast Fourier transformen
från kodbiblioteket SciPy. Efter detta används olika metoder vi tagit fram och läst om, beskrivna
under rubriken metoder.

Typiska värden vi använt på samplingsfrekvensen är 8192 Hz med en bufferstorlek på 2048 sampel,


dvs. ett fönster på 250 ms. Vi använder en sampelstorlek på 16 bitar som ger oss en amplitud för
varje sampel på mellan -32768 och + 32767.

11
5.4 Grafik och användargränssnitt
För att öppna fönster, rita grafik och hantera mus och tangentbord använde vi kodbiblioteket
Pygame. Ovanpå Pygame utvecklades ett grafiksystem uppbyggt av skärmar som i sig fylls med
grafikelement. För varje meny i spelet finns en speciell fördefinerad skärm fylld med de
grafikelement som ska synas. Ett grafikelement kan vara till exempel en knapp, en text eller en
färgad ruta. Spelets grafik drivs med mus och tangentbord via händelser. Varje mustryck,
musförflyttning och tangentbordstryck översätts av Pygame till en händelse som sedan hanteras av
spelet. Händelser från musen skickas till det grafikelement som befinner sig under musen då
händelsen skedde. Ett grafikelement väljer sedan själv om den ska hantera händelsen. På detta sätt
kan en knapp tryckas in genom att föra musen över den och klicka medan en text inte påverkas av
musen.

De skärmar som finns i spelet hanteras i grafiksystemet av en så kallad skärmhållare. Den skärm
som är synlig kan signalera till skärmhållaren att en annan skärm ska öppnas. Skärmhållaren byter
då till denna samtidigt som den sparar en historik över vilka skärmar som varit öppna. På det sättet
kan en skärm signalera till skärmhållaren att den ska gå tillbaka till föregående skärm utan att den
signalerande skärmen själv vet vilken skärm som var dess föregångare.

5.5 Låtfiler och låtinläsning


Varje låt som kan väljas från låtlistan är sparad i en egen låtfil. Låtfilerna följer ett format som vi
själva skapat med hjälp av YAML. I varje låtfil står låtnamn, författare, svårighetsgrad, längd,
fördröjning innan start och slag per minut. Förutom denna information innehåller varje låt också en
lista med noter. Varje not har en typ, plock eller ackord, och ett värde på hur många taktslag som
ska passera från förra noten innan noten ska spelas. Noter av typen plock innehåller vilken sträng
och vilket band som ska spelas och noter av typen ackord innehåller vilket av de fördefinerade
ackorden som ska spelas. När en låt startas läses den först in i spelet med hjälp av PyYAML och
översätts sedan till spelets interna sätt att representera låtar.

5.6 Att spela


Väl inne i spelet visas vilka noter som ska spelas och när de ska spelas. Det som visas på skärmen
under spelets gång är noterna, strängarna, träffzonen, poängtavlan, tidsmätaren,
ljudintensitetsmätaren, paustexten samt en tillbakaknapp.

Noterna rör sig från höger till vänster. Varje not representerar antingen ett ackord eller ett
strängplock och är placerade på strängarna beroende på vilken eller vilka strängar som ska spelas
för noten. Noter som representerar ackord sträcker sig över de strängar som ingår i ackordet. Noter
som representerar strängplock ligger på den sträng som de ska spelas på. Noterna för strängplock
visar också en siffra för att indikera vilket band som ska spelas. När en not spelas då den befinner
sig i träffzonen färgas dess kant grön för att indikera detta. Om en not hinner röra sig igenom
träffzonen utan att den spelas färgas dess kant röd för att visa att den missades. Noter som inte
kommit in i träffzonen har svart kantfärg.

Träffzonen ligger till vänster om mitten och utgörs av ett stort grönt fält. Från högra kanten på
träffzonen sträcker sig strängarna hela vägen till högra kanten på skärmen.

Poängtavlan visar hur många poäng spelaren uppnåt samt hur hög multiplicerare spelaren har.
Multipliceraren går från 1 upp till max 4 och ökar med ett varje gång en not spelas inom träffzonen.
Poängen spelaren får när den spelar en not inom träffzonen multipliceras med multipliceraren. Det
lönar sig därför extra mycket att spela rätt flera gånger i rad.

12
Längs skärmens undre kant visas tidsmätaren, paustexten och tillbakaknappen. Tidsmätaren fylls
från låtens början till dess slut för att visa hur långt som gått och hur långt som är kvar på låten.
Paustexten talarom för användaren hur spelet pausas. Klickar spelaren på tillbakaknappen tas den
från spelet till låtlistan.

Vid skärmens vänstra kant visas en ljudintensitetsmätare. Denna kan användas för att få en
uppfattning av om datorns mikrofon tar emot ljud som den ska. Spelas något på en gitarr bör ett
tydligt utslag synas på mätaren.

Figur 5-1: Skärmdump som visar spelskärmen. Till vänster om mitten syns den gröna träffzonen.
Från dess högra kant och åt höger är gitarrsträngarna representerade. Till vänster inom träffzonen
syns en ackord-not. Dess gröna kant indikerar att den spelades inom träffzonen. Noten till vänster
om denna har röd kant för att indikera att den aldrig spelades inom träffzonen. Noterna till höger
om båda dessa har alla svart kant, de har inte kommit in i träffzonen än. Uppe i vänster syns
poängtavlan, till vänster intensitetsmätaren och nere längs skärmens underkant syns tidsmätaren,
paustexten och tillbakaknappen.

13
6 Diskussion
I detta kapitel tar vi upp våra tankar kring varför vi valt de metoder vi valt och tankar kring
resultatet. Det diskuteras även kring vilka programförbättringar man kan tänka sig och vilka
begränsningar just vårt program har.

6.1 Metoddiskussion
Under arbetets gång har problem dykt upp och dessa har lösts med olika metoder. Detta avsnitt tar
upp tankar kring de metoder vi valt och varför vi valt dem.

När frekvensspektrumen från olika anslag av samma sträng jämfördes visade det sig att
frekvenskomponenternas amplituder varierar kraftigt. Ibland blir grundtonen starkare än
övertonerna, ibland blev vissa övertoner starkare än grundtonen. Brus kan också ställa till med
problem och ibland se ut som toner som inte borde finnas där. Situationen blir än mer komplicerad
då flera strängar anslås samtidigt. Här kan vibrationer från en anslagen sträng få en icke anslagen
sträng i svängning på grund av att till exempel övertoner matchar. På så vis kan oförutsedda
frekvenser hittas. Dessa vibrationer håller sig dock oftast tillräckligt små för att de inte ska ställa till
med problem. Figurerna 6.1-1och 6.1-2 visar frekvensspektrumet för två olika anslag av ackordet
D-dur.

Figur 6.1-1: Effektspektrum av ett spelat D-dur. De frekvenskomponenter som ingår är 146, 220,
293 samt 370 Hz. Noter att amplituden vid D-dur ackordets frekvens 370 Hz är osynligt låg samt att
amplituderna på övertonerna är väldigt låga.

Figur 6.1-2: Effektspektrum av D-dur. De frekvenskomponenter som ingår är 146, 220, 293 samt
370 Hz. Noter att amplituden vid D-dur ackordets frekvens 370 Hz är osynligt låg samt hur
amplituderna på övertonerna varierar väldigt mycket.

14
Oregelbundheterna i effektspektrumen skapade problem då vi till en början funderade på att
använda ett matchat filter för att avgöra vilken/vilka sträng/strängar som slagits. Det gick inte att
använda då vi inte riktigt kan förutse hur frekvensspektrumet kommer se ut. Tanken att digitalt
skapa ett ”idealt” plock/ackord och sedan göra ett matchat filter utifrån detta fanns. Detta tror vi
dock hade varit svårt att göra i praktiken. Dels måste ett filter skapas för alla ackord/plock vi vill ha
med i programmet. Dels hade vi troligtvis varit tvungna att skicka signalen genom var och ett av de
matchade filter vi skapat. Med denna metod måste också fasen hos inspelningen relativt filtrena tas i
beaktning.

Metoden vi använder där vi hittar ackord genom att leta efter det ackord vars frekvenser har det
största medelvärdet bland de fördefinerade ackorden har sina problem. Det kan vara svårt att skilja
på två ackord som har många frekvenser gemensamma. Med oregelbundenheterna i amplituder som
uppvisas och andra strängar som klingar kvar sedan tidigare, kan då ett närliggande ackord hittas
om det medelvärdet råkar bli större.

En möjlighet att hitta strängplock som övervägdes är att titta efter största topparna i
frekvensspektrumet. En nackdel med denna metod är att man snabbt märker att grundtonen hos ett
strängplock sällan är den största toppen i frekvensspektrumet. Denna metod hade, om den
implementerades i ett spel, oftast resulterat i att spelet tror att spelaren spelar en av övertonerna i
strängplocket och inte själva grundtonen. Om denna metod används men spelet istället letar i
spektrumet och ger rätt direkt om den hittar frekvensen den letar efter skulle det istället bli väldigt
lätt att fuska. Spelaren skulle ofta kunna slå på måfå och träffa rätt frekvens med något strängplock
eller överton.

Vår lösning på detta problem var att använda Harmonic Product Spectrum metoden, vilken beskrivs
i avsnitt 4.1. Under våra tester hittar denna metod oftast rätt grundton bland topparna i ett
frekvensspektrum vid ett spelat strängplock. Denna metod skulle dock kunna kompletteras med
andra metoder som räknar före, efter eller på sidan om för att förbättra resultatet. Vi har dock funnit
att metoden räcker för våra ändamål.

15
6.2 Resultatdiskussion
Som beskrivs mer ingående i avsnitt 2 ställde vi upp följande huvudmål inför projektet. Spelet som
slutprodukt skulle:
• kunna spelas på en vanlig dator med mikrofon,
• kunna användas med en vanlig, välstämd nylonsträngad akustisk gitarr,
• känna igen de vanliga treklang-ackorden A-G i dur och moll,
• ha få störningsmoment och
• ha ett grafiskt användargränssnitt.

Slutprodukten uppfyller denna målsättning. Spelet fungerar på de allra flesta datorer som är
utrustade med en mikrofon. Under utvecklingen användes nylonsträngade gitarrer och spelet kan då
hitta treklang-ackorden A-G i dur och moll. Under spelets gång störs inte användaren av att spelet
beter sig oväntat eller att det inte hittar tillräckligt många av de spelade ackorden och strängplocken.
Hela spelet inklusive menyer och gränssnitt då man spelar visas grafiskt.

Potentiella störningsmoment är till exempel fördröjning från anslag av ackord eller strängplock tills
dess att spelet reagerar och att spelet inte hittar de ackord och strängplock som spelas.
Fördröjningen påverkas av hur lång tid ljud spelas in innan det analyseras och hur lång denna analys
tar. Vi fann under utvecklingen att en inspelningstid per block på 250 ms täcker alla krav vi ställde
på noggrannhet vid urskiljning av frekvenser. Här blir beräkningstiden obetydlig då den ofta hamnar
runt 10-20 ms. Vi märkte att denna fördröjning inte upplevs störande då spelet spelas. Under våra
tester av spelet har vi också märkt att det hittar rätt ackord och strängplock oftare än 9 av 10 gånger.
Detta upplevs enligt oss under spelets gång inte som störande.

Spelet kräver att en välstämd nylonsträngad gitarr används. Detta kommer av att
frekvensspektrumet förvrängs om gitarren är felstämd samt att frekvensspektrumet skiljer sig
mellan olika strängtyper. Båda begränsningarna ansågs vara vettiga för detta projekt eftersom det är
lätt att stämma en gitarr tillräckligt bra med en vanlig stämapparat och nylonsträngning är väldigt
vanlig på akustiska gitarrer. Utöver detta krävs också att vissa parametrar i spelet ställs in för varje
dator och gitarrkombination. Detta beror på att varje mikrofon hör varje frekvens olika starkt och att
varje gitarr ger ifrån sig olika starka övertoner.

Ackord som har många frekvenser gemensamt är svårare att skilja från varandra. Någon enstaka
gång kan man kan få rätt för andra ackord än det man ska spela om dess frekvenskomponenter är
snarlika. Detta händer oftast för dur och moll ackord för samma ton men också, mer sällan, för
ackord för olika toner.

En bieffekt av att inspelningstiden för varje block är 250 ms blir att det är svårt att skilja på ackord
som spelas kortare än 500 ms ifrån varandra. Detta måste tas i hänsyn när en låt skapas för spelet.
Eftersom 500 ms ofta är en ganska kort tidsperiod i jämförelse med hur lång tid det tar att spela ett
ackord så orsakar denna begränsning sällan problem.

16
6.3 Programförbättringar
Spelet klarar nu av de vanligaste ackorden. Detta går naturligtvis att utöka så fler ackord ingår. Man
kan även tänka sig att det går att hitta en algoritm som kan urskilja olika gitarrtekniker såsom
”slide”, då en sträng anslås på ett band varefter det finger som håller ned strängen hålls nedtryckt
och dras till ett annat band, och ”hammer on”, då strängen hålls ned på ett nytt lägre band då den
redan svänger. Det förutsätter dock att det finns något regelbundet mönster i spektrumet som man
kan identifiera på ett tillförlitligt sätt.

Det skulle också vara möjligt att lägga till fler lägen i spelet så att det kan användas med fler
instrument än nylonsträngad akustisk gitarr. Om man studerar spektrumet från instrumentet och ser
vad som är karaktäristiskt för dess olika toner skulle detta inte vara ett allt för stort projekt. Spelet
skulle då kunna ha en till meny där man väljer instrument och sedan låt man vill spela.

Eftersom listan av ackord och plockade strängar är lång finns möjligheter att göra väldigt många
låtar. Problemet med att inspelningstiden per block är 250 ms, att ackord inte kan komma för tätt i
spelets låtar, skulle kunna lösas genom att spelet spelar in under kortare tidsintervall. Dessa kortare
inspelningar skulle sedan analyseras flera åt gånger samtidigt som de block som analyseras byts ut
en åt gången. På detta sätt skulle upplösningen i frekvens kunna behållas samtidigt som en ökad
uppfattning om när ett ackord spelats skulle fås.

Som spelet är nu måste en ny textfil skapas manuellt för varje låt som läggs till i spelet. För att göra
denna process enklare skulle en låteditor kunna konstrueras. Här skulle användaren kunna grafiskt
lägga in de ackord och strängplock som ska spelas och bestämma när de ska spelas. Editorn skulle
också kunna utnyttja spelets förmåga att läsa av vad som spelas på en gitarr för att föra in ackord
och strängplock i låteditorn, vilka sedan skulle kunna justeras grafiskt i editorn. Denna inspelning
från gitarr skulle få begränsningen att det inte går att avgöra med större noggrannhet än 250 ms när
ett ackord eller plock spelades då inspelningstiden är 250 ms per block innan ljud analyseras. Det
skulle också kunna bli omständigt eftersom spelet ofta hittar fler ackord och strängplock än de som
faktiskt spelats. En annan möjlighet är att låteditorn skulle kunna läsa in redan etablerade format så
som MIDI [14] eller GuitarPro-filer [15].

Som spelet fungerar nu behöver några värden ställas om för varje kombination av dator och gitarr.
Detta skulle kunna åtgärdas genom att man lägga till en kalibreringsfunktion i spelet. Denna
funktion skulle låta spelaren spela på sin gitarr och analysera amplitudnivåerna på de frekvenser
som spelet hör. Denna information skulle kunna sparas för att normalisera amplituden mellan olika
frekvenser och på så sätt komma runt problemet med att olika mikrofoner hör olika frekvenser olika
bra. Detta skulle kunna sparas som en profil för varje mikrofon och gitarr som spelaren har. Det
skulle också kunna finnas fördefinierade profiler för olika sorters gitarrer för att hantera att olika
gitarrer ger ifrån sig olika starka övertoner.

7 Slutsatser
Med tanke på framgången som Guitar Hero haft kan man fundera på varför spel för riktiga gitarrer
inte växt och blivit stora. Vi har i och med detta projekt visat att det går att skapa ett spel till vanliga
PC datorer som går att styras med en vanlig gitarr via datorns mikrofon. Det resulterande spelet
uppfyller vår målsättning och dess spelbarhet är mycket god. Den tid vi lagt ned på detta spel
motsvarar inte alls den tid som läggs ner på kommersiella spel vilket borde tyda på att de problem
och förbättringsmöjligheter vi sett bör kunna lösas ifall någon skulle ta denna ide och realisera den
på marknaden.

17
8 Referenser
[1] Musikspelet Guitar Hero – http://hub.guitarhero.com/

[2] Spänd strängs svängningsfrekvenser – http://en.wikipedia.org/wiki/Vibrating_string

[3] Fouriertransformen – http://en.wikipedia.org/wiki/Fourier_transform

[4] Frekvensupplösning vid diskret Fouriertransformering –


G. Heinzel, A. Rudiger och R. Schilling, 2002-02-15: Spectrum and spectral density estimation by
the Discrete Fourier transform (DFT), including a comprehensive list of window functions and
some new at-top windows. Teilinstitut Hannover.

[5] MATLAB – http://www.mathworks.com/products/matlab/

[6] Harmonic Product Spectrum metoden –


M. R. Schroeder 1968-01-05: Period Histogram and Product Spectrum: New Methods for
Fundamental-Frequency Measurement. Bell Telephone Laboratories, Murray Hill, New Jersey.

[7] Python – http://www.python.org

[8] PyAudio – http://people.csail.mit.edu/hubert/pyaudio/

[9] Pygame – http://www.pygame.org

[10] NumPy – http://numpy.scipy.org/

[11] SciPy – http://www.scipy.org/SciPy

[12] PyYAML – http://pyyaml.org/wiki/PyYAML

[13] Metod för att hitta toppar i vektorer, Eli Billauer – http://billauer.co.il/peakdet.html

[14] Ljudfilformatet MIDI – http://en.wikipedia.org/wiki/Musical_Instrument_Digital_Interface

[15] Gitarrprogrammet GuitarPro – http://www.guitar-pro.com/en/index.php

18

You might also like