forked from CosmosOS/Cosmos
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathKernel.cs
127 lines (119 loc) · 3.61 KB
/
Kernel.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
using System;
using System.Collections.Generic;
using System.Text;
using Sys = Cosmos.System;
using System.Threading;
namespace BeepDemo
{
public class Kernel: Sys.Kernel
{
protected override void BeforeRun()
{
Console.WriteLine("Cosmos booted successfully. Type a line of text to get it echoed back.");
}
protected override void Run()
{
Console.WriteLine("Run 'Mary Had a Little Lamb'? ");
string ans = Console.ReadLine();
if (ans.ToLower() == "y" || ans.ToLower() == "yes")
{
BeepTest.Main();
}
else
{
Console.WriteLine("Default beep:");
Console.Beep();
// Does the follwing: Console.Beep((int)Sys.Notes.Default (800 hertz), (int)Sys.Durations.Default (200 milliseconds) );
}
}
}
class BeepTest
{
public static void Main()
{
// Declare the first few notes of the song, "Mary Had A Little Lamb".
Note[] Mary =
{
new Note(Tone.B, Duration.QUARTER),
new Note(Tone.A, Duration.QUARTER),
new Note(Tone.GbelowC, Duration.QUARTER),
new Note(Tone.A, Duration.QUARTER),
new Note(Tone.B, Duration.QUARTER),
new Note(Tone.B, Duration.QUARTER),
new Note(Tone.B, Duration.HALF),
new Note(Tone.A, Duration.QUARTER),
new Note(Tone.A, Duration.QUARTER),
new Note(Tone.A, Duration.HALF),
new Note(Tone.B, Duration.QUARTER),
new Note(Tone.D, Duration.QUARTER),
new Note(Tone.D, Duration.HALF)
};
// Play the song
Play(Mary);
}
// Play the notes in a song.
protected static void Play(Note[] tune)
{
foreach (Note n in tune)
{
if (n.NoteTone == Tone.REST)
{
Thread.Sleep((int)n.NoteDuration);
}
else
{
Console.Beep((int)n.NoteTone, (int)n.NoteDuration);
}
}
}
// Define the frequencies of notes in an octave, as well as
// silence (rest).
protected enum Tone
{
REST = 0,
GbelowC = 196,
A = 220,
Asharp = 233,
B = 247,
C = 262,
Csharp = 277,
D = 294,
Dsharp = 311,
E = 330,
F = 349,
Fsharp = 370,
G = 392,
Gsharp = 415,
}
// Define the duration of a note in units of milliseconds.
protected enum Duration
{
WHOLE = 1600,
HALF = WHOLE / 2,
QUARTER = HALF / 2,
EIGHTH = QUARTER / 2,
SIXTEENTH = EIGHTH / 2,
}
// Define a note as a frequency (tone) and the amount of
// time (duration) the note plays.
protected struct Note
{
Tone toneVal;
Duration durVal;
// Define a constructor to create a specific note.
public Note(Tone frequency, Duration time)
{
toneVal = frequency;
durVal = time;
}
// Define properties to return the note's tone and duration.
public Tone NoteTone { get { return toneVal; } }
public Duration NoteDuration { get { return durVal; } }
}
}
/*
This example produces the following results:
This example plays the first few notes of "Mary Had A Little Lamb"
through the computer PC Speaker.
*/
}