; SXデバイス設定 DEVICE pins28,pages4,banks8,oschs DEVICE turbo,stackx,optionx DEVICE carryx ID 'SXtest' RESET reset_entry FREQ 50000000 ;SX-Key接続時には50MHz駆動 ; 割込み発生周期の設定 int_period = 217 ZeroFlg equ status.2 CaryFlg equ status.0 org 08h ;FSR ;グローバルtmpレジスタ tmpx ds 2 ;08h tmpy ds 2 ;0ah tmp0 ds 1 ;0ch tmp1 ds 1 ;0dh tmp2 ds 1 ;0eh Rdata ds 1 ;0fh tmpflg1 equ tmp0.0 RDset equ tmp0.1 ; Bank0 org 10h Bank0 equ $ ;FSR OutMode ds 1 ;10h rcnt ds 1 ;11h rtreg ds 1 ;12h nMode ds 1 ;13h ; 16 bit x 16 bit -> 32bit 用変数 ;FSR md16 ds 2 ;14h sigmd16 equ md16+1.7 mr16 ds 2 ;16h sigmr16 equ mr16+1.7 upper_prdt ds 2 ;18h count ds 1 ;1ah nONOFF ds 1 ;1bh RMode ds 1 ;1ch noteNo ds 1 ;1dh ; Bank1 org 30h Bank1 equ $ ;FSR sin0x_1 ds 2 ;30h(0000) sin{(n-1)x} sin1x_1 ds 2 ;32h(0010) sin{nx} cosx_1 ds 2 ;34h(0100) cosx note_1 ds 1 ;36h(0110) note org 38h sin0x_2 ds 2 ;38h(1000) sin1x_2 ds 2 ;3ah(1010) cosx_2 ds 2 ;3ch(1100) note_2 ds 1 ;3eh(1110) ; page0 ; リセット・ベクタ org 0h Page0 bank Bank0 ; RMode Jump Table ----------------------- clc mov w,RMode jmp pc+w ;RMode jmp RMode0 ;00 start bit待ち jmp RMode1 ;01 data read(0bit) jmp RMode2 ;02 data read(1bit) jmp RMode3 ;03 data read(2bit) jmp RMode4 ;04 data read(3bit) jmp RMode5 ;05 data read(4bit) jmp RMode6 ;06 data read(5bit) jmp RMode7 ;07 data read(6bit) jmp RMode8 ;08 data read(7bit) jmp RMode9 ;09 stop bit 確認 ; start bit待ち------------------- RMode0 snb ra.0 ;if ra.0 == #0 then skip jmp REnd ;if ra.0 == #1 then REnd mov w,#$04 mov rcnt,w clr rtreg jmp REnd0 RMode1 RMode2 RMode3 RMode4 RMode5 RMode6 RMode7 RMode8 dec rcnt sb ZeroFlg jmp REnd clrb CaryFlg snb ra.0 ;if ra.0 == #0 then skip setb CaryFlg rr rtreg mov w,#$03 mov rcnt,w jmp REnd0 RMode9 dec rcnt sb ZeroFlg jmp REnd clr RMode setb RDset mov w,rtreg mov Rdata,w jmp REnd REnd0 inc RMode REnd ; OutMode Jump Table---------------------- clc mov w,OutMode jmp pc+w jmp OutMode0 ;MIDIデータ解析 jmp OutMode1 ;正弦波発生ユニット1 jmp OutMode2 ;正弦波発生ユニット2 jmp OutMode3 ;正弦波発生ユニット3 jmp OutMode4 ;正弦波発生ユニット4 jmp OutMode5 ;正弦波発生ユニット5 jmp OutMode6 ;正弦波発生ユニット6 jmp OutMode7 ;正弦波発生ユニット7 jmp OutMode8 ;正弦波発生ユニット8 jmp OutMode9 ;正弦波加算、DACへ出力 OutModeEnd1 inc OutMode OutModeEnd mov w,#-int_period ;interrupt every 'int_period' clocks retiw ;exit interrupt ; OutMode OutMode0 ;------------------------------- sb RDset jmp OutModeEnd1 ;新しいデータが無ければ何もしない ;RDset = #1 clrb RDset ;データを読み取った clc mov w,nMode jmp pc+w jmp nMode0 ;note ON=#0 OFF=#0 ノートon/off検出 jmp nMode1 ;note ON=#1 OFF=#0 ノートon:note No. jmp nMode2 ;note ON=#1 OFF=#0 ノートon:ベロシティー jmp nMode3 ;note ON=#0 OFF=#1 ; note ON/OFF待ち------------------------------- nMode0 setb CaryFlg mov w,#$90 ;note ONチェック mov w,Rdata-w sb ZeroFlg ;if Rdata == #$80 then skip jmp nMode000 ;note ON でなければ次に進む ; Rdata == $90 (note ON) mov w,#$01 ;note ON note No. 受信待ちへ mov nMode,w jmp nModeEnd nMode000 setb CaryFlg mov w,#$80 ;note OFFチェック mov w,Rdata-w sb ZeroFlg ;if Rdata == #$90 then skip jmp nModeEnd ;note OFFでなければ何もしない ;Rdata == $80 (note OFF) mov w,#$03 ;note OFF note No.受信待ちへ mov nMode,w jmp nModeEnd ; note ON note No.受信待ち---------------------- nMode1 clr nMode setb CaryFlg mov w,#$32 ;note No.チェック mov w,Rdata-w sb CaryFlg ;if Rdata > 32h then skip jmp nModeEnd ;Rdata < 32h なら何もしない ;Rdata > 32h setb CaryFlg mov w,#$5d mov w,Rdata-w snb CaryFLG ;if Rdata < 5d then skip jmp nModeEnd ;Rdata > 5dh なら何もしない ; Rdata < 5dh setb CaryFlg mov w,#$32 sub Rdata,w ;note No = Rdata - 32h mov w,Rdata mov noteNo,w mov w,#$02 mov nMode,w ;note ON:ベロシティ検出へ jmp nModeEnd ; note ON ベロシティ待ち---------------------- nMode2 clr nMode ;次はnoteON/OFF待ちへ test Rdata ;Rdataゼロチェック snb ZeroFlg ;if Rdata(ベロシティ)!=0 then skip jmp SoundOff ;if Rdata == 0 then SoundOff ;ベロシティ != 0 ; 1-8 check snb nONOFF.0 jmp nONOFF1 ;No.1 OSC busy ; No.1 OSC set setb nONOFF.0 mov w,#$30 ;No.1 OSC reg jmp nModeEnd1 nONOFF1 snb nONOFF.1 jmp nONOFF2 ;No.2 OSC busy ; No.2 OSC set setb nONOFF.1 mov w,#$38 ;No.2 OSC reg jmp nModeEnd1 nONOFF2 snb nONOFF.2 jmp nONOFF3 ;No.3 OSC busy ; No.3 OSC set setb nONOFF.2 mov w,#$50 ;No.3 OSC reg jmp nModeEnd1 nONOFF3 snb nONOFF.3 jmp nONOFF4 ;No.4 OSC busy ; No.4 OSC set setb nONOFF.3 mov w,#$58 ;No.4 OSC reg jmp nModeEnd1 nONOFF4 snb nONOFF.4 jmp nONOFF5 ;No.5 OSC busy ; No.5 OSC set setb nONOFF.4 mov w,#$70 ;No.5 OSC reg jmp nModeEnd1 nONOFF5 snb nONOFF.5 jmp nONOFF6 ;No.6 OSC busy ; No.6 OSC set setb nONOFF.5 mov w,#$78 ;No.6 OSC reg jmp nModeEnd1 nONOFF6 snb nONOFF.6 jmp nONOFF7 ;No.7 OSC busy ; No.7 OSC set setb nONOFF.6 mov w,#$90 ;No.7 OSC reg jmp nModeEnd1 nONOFF7 snb nONOFF.7 jmp nONOFF8 ;No.8 OSC busy ; No.8 OSC set setb nONOFF.7 mov w,#$98 ;No.8 OSC reg ; jmp nModeEnd1 nModeEnd1 mov tmp2,w mov w,noteNo mov tmp1,w page Page3 call DataInit ;Init Data Load nONOFF8 jmp nModeEnd ; note OFF note No 待ち ------------------------- nMode3 setb CaryFlg mov w,#$32 sub Rdata,w ;Rdata = note No - 32h mov w,Rdata mov noteNo,w SoundOff mov w,noteNo mov tmp1,w clr nMode ;次はnote ON/OFF 待ちへ ;No.1 OSC sb nONOFF.0 jmp nOFF1 ;No.1 OSC busy setb CaryFlg mov w,#$36 ;No.1 OSC note No. mov fsr,w mov w,tmp1 ;note No. mov w,ind-w bank Bank0 snb ZeroFlg ;if note No. != No.1 note No. then skip clrb nONOFF.0 ;if note No. == No.1 note No. then No.1 OSC OFF nOFF1 ;No.2 OSC sb nONOFF.1 jmp nOFF2 ;No.2 OSC busy setb CaryFlg mov w,#$3e ;No.2 OSC note No. mov fsr,w mov w,tmp1 ;note No. mov w,ind-w bank Bank0 snb ZeroFlg ;if note No. != No.2 note No. then skip clrb nONOFF.1 ;if note No. == No.2 note No. then No.2 OSC OFF nOFF2 ;No.3 OSC sb nONOFF.2 jmp nOFF3 ;No.3 OSC busy setb CaryFlg mov w,#$56 ;No.3 OSC note No. mov fsr,w mov w,tmp1 ;note No. mov w,ind-w bank Bank0 snb ZeroFlg ;if note No. != No.3 note No. then skip clrb nONOFF.2 ;if note No. == No.3 note No. then No.3 OSC OFF nOFF3 ;No.4 OSC sb nONOFF.3 jmp nOFF4 ;No.4 OSC busy setb CaryFlg mov w,#$5e ;No.4 OSC note No. mov fsr,w mov w,tmp1 ;note No. mov w,ind-w bank Bank0 snb ZeroFlg ;if note No. != No.4 note No. then skip clrb nONOFF.3 ;if note No. == No.4 note No. then No.4 OSC OFF nOFF4 ;No.5 OSC sb nONOFF.4 jmp nOFF5 ;No.5 OSC busy setb CaryFlg mov w,#$76 ;No.5 OSC note No. mov fsr,w mov w,tmp1 ;note No. mov w,ind-w bank Bank0 snb ZeroFlg ;if note No. != No.5 note No. then skip clrb nONOFF.4 ;if note No. == No.5 note No. then No.5 OSC OFF nOFF5 ;No.6 OSC sb nONOFF.5 jmp nOFF6 ;No.6 OSC busy setb CaryFlg mov w,#$7e ;No.6 OSC note No. mov fsr,w mov w,tmp1 ;note No. mov w,ind-w bank Bank0 snb ZeroFlg ;if note No. != No.6 note No. then skip clrb nONOFF.5 ;if note No. == No.6 note No. then No.6 OSC OFF nOFF6 ;No.7 OSC sb nONOFF.6 jmp nOFF7 ;No.7 OSC busy setb CaryFlg mov w,#$96 ;No.7 OSC note No. mov fsr,w mov w,tmp1 ;note No. mov w,ind-w bank Bank0 snb ZeroFlg ;if note No. != No.7 note No. then skip clrb nONOFF.6 ;if note No. == No.7 note No. then No.7 OSC OFF nOFF7 ;No.8 OSC sb nONOFF.7 jmp nOFF8 ;No.8 OSC busy setb CaryFlg mov w,#$9e ;No.8 OSC note No. mov fsr,w mov w,tmp1 ;note No. mov w,ind-w bank Bank0 snb ZeroFlg ;if note No. != No.8 note No. then skip clrb nONOFF.7 ;if note No. == No.8 note No. then No.8 OSC OFF nOFF8 nModeEnd jmp OutModeEnd1 ;No.1 OSC -------------------------------------- OutMode1 sb nONOFF.0 jmp OutModeEnd1 ;if No.1 OSC OFF then 何もしない mov w,#$30 jmp OSCCal ;No.2 OSC -------------------------------------- OutMode2 sb nONOFF.1 jmp OutModeEnd1 ;if No.2 OSC OFF then 何もしない mov w,#$38 jmp OSCCal ;No.3 OSC -------------------------------------- OutMode3 sb nONOFF.2 jmp OutModeEnd1 ;if No.3 OSC OFF then 何もしない mov w,#$50 jmp OSCCal ;No.4 OSC -------------------------------------- OutMode4 sb nONOFF.3 jmp OutModeEnd1 ;if No.4 OSC OFF then 何もしない mov w,#$58 jmp OSCCal ;No.5 OSC -------------------------------------- OutMode5 sb nONOFF.4 jmp OutModeEnd1 ;if No.5 OSC OFF then 何もしない mov w,#$70 jmp OSCCal ;No.6 OSC -------------------------------------- OutMode6 sb nONOFF.5 jmp OutModeEnd1 ;if No.6 OSC OFF then 何もしない mov w,#$78 jmp OSCCal ;No.7 OSC -------------------------------------- OutMode7 sb nONOFF.6 jmp OutModeEnd1 ;if No.7 OSC OFF then 何もしない mov w,#$90 jmp OSCCal ;No.8 OSC -------------------------------------- OutMode8 sb nONOFF.7 jmp OutModeEnd1 ;if No.8 OSC OFF then 何もしない mov w,#$98 ; jmp OSCCal ;OSC Cal --------------------------------------- OSCCal mov tmp1,w mov fsr,w setb fsr.2 setb fsr.0 ;x101 mov w,ind bank Bank0 mov md16+1,w ;cosx_n+1 -> md16+1 mov w,tmp1 mov fsr,w setb fsr.2 ;x100 mov w,ind bank Bank0 mov md16,w ;cosx_n -> md16 mov w,tmp1 mov fsr,w setb fsr.0 setb fsr.1 ;x011 mov w,ind bank Bank0 mov mr16+1,w ;sin1x_n+1 -> mr16+1 mov tmpx+1,w ; -> tmpx+1 mov w,tmp1 mov fsr,w setb fsr.1 ;x010 mov w,ind bank Bank0 mov mr16,w ;sin1x_n -> mr16 mov tmpx,w ; -> tmpx page Page1 ; sin(nx)*cos(x) -> upper_prdt call smul1616 ; page Page0 ; upper_prdt -> sin1x mov w,upper_prdt mov tmpy,w mov w,upper_prdt+1 mov tmpy+1,w mov w,tmp1 mov fsr,w setb fsr.1 ;x010 mov w,tmpy mov ind,w ;upper_prdt -> sin1x_n inc fsr ;x011 mov w,tmpy+1 mov ind,w ;upper_prdt+1 -> sin1x_n+1 ; sin0x -> -sin0x clrb fsr.1 ;x001 not ind ;sin0x_n+1 clrb fsr.0 ;x000 not ind ;sin0x_n clc mov w,#$01 add ind,w ;sin0x_n + 1 clr w setb fsr.0 ;x001 add ind,w ;sin0x_n+1 + Cary ; ; sin(nx)*cos(x)-sin{(n-1)x} clc inc fsr ;x010 mov w,ind ;sin1x_n -> w clrb fsr.1 ;x000 add ind,w ;sin0x_n + w + Cary -> sin0x_n setb fsr.0 setb fsr.1 ;x011 mov w,ind ;sin1x_n+1 -> w clrb fsr.1 ;x001 add ind,w ;sin0x_n+1 + w + cary -> sin0x_n+1 ; ; 2*sin(nx)*cos(x)-sin{(n-1)x} clc clrb fsr.0 ;x000 mov w,ind ;sin0x_n -> w setb fsr.1 ;x010 add ind,w ;sin1x_n + w -> sin1x_n clrb fsr.1 setb fsr.0 ;x001 mov w,ind ;sin0x_n+1 -> w setb fsr.1 ;x011 add ind,w ;sin1x_n+1 + w + Cary -> sin1x_n+1 ; mov w,tmpx clrb fsr.1 clrb fsr.0 ;x000 mov ind,w ;w -> sin0x_n mov w,tmpx+1 setb fsr.0 ;x001 mov ind,w ;w -> sin0x_n+1 bank Bank0 jmp OutModeEnd1 ;DA out ---------------------------------------- OutMode9 clr tmpx clr tmpx+1 ;No.1 OSC sb nONOFF.0 jmp OUTOSC2 ;No.1 OSC out mov w,#$33 page Page3 call Div8ADD OUTOSC2 sb nONOFF.1 jmp OUTOSC3 ;No.2 OSC out mov w,#$3b page Page3 call Div8ADD OUTOSC3 sb nONOFF.2 jmp OUTOSC4 ;No.3 OSC out mov w,#$53 page Page3 call Div8ADD OUTOSC4 sb nONOFF.3 jmp OUTOSC5 ;No.4 OSC out mov w,#$5b page Page3 call Div8ADD OUTOSC5 sb nONOFF.4 jmp OUTOSC6 ;No.5 OSC out mov w,#$73 page Page3 call Div8ADD OUTOSC6 sb nONOFF.5 jmp OUTOSC7 ;No.6 OSC out mov w,#$7b page Page3 call Div8ADD OUTOSC7 sb nONOFF.6 jmp OUTOSC8 ;No.7 OSC out mov w,#$93 page Page3 call Div8ADD OUTOSC8 sb nONOFF.7 jmp OUTOSCEnd ;No.8 OSC out mov w,#$9b page Page3 call Div8ADD OUTOSCEnd clc mov w,#$ff add tmpx,w mov w,#$7f add tmpx+1,w mov w,tmpx mov rb,w mov w,tmpx+1 mov rc,w clr OutMode jmp OutModeEnd ;リセットエントリー ----------------------------- reset_entry mov w,#0 mov !rb,w mov !rc,w mov w,#%00010000 mov !option,w clr rb clr rc clr OutMode clr RMode clr nMode clr nONOFF clr tmp0 ;無限ループ loop nop nop jmp loop ; page1 ----------------------------------- org 200h Page1 ; 符号付き 16 bit x 16 bit -> 32bit 乗算 ; md16 x mr16 -> upper_prodt(上位16bit),mr16(下位16bit) smul1616 bank Bank0 ; 符号処理 clrb tmpflg1 snb sigmd16 ;if md16 >= 0 then skip call md16n ;if md16 < 0 then md16n snb sigmr16 ;if mr16 >= 0 then skip call mr16n ;if mr16 < 0 then mr16n ; 符号無し16bit x 16bit mul1616 mov w,#17 mov count,w ; シフトする回数を設定 clr upper_prdt ; 乗算結果上位16bitをクリア clr upper_prdt+1 ; clc ; キャリーフラグをクリア ; 以下のルーチンを [count] 回実行 m1616loop rr upper_prdt+1 ; 乗算結果を右回転 rr upper_prdt ; rr mr16+1 ; rr mr16 ; キャリーフラグのチェック sc ; もしキャリーなければ加算をスキップ jmp no_add ; clc ; キャリーフラグのクリア mov w,md16 ; add upper_prdt,w ; 乗算結果上位16bitにmd16を加算 mov w,md16+1 ; add upper_prdt+1,w ; no_add decsz count ; ループ回数のチェック[count] jmp m1616loop ; rl mr16 rl mr16+1 rl upper_prdt rl upper_prdt+1 snb tmpflg1 ;if md16 x mr16 >= 0 then skip call resn ;if md16 x mr16 < 0 then resn retp ; 終了 ;演算結果が負値の場合(md16 x mr16 < 0)に2の補数を計算 resn not upper_prdt not upper_prdt+1 not mr16+1 clc mov w,#$1 add mr16+1,w clr w add upper_prdt,w add upper_prdt+1,w ret ;md16が負値(< 0)の場合に、2の補数を計算し正値に変換 md16n setb tmpflg1 not md16 not md16+1 clc mov w,#1 add md16,w clr w add md16+1,w ret ;mr16が負値(< 0)の場合に、2の補数を計算し正値に変換 mr16n not mr16 not mr16+1 clc mov w,#1 add mr16,w clr w add mr16+1,w ; 演算結果の符号を判定 sb tmpflg1 ;if md16 < 0 then skip jmp mr16n0 ;if md16 >= 0 then mr16n0 clrb tmpflg1 ;if (-) x (-) = (+) then tmpflg1 = 0 ret mr16n0 setb tmpflg1 ;if (+) x (-) = (-) then tmpflg1 = 1 ret ; page3 --------------------------- org 600h Page3 ; 正弦波発生ユニットの初期化 DataInit mov w,tmp2 mov fsr,w setb fsr.1 setb fsr.2 ;x110 note mov w,tmp1 mov ind,w ;noteNo -> note clc ;note No x 4 -> note No rl tmp1 clc rl tmp1 dec fsr ;x101 cosx_n+1 mov M,#$07 mov w,tmp1 iread mov ind,w ;cosx_n+1 inc tmp1 dec fsr ;x100 cosx_n mov M,#$07 mov w,tmp1 iread mov ind,w ;cosx_n inc tmp1 dec fsr ;x011 sin1x_n+1 mov M,#$07 mov w,tmp1 iread mov ind,w ;sin1x_n+1 inc tmp1 dec fsr ;x010 sin1x_n mov M,#$07 mov w,tmp1 iread mov ind,w ;sinlx_n dec fsr ;x001 clr ind ;sin0x_n+1 dec fsr ;x000 clr ind ;sin0x_n bank Bank0 retp ; data / 8 add tmpx ---------------------------- ; 各正弦波発生ユニットの出力を1/8にしてtmpxに加算 ; これで8つの正弦波発生ユニットを加算してもオーバーフローしない Div8ADD mov fsr,w ;x011 mov w,ind mov tmpy+1,w ;sin1x+1 -> tmpy+1 dec fsr ;x010 mov w,ind mov tmpy,w ;sin1x -> tmpy sb tmpy+1.7 ;if data < 0 then skip jmp PDiv8ADD ;if data >=0 then PDiv8ADD ;データが負値(< 0)の場合の1/8処理 setb CaryFlg rr tmpy+1 ;(sin1x)*2 rr tmpy setb CaryFlg rr tmpy+1 ;((sin1x)*2)*2 rr tmpy setb CaryFlg rr tmpy+1 ;(((sin1x)*2)*2)*2 rr tmpy jmp ADDtmpx ;データが正値(>0)の場合の1/8処理 PDiv8ADD clrb CaryFlg rr tmpy+1 ;(sin1x)*2 rr tmpy clrb CaryFlg rr tmpy+1 ;((sin1x)*2)*2 rr tmpy clrb CaryFlg rr tmpy+1 ;(((sin1x)*2)*2)*2 rr tmpy ; tmpxへの加算 ADDtmpx clc mov w,tmpy ;sin1x -> w add tmpx,w ;tmpx + w -> tmpx mov w,tmpy+1 ;sin1x+1 -> w add tmpx+1,w ;tmpx+1 + w + Cary -> tmpx+1 bank Bank0 retp ; Data table ----------------------------------- ; 正弦波発生用初期データ格納テーブル org 700h dw 127 , 149 , 9 , 55 ;D3 146.83238 Hz dw 127 , 137 , 9 , 194 ;D#3 155.56349 Hz dw 127 , 122 , 10 , 87 ;E3 164.81377 Hz dw 127 , 106 , 10 , 244 ;F3 174.61411 Hz dw 127 , 88 , 11 , 154 ;F#3 184.99721 Hz dw 127 , 67 , 12 , 74 ;G3 195.99771 Hz dw 127 , 45 , 13 , 4 ;G#3 207.65234 Hz dw 127 , 19 , 13 , 201 ;A3 220 Hz dw 126 , 246 , 14 , 154 ;A#3 233.08188 Hz dw 126 , 214 , 15 , 119 ;B3 246.94165 Hz dw 126 , 178 , 16 , 97 ;C4 261.62556 Hz dw 126 , 137 , 17 , 89 ;C#4 277.18263 Hz dw 126 , 91 , 18 , 94 ;D4 293.66476 Hz dw 126 , 40 , 19 , 116 ;D#4 311.12698 Hz dw 125 , 238 , 20 , 153 ;E4 329.62755 Hz dw 125 , 174 , 21 , 206 ;F4 349.22823 Hz dw 125 , 102 , 23 , 22 ;F#4 369.99442 Hz dw 125 , 21 , 24 , 112 ;G4 391.99543 Hz dw 124 , 186 , 25 , 222 ;G#4 415.30469 Hz dw 124 , 84 , 27 , 96 ;A4 440 Hz dw 123 , 225 , 28 , 249 ;A#4 466.16376 Hz dw 123 , 97 , 30 , 167 ;B4 493.8833 Hz dw 122 , 209 , 32 , 109 ;C5 523.25113 Hz dw 122 , 48 , 34 , 76 ;C#5 554.36526 Hz dw 121 , 124 , 36 , 69 ;D5 587.32953 Hz dw 120 , 178 , 38 , 88 ;D#5 622.25396 Hz dw 119 , 207 , 40 , 136 ;E5 659.25511 Hz dw 118 , 210 , 42 , 211 ;F5 698.45646 Hz dw 117 , 182 , 45 , 61 ;F#5 739.98884 Hz dw 116 , 121 , 47 , 196 ;G5 783.99087 Hz dw 115 , 22 , 50 , 106 ;G#5 830.60939 Hz dw 113 , 137 , 53 , 48 ;A5 880 Hz dw 111 , 205 , 56 , 21 ;A#5 932.32752 Hz dw 109 , 222 , 59 , 25 ;B5 987.7666 Hz dw 107 , 181 , 62 , 60 ;C6 1046.5022 Hz dw 105 , 76 , 65 , 125 ;C#6 1108.7305 Hz dw 102 , 157 , 68 , 218 ;D6 1174.659 Hz dw 99 , 160 , 72 , 82 ;D#6 1244.5079 Hz dw 96 , 78 , 75 , 225 ;E6 1318.5102 Hz dw 92 , 156 , 79 , 131 ;F6 1396.9129 Hz dw 88 , 132 , 83 , 53 ;F#6 1479.9776 Hz dw 83 , 250 , 86 , 239 ;G6 1567.9817 Hz dw 78 , 246 , 90 , 170 ;G#6 1661.2187 Hz dw 73 , 108 , 94 , 92 ;A6 1760 Hz END