Microsoft Small Basic

Program Listing: LFD762
' Music Composer - Re# So La# Do
' Copyright © 2017 Nonki Takahashi. The MIT License.
' Last update 2017-12-22

GraphicsWindow.Title = "Re# So La# Do"
Not = "False=True;True=False;"
gw = 598
gh = 428
note = "1=5C;2=5C#;3=5D;4=5D#;5=5E;6=5F;7=5F#;8=5G;9=5G#;10=5A;11=5A#;12=5B;13=6C;"
c8 = "1=1;2=3;3=5;4=6;5=8;6=10;7=12;8=13;"
chord = "1=1;2=4;3=8;4=11;5=13;"
GraphicsWindow.Width = gw
GraphicsWindow.Height = gh
r2 = 128
g2 = 128
b2 = 128
p = 0
GraphicsWindow.BackgroundColor = GraphicsWindow.GetColorFromRGB(r2, g2, b2)
kw = 10
kh = 10
y = gh - 110
GraphicsWindow.PenWidth = 0
For i = 1 To 13
If Array.ContainsValue(c8, i) Then
GraphicsWindow.BrushColor = "White"
Else
GraphicsWindow.BrushColor = "Black"
EndIf
key[i] = Shapes.AddEllipse(kw, kh)
Shapes.Move(key[i], (gw - kw) / 2, y - i * 1.5 * kh)
Shapes.SetOpacity(key[i], 20)
EndFor
For j = 2 To 5
i = chord[j]
Play()
EndFor
Shapes.SetOpacity(key[iLast], 20)
Program.Delay(5000)
r = 0
While "True"
For j = 1 To 16
i = chord[Math.GetRandomNumber(5)]
save[j] = i
Play()
Color()
EndFor
keyDown = "False"
For k = 1 To 3
For j = 1 To 16
i = save[j]
Play()
Color()
EndFor
EndFor
EndWhile

Sub Play
Shapes.SetOpacity(key[iLast], 20)
Shapes.SetOpacity(key[i], 80)
Sound.PlayMusic("O" + note[i] + 4)
iLast = i
EndSub

Sub Color
If p = 0 Then
r1 = r2
g1 = g2
b1 = b2
r2 = Math.GetRandomNumber(256) - 1
g2 = Math.GetRandomNumber(256) - 1
b2 = Math.GetRandomNumber(256) - 1
EndIf
r = r1 * ((63 - p) / 63) + r2 * (p / 63)
g = g1 * ((63 - p) / 63) + g2 * (p / 63)
b = b1 * ((63 - p) / 63) + b2 * (p / 63)
GraphicsWindow.BackgroundColor = GraphicsWindow.GetColorFromRGB(r, g, b)
p = p + 1
If 64 <= p Then
p = 0
EndIf
EndSub