3 // There are 12 half-tones in an octave, and the frequency doubles in an octave.
5 define Do_ = 1.0594630943592952645618252949463; // The root 12 of 2.
12 define Sol_ = Sol*Do_;
17 class MainWindow : Window
19 text = "A keyboard piano";
21 borderStyle = sizable;
28 Sound ding { "ding.wav" };
29 Sound chord { "chord.wav" };
36 mixer.systemHandle = systemHandle;
45 bool OnKeyDown(Key key, unichar ch)
49 case f1: instrument = ding; break;
50 case f2: instrument = chord; break;
52 // The regular octave on the zxcvbn row, sharps above (asdf)
53 case z: mixer.Play(instrument, 1.0, -1, Do); break;
54 case x: mixer.Play(instrument, 1.0, -.8, Re); break;
55 case c: mixer.Play(instrument, 1.0, -.6, Mi); break;
56 case v: mixer.Play(instrument, 1.0, -.4, Fa); break;
57 case b: mixer.Play(instrument, 1.0, -.2, Sol); break;
58 case n: mixer.Play(instrument, 1.0, 0, La); break;
59 case m: mixer.Play(instrument, 1.0, .2, Si); break;
60 case comma: mixer.Play(instrument, 1.0, .4, Do*2); break;
61 case period:mixer.Play(instrument, 1.0, .6, Re*2); break;
62 case slash: mixer.Play(instrument, 1.0, .8, Mi*2); break;
63 case s: mixer.Play(instrument, 1.0, -.9, Do_); break;
64 case d: mixer.Play(instrument, 1.0, -.7, Re_); break;
65 case g: mixer.Play(instrument, 1.0, -.3, Fa_); break;
66 case h: mixer.Play(instrument, 1.0, -.1, Sol_); break;
67 case j: mixer.Play(instrument, 1.0, .1, La_); break;
68 case l: mixer.Play(instrument, 1.0, .5, Do_*2); break;
69 case colon: mixer.Play(instrument, 1.0, .7, Re_*2); break;
71 // The lower octave on the qwerty row, sharps above (digits)
72 case q: mixer.Play(instrument, 1.0, 0, Do/2); break;
73 case w: mixer.Play(instrument, 1.0, 0, Re/2); break;
74 case e: mixer.Play(instrument, 1.0, 0, Mi/2); break;
75 case r: mixer.Play(instrument, 1.0, 0, Fa/2); break;
76 case t: mixer.Play(instrument, 1.0, 0, Sol/2); break;
77 case y: mixer.Play(instrument, 1.0, 0, La/2); break;
78 case u: mixer.Play(instrument, 1.0, 0, Si/2); break;
79 case i: mixer.Play(instrument, 1.0, 0, Do); break;
80 case o: mixer.Play(instrument, 1.0, 0, Re); break;
81 case p: mixer.Play(instrument, 1.0, 0, Mi); break;
82 case k2: mixer.Play(instrument, 1.0, 0, Do_/2); break;
83 case k3: mixer.Play(instrument, 1.0, 0, Re_/2); break;
84 case k5: mixer.Play(instrument, 1.0, 0, Fa_/2); break;
85 case k6: mixer.Play(instrument, 1.0, 0, Sol_/2); break;
86 case k7: mixer.Play(instrument, 1.0, 0, La_/2); break;
87 case k9: mixer.Play(instrument, 1.0, 0, Do_); break;
88 case k0: mixer.Play(instrument, 1.0, 0, Re_); break;
94 MainWindow mainWindow { };