Quotar mig själv härBestäm en frekvens f så att f * 12/144 = 440Hz => f=5280Hz
Detta ger A = f * 12/144, vi vill ha A = f * 1/x
Detta ger x = 144/12 = 12 och A = f * 1/12
#A Blir då f * 13/144 (440 + 440 * 1/12), skrivet på A = f * 1/x
blir x = 144/13 => #A ca f * 1/11
Nogranheten i detta blir inte särskilt bra.
Vi förlänger istället allt med 100:
f = 528Khz,
Första oktaven
A = 12/14400 * f, x=14400/12=1200 och f=528Khz * 1/1200 = 440Hz
A# = 13/14400 * f, x=14400/13=1108 1/2 = 554
B = 14/14400 * f, x=14400/14=1029 1/2 = 514
c = 15/14400 * f, x=14400/15=960 1/2 = 480
C# = 16/14400 * f, x=14400/16=900 1/2 = 450
D = 17/14400 * f, x=14400/17=847 1/2 = 424
D# = 18/14400 * f, x=14400/18=800 1/2 = 400
E = 19/14400 * f, x=14400/19=758 1/2 = 379
F = 20/14400 * f, x=14400/20=720 1/2 = 360
F# = 21/14400 * f, x=14400/21=686 1/2 = 343
G = 22/14400 * f, x=14400/22=655 1/2 = 327
G# = 23/14400 * f, x=14400/23=625 1/2 = 313
Andra oktaven
A = 12/14400 * f, x=14400/24=600 1/2 = 300
A# = 13/14400 * f, x=14400/25=1108 1/2 = 288
B = 14/14400 * f, x=14400/26=1029 1/2 = 276
c = 15/14400 * f, x=14400/27=960 1/2 = 267
C# = 16/14400 * f, x=14400/28=900 1/2 = 257
D = 17/14400 * f, x=14400/29=847 1/2 = 248
D# = 18/14400 * f, x=14400/30=800 1/2 = 240
E = 19/14400 * f, x=14400/31=758 1/2 = 232
F = 20/14400 * f, x=14400/32=720 1/2 = 225
F# = 21/14400 * f, x=14400/33=686 1/2 = 218
G = 22/14400 * f, x=14400/34=655 1/2 = 212
G# = 23/14400 * f, x=14400/35=625 1/2 = 206

Måste erkänna att jag inte är helt haj på hur jag räknade men tonerna lät hyffsat bra i alla fall, spelade top gun temat med den....
Känns som att när jag väl kom till slutsatsen att använda en mycket högre frekvens kunde jag kanske löst det på något simplare sätt, vissa uträkningar verkar lite överflödiga, men nu har du något att jobba med.
edit
Hm, andra oktaven ser konstig ut när man kollar på ½ värdet... har inte tid att kolla upp det nu...
Källkoden till tongeneratorn i vhdl:
Kod: Markera allt
--******************************************************************
-- Projekt i Digitalkonstruktion HT-03 - Melodigenerator
-- Av: Fredrik Johansson & Marcus Bohman
-- Beskrivning: tongenerator.vhd delar ner ingående klocksignal
-- från 528Khz till olika hörbara toner. Vilken ton som spelas styrs
-- från player.vhd.
--******************************************************************
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
entity tongenerator is
port(clock, reset: in std_logic;
-- ton in från player.vhd
ton: in std_logic_vector(4 downto 0);
-- utsignalen
u: buffer std_logic);
end entity tongenerator;
architecture beteende of tongenerator is
-- Används till att dela frekvensen
signal q: integer range 0 to 600 := 0;
begin
process(clock, reset)
variable i: integer range 0 to 600 := 0;
begin
if rising_edge(clock) then
if (u = 'U') then
u <= '0';
else null;
end if;
if (i = q) then
u <= not u;
i := 0;
else
i := i + 1;
end if;
-- reset fungerar här som en "mute" knapp
case (reset) is
when '0' => null;
when '1' => u <= '0';
when others => null;
end case;
end if;
end process;
process(ton)
begin
case (ton) is
-- delar frekvensen vid olika värden
-- beroende på vilken ton som ska spelas
when "00000" => q <= 600; -- 1A
when "00001" => q <= 554; -- 1A#
when "00010" => q <= 514; -- 1B
when "00011" => q <= 480; -- 1C
when "00100" => q <= 450; -- 1C#
when "00101" => q <= 424; -- 1D
when "00110" => q <= 400; -- 1D#
when "00111" => q <= 379; -- 1E
when "01000" => q <= 360; -- 1F
when "01001" => q <= 343; -- 1F#
when "01010" => q <= 327; -- 1G
when "01011" => q <= 313; -- 1G#
when "01100" => q <= 300; -- 2A
when "01101" => q <= 288; -- 2A#
when "01110" => q <= 276; -- 2B
when "01111" => q <= 267; -- 2C
when "10000" => q <= 257; -- 2C#
when "10001" => q <= 248; -- 2D
when "10010" => q <= 240; -- 2D#
when "10011" => q <= 232; -- 2E
when "10100" => q <= 225; -- 2F
when "10101" => q <= 218; -- 2F#
when "10110" => q <= 212; -- 2G
when "10111" => q <= 206; -- 2G#
when "11111" => q <= 0; -- paus
when others => q <= 0;
end case;
end process;
end architecture beteende;