saw skrev:
Jag är inte sämmre än att jag kan ändra mig(orsaken är gammal inlärning, att noterna
är representerade som 2,5 + 3,5) men min kära vän, jag vore väldigt tacksam om du
vill förklara
int oktav;
switch (MIDITon % 12)
oktav = MIDITon/12-1;
nyTon += Convert.toString(oktav);
Kan det betyda att A3 betraktas som ger nyTon 57 och sedan läggs 3:an till för
oktaven?
Modulo-operaton % gör att det första tal formateras om så att det hamnar inom en viss gräns. Exempelvis är
11%12=11 (Ingen förändring)
12%12=0
13%12=1
...
22%12=10
23%12=11
24%12=0
Divisionsrest är ett annat sätt att se på %.
Divisionen plockar ut vilken oktav som noten ligger i. -1 finns där eftersom MIDI börjar räkna från oktav -1 och inte oktav 0.
För att gå åt andra håller får du göra så här:
MIDITon = 12*(oktav+1) + Ton;
I det uttrycket så är ton och oktav åtskilda.
Oktaven justeras uppåt för att hamna rätt enligt MIDI, och Ton är en ton mellan C och B där C=0, C#=1, ... A#=10, B=11.
saw skrev:
Naturligtvis, tack för det Fredde Mannen.
Tillbaka till datatyper.
PGA att ni alla har talat om att jag inte skall lita på doubble, så försökte jag att ändra
till decimal när det gäller frekvenserna:
case "c4":
newFrekvens = 8372.018013; //osv
Om jag nu inte kan använda mig av decimal och ni säger att jag skall akta mig för
doubble, vad skall jag då ta?
Nej. decimal (Om det nu är så typen heter) samt double kan lagra tal med bra precision, men dålig exakthet. vad betyder det? Jo att tal kan lagras med 10 decimaler eller vad det kan vara, men däremot kan talat avvika lite lite från det exakta värdet man har angivit.
Så om man ska lagra data i så kallade diskreta steg (T ex heltalssteg) så är integer att föredra. Däremot kan du lagra frekvensen som en decimal eller double om du vill utan att oroa dig.