Microsoft Small Basic

Program Listing: FQH921-0
' Musical Score 0.2b
' Copyright © 2014-2016 Nonki Takahashi. The MIT License.
'
' History:
' 0.2 2016-03-19 Rewrote to use png images. (FQH921-0)
' 0.1 2014-01-06 Created. (FQH921)
'
GraphicsWindow.Title = "Musical Score 0.2b"
Form()
mml = "O4E4O4G4O4B4O5D4O5F1O4F2O4A2O5C2O5E2"
DrawAndPlay()
Sub Form
gw = 598
gh = 428
GraphicsWindow.Width = gw
GraphicsWindow.Height = gh
folder = "http://www.nonkit.com/smallbasic.files/"
x = gw - 10
For y = 40 To 120 Step 20
GraphicsWindow.DrawLine(10, y, x, y)
EndFor
For x = gw / 2 + 37 To gw - 10 Step gw / 2 - 47
GraphicsWindow.DrawLine(x, 40, x, 120)
EndFor
fname = folder + "GClef.png"
GraphicsWindow.DrawImage(fname, 10, 15)
x = gw - 10
For y = 240 To 320 Step 20
GraphicsWindow.DrawLine(10, y, x, y)
EndFor
For x = gw / 2 + 37 To gw - 10 Step gw / 2 - 47
GraphicsWindow.DrawLine(x, 240, x, 320)
EndFor
GraphicsWindow.DrawLine(x - 6, 240, x - 6, 320)
GraphicsWindow.DrawLine(x - 2, 240, x - 2, 320)
GraphicsWindow.DrawImage(fname, 10, 215)
EndSub
Sub DrawAndPlay
whole = folder + "WholeNote.png"
half = folder + "HalfNote.png"
quoter = folder + "QuoterNote.png"
GraphicsWindow.FontName = "Times New Roman"
GraphicsWindow.FontSize = 30
GraphicsWindow.BrushColor = "Black"
len = Text.GetLength(mml)
p = 1
x = 100
yc = 131
While p < len
GetNote()
yp = (Text.GetIndexOf("CDEFGAB", n) - 1 + (o - 4) * 7) * 10
GraphicsWindow.DrawText(x, yc + 30, n)
If l = 4 Then
GraphicsWindow.DrawImage(quoter, x, yc - yp)
If 60 <= yp Then
GraphicsWindow.DrawLine(x + 1, yc - yp + 13, x + 1, yc - yp + 80)
Else
GraphicsWindow.DrawLine(x + 21, yc - yp + 5, x + 21, yc - yp - 60)
EndIf
x = x + 64
ElseIf l = 2 Then
GraphicsWindow.DrawImage(half, x, yc - yp)
If 60 <= yp Then
GraphicsWindow.DrawLine(x + 1, yc - yp + 13, x + 1, yc - yp + 80)
Else
GraphicsWindow.DrawLine(x + 21, yc - yp + 5, x + 21, yc - yp - 60)
EndIf
x = x + 128
ElseIf l = 1 Then
GraphicsWindow.DrawImage(whole, x, yc - yp)
x = x + 256
EndIf
If 512 < x Then
x = x - 512
yc = yc + 200
EndIf
EndWhile
Sound.PlayMusic(mml)
EndSub
Sub GetNote
' param p - pointer to MML
' param mml - MML
' return o - octave
' return n - note
' return l - length
If Text.GetSubText(mml, p, 1) = "O" Then
p = p + 1
GetNum()
o = num
EndIf
If Text.IsSubText("CDEFGAB", Text.GetSubText(mml, p, 1)) Then
n = Text.GetSubText(mml, p, 1)
p = p + 1
EndIf
GetNum()
l = num
EndSub
Sub GetNum
' param p - pointer to MML
' param mml - MML
' return num - number
num = ""
While Text.IsSubText("0123456789", Text.GetSubText(mml, p, 1))
num = Text.Append(num, Text.GetSubText(mml, p, 1))
p = p + 1
EndWhile
EndSub