周波数の表から 音階へ変換したい

マクロの作成、スクリプトの作成、APIの使い方
返信する
apollo21
記事: 1
登録日時: 4月 1, 2009, 2:20 pm

周波数の表から 音階へ変換したい

投稿記事 by apollo21 »

普通 ピアノの中心は A=440 の C4です。 音階には基準音があり A4=440Hzとすることが多ですが、415,430,440,442,444等も使われます。
今回 A=440Hzのクロマチック周波数の表を作りました。 
此に音階名を付けるマクロを作りたいのですが、表とマクロの関連づけの作法が判りません。

音階名は CDEFGABと有り、全部で8音階を表し、次の音階列は半分か倍になって、8ですから1オクターブ下や上と表します。
8音階には、半音階と全音階があります。
(この使い方をダイアトニックと言います)8音階を使わず5音階の(ペンタトニック)もあります。
全音階は半音が有り、ずらせて上に「#」下に「♭」で表します。
此を表すと C、C#、D、D#、E、F、F#、G、G#、A、A#、B、 の12音階で一巡し 次の音階に繋がり下は番号が減り、上は番号が増えます。
(全ての半音階を使うのをクロマチックと言います) C#4-Db4 は書き方が違うだけで 同じ音階です。

周波数と音階名の例
246.94 261.63 277.13 293.66 311.13 329.63 349.23 369.99 392 415.3 440 466.16 493.77 523.25 Hz
B3 C4 C#4-Db4 D4 D#4-Eb4 E4 F4 F#4-Gb4 G4 G#4-Ab4 A4 A#4-Bb4 B4 C5

ツール-マクロ-マクロの管理-dpenoffice-basic で貼り付けました。
此の.odsのマクロを調べますと、次のようなんですが、実行するとシンタックスエラーになります。
また周波数との連結の仕方が判っていません。
また。xlsとでは違うのかも判っていません。
それではよろしくお願いします。
かしこ

Sub 周波数変換()
C0 = 16.35
hz = ActiveCell.Value
allcent = Format(1200 * Log(hz / C0) / Log(2), "0")
octave = Int((allcent + 50) / 1200)
octavecent = allcent Mod 1200
noterate = octavecent / 100

note = Format(noterate, "0")
cent = Format((noterate - note) * 100, "0")
Select Case note
Case 0
notename = "C"
Case 1
notename = "C#"
Case 2
notename = "D"
Case 3
notename = "D#"
Case 4
notename = "E"
Case 5
notename = "F"
Case 6
notename = "F#"
Case 7
notename = "G"
Case 8
notename = "G#"
Case 9
notename = "A"
Case 10
notename = "A#"
Case 11
notename = "B"
Case 12
notename = "C"
End Select

ActiveCell.Offset(0, 1).Value = allcent
ActiveCell.Offset(0, 2).Value = notename & octave & " " & cent

End Sub

Sub 音程変換()
inputnote = ActiveCell.Value

sharpno = InStr(inputnote, "#")
If sharpno = 0 Then
notename = Left(inputnote, 1)
Else
notename = Left(inputnote, 2)
End If

Select Case notename
Case "C"
notecent = 0
Case "C#"
notecent = 100
Case "D"
notecent = 200
Case "D#"
notecent = 300
Case "E"
notecent = 400
Case "F"
notecent = 500
Case "F#"
notecent = 600
Case "G"
notecent = 700
Case "G#"
notecent = 800
Case "A"
notecent = 900
Case "A#"
notecent = 1000
Case "B"
notecent = 1100
End Select

spaceno = InStr(inputnote, " ")
octave = Mid(inputnote, spaceno - 1, 1)
cent = Mid(inputnote, spaceno + 1)

octavecent = octave * 1200
allcent = octavecent + notecent + cent
ActiveCell.Offset(0, 1).Value = allcent

hz = Format(16.35 * Exp(allcent * Log(2) / 1200), "0.0")
ActiveCell.Offset(0, 2).Value = hz

End Sub
返信する

“マクロと UNO API”に戻る