Etter at jeg hadde vært på et kurs i MSDevStudio/C++, hadde jeg lyst til å bruke det jeg hadde lært til å lage noe annet enn "Hello world" program. Siden jeg er interessert i musikk og spiller litt gitar, bestemte jeg meg for å lage et program som kunne hjelpe meg å stemme gitaren (jeg vet det er gjort n ganger før).

Før jeg startet kodingen måtte noen punkter klareres:
  1. Hvordan skal HMI'et være (MMI for mannsjåvinister)?
  2. Hvordan kan jeg finne ut hvilke frekvenser en lyd består av?
  3. Hvordan er koplingen mellom frekvenser og tonehøyde?

Det første spørsmålet er greit å besvare. Brukergrensesnittet bør være slik at man kan bruke programmet dersom man har brukt en elektronisk "stemmeboks" før (tuner). Jeg synes det er best med "analog" visning, og automatisk deteksjon av nærmeste tone.

Det andre spørsmålet er litt verre å besvare. Det er sikker mulig å bruke flere metoder, men jeg fant ut at det er greiest å bruke FFT (Fast Fourier Transform).

Når jeg lette etter svar på det siste spørsmålet på nettet, fant jeg ut at det ikke er noe fasit svar på det. Men siden programmet er ment å brukes til å stemme en gitar, som har faste intervall mellom tonene, fant jeg ut at jeg måtte bruke en "equally tempered 12 tune scale" (har ikke noe godt norsk uttrykk). Denne skalaen er ikke den som låter best for menneskeøret, men er et kompromiss for å minske kompleksiteten. Skalaer som er bygd opp av toner som er heltallsmultiplum av roten låter bedre. Hvis du vil lære mer om slike skalaer som er "riktig intonert", kan du sjekke ut denne siden: Just Intonation Network.

Formelen for å beregne frekvensene i en 12 tone skala med like intervall er:
Skalaformel
Der x er frekvensen til rota (f.eks A4=440 Hz), og k er antall toner fra rota.

Du får kanskje en ide om hva det dreier seg om ved å se og høre på dette eksempelet med en A dur akkord. Akkordene i wav-fila under er bygd opp av sinusbølger med frekvenser som angitt i tabellen. Det første sekundet riktig intonert, og det andre med like intervall.

Tone Like intervall Riktig intonert
A 440 440
C# f(440,4)= 554,365 440*5/4= 550
E f(440,7)= 659,255 440*3/2= 660

Eksempelet.

Her er et pdf dokument som beskriver programmet jeg lagde, som har det originale navnet TuneIt. Du må ha Acrobat Reader eller noe tilsvarende for å lese det. Dersom du har lyst til å prøve programmet, kan du laste det ned her: TuneIt.zip. Det er ikke nødvendig å installere programmet, bare pakk det ut i en ny mappe og kjør i vei. MEN, ikke klag til meg dersom noe går i ball!

Manuell stemming

Statistikken over hvordan surfere har kommet til denne siden tyder på at mange leter etter metoder for å stemme gitaren manuelt. Paul Guy sine sider har en del info om dette emnet.

En av metodene han beskriver som jeg synes fungerer bra er som følger:

E1 Mot referanse. Juster E1
H2 5. band mot E1. Juster H2
G3 9. band mot E1. Juster G3
D4  14. band mot E1. Juster D4
A5 7. band mot E1 (en oktav under). Juster A5
E6 5. band flageolett* mot E1. Juster E6

*Berør strengen lett over 5. band mens du slår an strengen. Du får da en tone som er 2 oktaver over løs streng.

                    5       7       9                  14
E |---|---|---|---|---|---|---|---|---|---|---|---|---|---|
H |---|---|---|---|-X-|---|---|---|---|---|---|---|---|---|
G |---|---|---|---|---|---|---|---|-X-|---|---|---|---|---|
D |---|---|---|---|---|---|---|---|---|---|---|---|---|-X-|
A |---|---|---|---|---|---|-X-|---|---|---|---|---|---|---|
E |---|---|---|---|-O-|---|---|---|---|---|---|---|---|---|