admin commited on
Commit
893621a
·
1 Parent(s): 9ac82f2
Files changed (45) hide show
  1. .gitattributes +10 -11
  2. README.md +1 -1
  3. css/style.css +31 -0
  4. index.html +255 -18
  5. js/calculator.js +387 -0
  6. src/+42.png +0 -0
  7. src/+6+43.png +0 -0
  8. src/+64.png +0 -0
  9. src/+643.png +0 -0
  10. src/+65.png +0 -0
  11. src/+6b5.png +0 -0
  12. src/2+.png +0 -0
  13. src/4+2.png +0 -0
  14. src/4+b3.png +0 -0
  15. src/42.png +0 -0
  16. src/43.png +0 -0
  17. src/4b.png +0 -0
  18. src/4b3.png +0 -0
  19. src/5+.png +0 -0
  20. src/5+3.png +0 -0
  21. src/53.png +0 -0
  22. src/54.png +0 -0
  23. src/6+43.png +0 -0
  24. src/64.png +0 -0
  25. src/642.png +0 -0
  26. src/643.png +0 -0
  27. src/65+.png +0 -0
  28. src/65+3.png +0 -0
  29. src/65.png +0 -0
  30. src/65b.png +0 -0
  31. src/65b3.png +0 -0
  32. src/6slash.png +0 -0
  33. src/6slash4.png +0 -0
  34. src/6slash5.png +0 -0
  35. src/6slashb5.png +0 -0
  36. src/7+.png +0 -0
  37. src/7+3.png +0 -0
  38. src/73.png +0 -0
  39. src/74.png +0 -0
  40. src/742.png +0 -0
  41. src/743.png +0 -0
  42. src/754.png +0 -0
  43. src/84.png +0 -0
  44. src/853.png +0 -0
  45. style.css +0 -28
.gitattributes CHANGED
@@ -1,35 +1,34 @@
1
  *.7z filter=lfs diff=lfs merge=lfs -text
2
  *.arrow filter=lfs diff=lfs merge=lfs -text
3
  *.bin filter=lfs diff=lfs merge=lfs -text
 
4
  *.bz2 filter=lfs diff=lfs merge=lfs -text
5
- *.ckpt filter=lfs diff=lfs merge=lfs -text
6
  *.ftz filter=lfs diff=lfs merge=lfs -text
7
  *.gz filter=lfs diff=lfs merge=lfs -text
8
  *.h5 filter=lfs diff=lfs merge=lfs -text
9
  *.joblib filter=lfs diff=lfs merge=lfs -text
10
  *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
- *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
  *.model filter=lfs diff=lfs merge=lfs -text
13
  *.msgpack filter=lfs diff=lfs merge=lfs -text
14
- *.npy filter=lfs diff=lfs merge=lfs -text
15
- *.npz filter=lfs diff=lfs merge=lfs -text
16
  *.onnx filter=lfs diff=lfs merge=lfs -text
17
  *.ot filter=lfs diff=lfs merge=lfs -text
18
  *.parquet filter=lfs diff=lfs merge=lfs -text
19
  *.pb filter=lfs diff=lfs merge=lfs -text
20
- *.pickle filter=lfs diff=lfs merge=lfs -text
21
- *.pkl filter=lfs diff=lfs merge=lfs -text
22
  *.pt filter=lfs diff=lfs merge=lfs -text
23
  *.pth filter=lfs diff=lfs merge=lfs -text
24
  *.rar filter=lfs diff=lfs merge=lfs -text
25
- *.safetensors filter=lfs diff=lfs merge=lfs -text
26
  saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
  *.tar.* filter=lfs diff=lfs merge=lfs -text
28
- *.tar filter=lfs diff=lfs merge=lfs -text
29
  *.tflite filter=lfs diff=lfs merge=lfs -text
30
  *.tgz filter=lfs diff=lfs merge=lfs -text
31
- *.wasm filter=lfs diff=lfs merge=lfs -text
32
  *.xz filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
- *.zst filter=lfs diff=lfs merge=lfs -text
35
- *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
1
  *.7z filter=lfs diff=lfs merge=lfs -text
2
  *.arrow filter=lfs diff=lfs merge=lfs -text
3
  *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bin.* filter=lfs diff=lfs merge=lfs -text
5
  *.bz2 filter=lfs diff=lfs merge=lfs -text
 
6
  *.ftz filter=lfs diff=lfs merge=lfs -text
7
  *.gz filter=lfs diff=lfs merge=lfs -text
8
  *.h5 filter=lfs diff=lfs merge=lfs -text
9
  *.joblib filter=lfs diff=lfs merge=lfs -text
10
  *.lfs.* filter=lfs diff=lfs merge=lfs -text
 
11
  *.model filter=lfs diff=lfs merge=lfs -text
12
  *.msgpack filter=lfs diff=lfs merge=lfs -text
 
 
13
  *.onnx filter=lfs diff=lfs merge=lfs -text
14
  *.ot filter=lfs diff=lfs merge=lfs -text
15
  *.parquet filter=lfs diff=lfs merge=lfs -text
16
  *.pb filter=lfs diff=lfs merge=lfs -text
 
 
17
  *.pt filter=lfs diff=lfs merge=lfs -text
18
  *.pth filter=lfs diff=lfs merge=lfs -text
19
  *.rar filter=lfs diff=lfs merge=lfs -text
 
20
  saved_model/**/* filter=lfs diff=lfs merge=lfs -text
21
  *.tar.* filter=lfs diff=lfs merge=lfs -text
 
22
  *.tflite filter=lfs diff=lfs merge=lfs -text
23
  *.tgz filter=lfs diff=lfs merge=lfs -text
 
24
  *.xz filter=lfs diff=lfs merge=lfs -text
25
  *.zip filter=lfs diff=lfs merge=lfs -text
26
+ *.zstandard filter=lfs diff=lfs merge=lfs -text
27
+ *.tfevents* filter=lfs diff=lfs merge=lfs -text
28
+ *.db* filter=lfs diff=lfs merge=lfs -text
29
+ *.ark* filter=lfs diff=lfs merge=lfs -text
30
+ **/*ckpt*data* filter=lfs diff=lfs merge=lfs -text
31
+ **/*ckpt*.meta filter=lfs diff=lfs merge=lfs -text
32
+ **/*ckpt*.index filter=lfs diff=lfs merge=lfs -text
33
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
34
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
README.md CHANGED
@@ -1,6 +1,6 @@
1
  ---
2
  title: Figured Bass Calculator
3
- emoji: 👁
4
  colorFrom: red
5
  colorTo: red
6
  sdk: static
 
1
  ---
2
  title: Figured Bass Calculator
3
+ emoji: 🎵🖥️
4
  colorFrom: red
5
  colorTo: red
6
  sdk: static
css/style.css ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ table {
2
+ border-collapse: collapse;
3
+ }
4
+
5
+ #chord {
6
+ margin: 0 auto;
7
+ display: block;
8
+ }
9
+
10
+ a {
11
+ text-decoration: none;
12
+ display: block;
13
+ float: right;
14
+ }
15
+
16
+ #demo {
17
+ display: contents;
18
+ }
19
+
20
+ select {
21
+ width: 100%;
22
+ }
23
+
24
+ video {
25
+ width: 480px;
26
+ aspect-ratio: 16/9;
27
+ }
28
+
29
+ #maintab {
30
+ margin: 0 auto;
31
+ }
index.html CHANGED
@@ -1,19 +1,256 @@
1
- <!doctype html>
2
  <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
19
- </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
  <html>
3
+
4
+ <head>
5
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
6
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
7
+ <meta name="robots" content="index, follow">
8
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
9
+ <script type="text/javascript" src="./js/calculator.js"></script>
10
+ <link rel="stylesheet" href="./css/style.css">
11
+ </head>
12
+
13
+ <body style="background: white;">
14
+ <table border="1" id="maintab">
15
+ <tbody>
16
+ <tr>
17
+ <td>教程 (Tutorial)</td>
18
+ <td>
19
+ <video
20
+ src="https://www.modelscope.cn/studio/Genius-Society/figured_bass_calculator/resolve/master/src/demo.mp4"
21
+ controls muted loop autoplay></video>
22
+ </td>
23
+ </tr>
24
+ <tr>
25
+ <td class="col-1"><label for="key">中心音 (Key)</label></td>
26
+ <td class="col-2">
27
+ <select id="key">
28
+ <option value="Cb">C♭</option>
29
+ <option value="Gb">G♭</option>
30
+ <option value="Db">D♭</option>
31
+ <option value="Ab">A♭</option>
32
+ <option value="Eb">E♭</option>
33
+ <option value="Bb">B♭</option>
34
+ <option value="F">F</option>
35
+ <option value="C" selected="selected">C</option>
36
+ <option value="G">G</option>
37
+ <option value="D">D</option>
38
+ <option value="A">A</option>
39
+ <option value="E">E</option>
40
+ <option value="B">B</option>
41
+ <option value="F#">F♯</option>
42
+ <option value="C#">C♯</option>
43
+ </select>
44
+ </td>
45
+ </tr>
46
+ <tr>
47
+ <td><label for="key">大小调 (Mode)</label></td>
48
+ <td>
49
+ <select id="mode" onchange="change_mode()">
50
+ <option value="Major" selected="selected">大调 (Major)</option>
51
+ <option value="Minor">小调 (Minor)</option>
52
+ </select>
53
+ </td>
54
+ </tr>
55
+ <tr>
56
+ <td><label for="bassNote">低音 (Bass Note)</label></td>
57
+ <td>
58
+ <select id="bassNote">
59
+ <option value="C" selected="selected">C</option>
60
+ <option value="D">D</option>
61
+ <option value="E">E</option>
62
+ <option value="F">F</option>
63
+ <option value="G">G</option>
64
+ <option value="A">A</option>
65
+ <option value="B">B</option>
66
+ </select>
67
+ </td>
68
+ </tr>
69
+ <tr>
70
+ <td><label for="accidental">变音记号 (Accidental)</label></td>
71
+ <td>
72
+ <select id="accidental">
73
+ <option value="bb">♭♭</option>
74
+ <option value="b">♭</option>
75
+ <option value="" selected="selected">&nbsp;</option>
76
+ <option value="n">♮</option>
77
+ <option value="#">♯</option>
78
+ <option value="##">♯♯</option>
79
+ </select>
80
+ </td>
81
+ </tr>
82
+ <tr>
83
+ <td><label for="figures">数字 Figure(s)</label></td>
84
+ <td>
85
+ <span class="dropdown">
86
+ <span class="dropdown-content" id="dropdown">
87
+ <table border="1">
88
+ <tbody>
89
+ <tr>
90
+ <td><input type="radio" name="figures" class="figure" value="noFigure" id="noFigure"
91
+ checked="checked" onclick="close_dropdown()"><label for="noFigure">无数字 (No figure)</label>
92
+ </td>
93
+ <td><input type="radio" name="figures" class="figure" value="0" id="0"
94
+ onclick="close_dropdown()"><label for="0">Tasto solo</label></td>
95
+ <td><input type="radio" name="figures" class="figure" value="42" id="2"
96
+ onclick="close_dropdown()"><label for="2">2</label></td>
97
+ <td><input type="radio" name="figures" class="figure" value="4#2" id="4#2"
98
+ onclick="close_dropdown()"><label for="4#2">♯2 or <img class="single-figure" src="./src/2+.png"
99
+ height="15" valign="middle" alt="2+"></label></td>
100
+ <td><input type="radio" name="figures" class="figure" value="3" id="3"
101
+ onclick="close_dropdown()"><label for="3">3</label></td>
102
+ </tr>
103
+ <tr>
104
+ <td><input type="radio" name="figures" class="figure" value="#" id="#"
105
+ onclick="close_dropdown()"><label for="#">♯ or ♯3</label></td>
106
+ <td><input type="radio" name="figures" class="figure" value="b" id="b"
107
+ onclick="close_dropdown()"><label for="b">♭ or ♭3</label></td>
108
+ <td><input type="radio" name="figures" class="figure" value="n" id="n"
109
+ onclick="close_dropdown()"><label for="n">♮ or ♮3</label></td>
110
+ <td><input type="radio" name="figures" class="figure" value="4" id="4"
111
+ onclick="close_dropdown()"><label for="4">4 or <img class="double-figure" src="./src/54.png"
112
+ height="20" valign="middle" alt="54"></label></td>
113
+ <td><input type="radio" name="figures" class="figure" value="4b3" id="4b3"
114
+ onclick="close_dropdown()"><label for="4b3"><img class="double-figure" src="./src/4b.png"
115
+ height="20" valign="middle" alt="4b"> or <img class="double-figure" src="./src/4b3.png"
116
+ height="20" valign="middle" alt="4b3"></label></td>
117
+ </tr>
118
+ <tr>
119
+ <td><input type="radio" name="figures" class="figure" value="#4b3" id="#4b3"
120
+ onclick="close_dropdown()"><label for="#4b3"><img class="double-figure" src="./src/4+b3.png"
121
+ height="20" valign="middle" alt="#4b3"></label></td>
122
+ <td><input type="radio" name="figures" class="figure" value="42" id="42"
123
+ onclick="close_dropdown()"><label for="42"><img class="double-figure" src="./src/42.png"
124
+ height="20" valign="middle" alt="42"></label></td>
125
+ <td><input type="radio" name="figures" class="figure" value="#42" id="#42"
126
+ onclick="close_dropdown()"><label for="#42"><img class="double-figure" src="./src/4+2.png"
127
+ height="20" valign="middle" alt="4+2"> or <img class="double-figure" src="./src/+42.png"
128
+ height="20" valign="middle" alt="#42"></label></td>
129
+ <td><input type="radio" name="figures" class="figure" value="43" id="43"
130
+ onclick="close_dropdown()"><label for="43"><img class="double-figure" src="./src/43.png"
131
+ height="20" valign="middle" alt="43"></label></td>
132
+ <td><input type="radio" name="figures" class="figure" value="5" id="5"
133
+ onclick="close_dropdown()"><label for="5">5</label></td>
134
+ </tr>
135
+ <tr>
136
+ <td><input type="radio" name="figures" class="figure" value="#5" id="#5"
137
+ onclick="close_dropdown()"><label for="#5">♯5</label></td>
138
+ <td><input type="radio" name="figures" class="figure" value="b5" id="b5"
139
+ onclick="close_dropdown()"><label for="b5">♭5</label></td>
140
+ <td><input type="radio" name="figures" class="figure" value="53" id="53"
141
+ onclick="close_dropdown()"><label for="53"><img class="double-figure" src="./src/53.png"
142
+ height="20" valign="middle" alt="53"></label></td>
143
+ <td><input type="radio" name="figures" class="figure" value="5#3" id="5#3"
144
+ onclick="close_dropdown()"><label for="5#3"><img class="double-figure" src="./src/5+3.png"
145
+ height="20" valign="middle" alt="5#3"> or <img class="double-figure" src="./src/5+.png"
146
+ height="20" valign="middle" alt="5#"></label></td>
147
+ <td><input type="radio" name="figures" class="figure" value="6" id="6"
148
+ onclick="close_dropdown()"><label for="6">6</label></td>
149
+ </tr>
150
+ <tr>
151
+ <td><input type="radio" name="figures" class="figure" value="#6" id="#6"
152
+ onclick="close_dropdown()"><label for="#6"><img class="single-figure" src="./src/6slash.png"
153
+ height="18" valign="middle" alt="6\"> or ♯6</label></td>
154
+ <td><input type="radio" name="figures" class="figure" value="b6" id="b6"
155
+ onclick="close_dropdown()"><label for="b6">♭6</label></td>
156
+ <td><input type="radio" name="figures" class="figure" value="64" id="64"
157
+ onclick="close_dropdown()"><label for="64"><img class="double-figure" src="./src/64.png"
158
+ height="20" valign="middle" alt="64"></label></td>
159
+ <td><input type="radio" name="figures" class="figure" value="#64" id="#64"
160
+ onclick="close_dropdown()"><label for="#64"><img class="double-figure" src="./src/6slash4.png"
161
+ height="20" valign="middle" alt="6\4"> or <img class="double-figure" src="./src/+64.png"
162
+ height="20" valign="middle" alt="#64"></label>
163
+ </td>
164
+ <td><input type="radio" name="figures" class="figure" value="642" id="642"
165
+ onclick="close_dropdown()"><label for="642"><img src="./src/642.png" height="28" valign="middle"
166
+ alt="642"></label></td>
167
+ </tr>
168
+ <tr>
169
+ <td><input type="radio" name="figures" class="figure" value="643" id="643"
170
+ onclick="close_dropdown()"><label for="643"><img src="./src/643.png" height="28" valign="middle"
171
+ alt="643"></label></td>
172
+ <td><input type="radio" name="figures" class="figure" value="#643" id="#643"
173
+ onclick="close_dropdown()"><label for="#643"><img src="./src/+643.png" height="28"
174
+ valign="middle" alt="#643"></label></td>
175
+ <td><input type="radio" name="figures" class="figure" value="#6#43" id="#6#43"
176
+ onclick="close_dropdown()"><label for="#6#43"><img src="./src/+6+43.png" height="28"
177
+ valign="middle" alt="#6#43"></label></td>
178
+ <td><input type="radio" name="figures" class="figure" value="6#43" id="6#43"
179
+ onclick="close_dropdown()"><label for="6#43"><img src="./src/6+43.png" height="28"
180
+ valign="middle" alt="6#43"></label></td>
181
+ <td><input type="radio" name="figures" class="figure" value="65" id="65"
182
+ onclick="close_dropdown()"><label for="65"><img class="double-figure" src="./src/65.png"
183
+ height="20" valign="middle" alt="65"></label></td>
184
+ </tr>
185
+ <tr>
186
+ <td><input type="radio" name="figures" class="figure" value="65#3" id="65#3"
187
+ onclick="close_dropdown()"><label for="65#3"><img src="./src/65+.png" height="28"
188
+ valign="middle" alt="65#"> or <img src="./src/65+3.png" height="28" valign="middle"
189
+ alt="65#3"></label></td>
190
+ <td><input type="radio" name="figures" class="figure" value="65b3" id="65b3"
191
+ onclick="close_dropdown()"><label for="65b3"><img src="./src/65b.png" height="28"
192
+ valign="middle" alt="65b"> or <img src="./src/65b3.png" height="28" valign="middle"
193
+ alt="65b3"></label></td>
194
+ <td><input type="radio" name="figures" class="figure" value="#65" id="#65"
195
+ onclick="close_dropdown()"><label for="#65"><img class="double-figure" src="./src/6slash5.png"
196
+ height="21" valign="middle" alt="6\5"> or <img class="double-figure" src="./src/+65.png"
197
+ height="20" valign="middle" alt="#65"></label>
198
+ </td>
199
+ <td><input type="radio" name="figures" class="figure" value="#6b5" id="#6b5"
200
+ onclick="close_dropdown()"><label for="#6b5"><img class="double-figure" src="./src/6slashb5.png"
201
+ height="21" valign="middle" alt="6\b5"> or <img class="double-figure" src="./src/+6b5.png"
202
+ height="20" valign="middle" alt="#6b5"></label>
203
+ </td>
204
+ <td><input type="radio" name="figures" class="figure" value="7" id="7"
205
+ onclick="close_dropdown()"><label for="7">7</label></td>
206
+ </tr>
207
+ <tr>
208
+ <td><input type="radio" name="figures" class="figure" value="b7" id="b7"
209
+ onclick="close_dropdown()"><label for="b7">♭7</label></td>
210
+ <td><input type="radio" name="figures" class="figure" value="73" id="73"
211
+ onclick="close_dropdown()"><label for="73"><img class="double-figure" src="./src/73.png"
212
+ height="20" valign="middle" alt="73"></label></td>
213
+ <td><input type="radio" name="figures" class="figure" value="7#3" id="7#3"
214
+ onclick="close_dropdown()"><label for="7#3"><img class="double-figure" src="./src/7+.png"
215
+ height="20" valign="middle" alt="7#"> or <img class="double-figure" src="./src/7+3.png"
216
+ height="20" valign="middle" alt="7#3"></label></td>
217
+ <td><input type="radio" name="figures" class="figure" value="742" id="742"
218
+ onclick="close_dropdown()"><label for="742"><img src="./src/742.png" height="28" valign="middle"
219
+ alt="742"></label></td>
220
+ <td><input type="radio" name="figures" class="figure" value="743" id="743"
221
+ onclick="close_dropdown()"><label for="743"><img src="./src/743.png" height="28" valign="middle"
222
+ alt="743"></label></td>
223
+ </tr>
224
+ <tr>
225
+ <td><input type="radio" name="figures" class="figure" value="754" id="754"
226
+ onclick="close_dropdown()"><label for="754"><img class="double-figure" src="./src/74.png"
227
+ height="20" valign="middle" alt="74"> or <img src="./src/754.png" height="28" valign="middle"
228
+ alt="754"></label></td>
229
+ <td><input type="radio" name="figures" class="figure" value="8" id="8"
230
+ onclick="close_dropdown()"><label for="8">8</label></td>
231
+ <td><input type="radio" name="figures" class="figure" value="84" id="84"
232
+ onclick="close_dropdown()"><label for="84"><img class="double-figure" src="./src/84.png"
233
+ height="20" valign="middle" alt="84"></label></td>
234
+ <td><input type="radio" name="figures" class="figure" value="853" id="853"
235
+ onclick="close_dropdown()"><label for="853"><img src="./src/853.png" height="28" valign="middle"
236
+ alt="853"></label></td>
237
+ <td><input type="radio" name="figures" class="figure" value="953" id="9"
238
+ onclick="close_dropdown()"><label for="9">9</label></td>
239
+ </tr>
240
+ </tbody>
241
+ </table>
242
+ </span>
243
+ </span>
244
+ </td>
245
+ </tr>
246
+ <tr>
247
+ <td><input id="chord" type="button" onclick="show_notes_to_play()" value="计算应该演奏的和弦"></td>
248
+ <td>
249
+ <div id="demo">Show chord to play</div>
250
+ </td>
251
+ </tr>
252
+ </tbody>
253
+ </table>
254
+ </body>
255
+
256
+ </html>
js/calculator.js ADDED
@@ -0,0 +1,387 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ var line_of_fifths = [
2
+ "F\u266D",
3
+ "C\u266D",
4
+ "G\u266D",
5
+ "D\u266D",
6
+ "A\u266D",
7
+ "E\u266D",
8
+ "B\u266D",
9
+ "F",
10
+ "C",
11
+ "G",
12
+ "D",
13
+ "A",
14
+ "E",
15
+ "B",
16
+ "F\u266F",
17
+ "C\u266F",
18
+ "G\u266F",
19
+ "D\u266F",
20
+ "A\u266F",
21
+ "E\u266F",
22
+ "B\u266F",
23
+ ];
24
+
25
+ function show_notes_to_play() {
26
+
27
+ var keyNoteElement = document.getElementById("key");
28
+ var keyModeElement = document.getElementById("mode");
29
+ var bassNoteElement = document.getElementById("bassNote");
30
+ var bassNote = bassNoteElement.options[bassNoteElement.selectedIndex].value;
31
+ var keyNote = keyNoteElement.options[keyNoteElement.selectedIndex].text;
32
+ var keyMode = keyModeElement.options[keyModeElement.selectedIndex].text;
33
+ var scale = get_scale(keyNote, keyMode);
34
+ var bassAccidentalElement = document.getElementById("accidental");
35
+ var bassAccidental = bassAccidentalElement.options[bassAccidentalElement.selectedIndex].text;
36
+ if (bassAccidental == "\u00A0") {
37
+ if (!scale.includes(bassNote)) {
38
+ var index = scale.findIndex(note => note.startsWith(bassNote));
39
+ bassNote = scale[index];
40
+ }
41
+ }
42
+ bassNote += bassAccidental;
43
+ getIntervalAboveWithinKey(scale, bassNote, 5, 1);
44
+
45
+ var figures = document.querySelector('input[name="figures"]:checked').value;
46
+ var notes = realizeFigures(scale, bassNote.trim(), figures);
47
+ var bSorted = -1;
48
+ notes.sort();
49
+ for (i = 0; bSorted != 1; i++) {
50
+ if (notes[i] != null && compare(notes[i], bassNote) == -1)
51
+ notes = mutableRotateLeft(notes);
52
+ else
53
+ bSorted = 1;
54
+ }
55
+ document.getElementById("demo").innerHTML = bassNote.trim() + "," + notes; // "Bass note: "+bassNote+"<br/>Notes to play above bass note: "+notes;
56
+ notes.length = 0;
57
+
58
+ }
59
+
60
+ function compare(a, b) {
61
+ if (a < b)
62
+ return -1;
63
+ else if (a > b)
64
+ return 1;
65
+ else
66
+ return 0;
67
+ }
68
+
69
+ function mutableRotateLeft(arr) {
70
+ arr.push(arr.shift());
71
+ return arr;
72
+ }
73
+
74
+ function get_scale(keyNote, keyMode) {
75
+ var scale = [];
76
+ var keyNoteIndex = line_of_fifths.indexOf(keyNote);
77
+
78
+ if (keyMode == "Major") {
79
+ scale.push(line_of_fifths[keyNoteIndex]);
80
+ scale.push(line_of_fifths[keyNoteIndex + 2]);
81
+ scale.push(line_of_fifths[keyNoteIndex + 4]);
82
+ scale.push(line_of_fifths[keyNoteIndex - 1]);
83
+ scale.push(line_of_fifths[keyNoteIndex + 1]);
84
+ scale.push(line_of_fifths[keyNoteIndex + 3]);
85
+ scale.push(line_of_fifths[keyNoteIndex + 5]);
86
+ }
87
+ else {
88
+ scale.push(line_of_fifths[keyNoteIndex]);
89
+ scale.push(line_of_fifths[keyNoteIndex + 2]);
90
+ scale.push(line_of_fifths[keyNoteIndex - 3]);
91
+ scale.push(line_of_fifths[keyNoteIndex - 1]);
92
+ scale.push(line_of_fifths[keyNoteIndex + 1]);
93
+ scale.push(line_of_fifths[keyNoteIndex - 4]);
94
+ scale.push(line_of_fifths[keyNoteIndex - 2]);
95
+ }
96
+ return scale;
97
+ }
98
+
99
+ function getIntervalAboveWithinKey(scale, noteBass, nStepsUp, iAlter) {
100
+ var startIndex = scale.findIndex(note => note.startsWith(noteBass.charAt(0)));
101
+ var endIndex = startIndex + nStepsUp - 1;
102
+ if (endIndex > 6)
103
+ endIndex %= 7;
104
+ var newNote = scale[endIndex];
105
+ switch (iAlter) {
106
+ case -2:
107
+ {
108
+ for (i = 0; i < 2; i++) {
109
+ if (newNote.endsWith("\u266F"))
110
+ newNote = newNote.substring(0, newNote.length - 1);
111
+ else
112
+ newNote += "\u266D";
113
+ }
114
+ break;
115
+ }
116
+ case -1:
117
+ {
118
+ if (newNote.endsWith("\u266F"))
119
+ newNote = newNote.substring(0, newNote.length - 1);
120
+ else
121
+ newNote += "\u266D";
122
+ break;
123
+ }
124
+ case 1:
125
+ {
126
+ if (newNote.endsWith("\u266D"))
127
+ newNote = newNote.substring(0, newNote.length - 1);
128
+ else
129
+ newNote += "\u266F";
130
+ break;
131
+ }
132
+ case 2:
133
+ {
134
+ for (i = 0; i < 2; i++) {
135
+ if (newNote.endsWith("\u266D"))
136
+ newNote = newNote.substring(0, newNote.length - 1);
137
+ else
138
+ newNote += "\u266F";
139
+ }
140
+ break;
141
+ }
142
+ case 0:
143
+ default:
144
+ }
145
+ //alert("Bass Note: "+noteBass+" Scale: "+scale+" Index: "+startIndex+" End Index: "+endIndex+" New Note: "+newNote);
146
+ return newNote;
147
+ }
148
+
149
+ function realizeFigures(scale, noteBass, sFB) {
150
+ var figures = [];
151
+ var notes = [];
152
+ notes.push(noteBass);
153
+ var iAlter = 0;
154
+
155
+ for (index = 0; index < sFB.length; index++) {
156
+ if (sFB.charAt(index) == '#' || sFB.charAt(index) == '+' || sFB.charAt(index) == '\u266F')
157
+ iAlter += 1;
158
+ else if (sFB.charAt(index) == 'b' || sFB.charAt(index) == '-' || sFB.charAt(index) == '\u266D')
159
+ iAlter -= 1;
160
+ else if (sFB.charAt(index) == 'T' || sFB.charAt(index) == '0') {
161
+ figures.length = 0;
162
+ figures.push(0);
163
+ notes.length = 0;
164
+ notes.push("none");
165
+ return notes;
166
+ }
167
+ else if (!isNaN(parseInt(sFB.charAt(index), 10))) //isDigit?
168
+ {
169
+ var nSteps = parseInt(sFB.charAt(index), 10);
170
+ var note = getIntervalAboveWithinKey(scale, noteBass, nSteps, iAlter);
171
+ notes.push(note);
172
+ figures.push(nSteps);
173
+ iAlter = 0;
174
+
175
+ }
176
+ }
177
+ if (!figures.includes(5))
178
+ if (!figures.includes(6)) {
179
+ var note = getIntervalAboveWithinKey(scale, noteBass, 5, 0);
180
+ notes.push(note);
181
+ if (getNumberOfSecondsInChord(notes) > 1) {
182
+ notes = arrayRemove(notes, note);
183
+ note = getIntervalAboveWithinKey(scale, noteBass, 6, 0);
184
+ notes.push(note);
185
+ if (getNumberOfSecondsInChord(notes) > 1)
186
+ notes = arrayRemove(notes, note);
187
+ }
188
+ }
189
+ if (!figures.includes(3))
190
+ if (!figures.includes(4)) {
191
+ if (sFB.length == 1 && (sFB == "#" || sFB == "+" || sFB == "\u266F"))
192
+ var note = getIntervalAboveWithinKey(scale, noteBass, 3, 1);
193
+ else if (sFB.length == 1 && (sFB == "b" || sFB == "-" || sFB == "\u266D"))
194
+ var note = getIntervalAboveWithinKey(scale, noteBass, 3, -1);
195
+ else
196
+ var note = getIntervalAboveWithinKey(scale, noteBass, 3, iAlter);
197
+ notes.push(note);
198
+ if (getNumberOfSecondsInChord(notes) > 1) {
199
+ notes = arrayRemove(notes, note);
200
+ note = getIntervalAboveWithinKey(scale, noteBass, 4, 0);
201
+ notes.push(note);
202
+ if (getNumberOfSecondsInChord(notes) > 1)
203
+ notes = arrayRemove(notes, note);
204
+ }
205
+ }
206
+ notes.shift();
207
+ return notes;
208
+ }
209
+
210
+ function getNumberOfSecondsInChord(notes) {
211
+ var nSteps = 0;
212
+ notes.forEach(function (element) {
213
+ notes.forEach(function (element2) {
214
+ if (isStep(element, element2))
215
+ nSteps++;
216
+ });
217
+ });
218
+ return nSteps;
219
+ }
220
+
221
+ function isStep(note1, note2) {
222
+ switch (note1.charAt(0)) {
223
+ case 'A':
224
+ {
225
+ if (note2.charAt(0) == 'B')
226
+ return true;
227
+ else
228
+ return false;
229
+ }
230
+ case 'B':
231
+ {
232
+ if (note2.charAt(0) == 'C')
233
+ return true;
234
+ else
235
+ return false;
236
+ }
237
+ case 'C':
238
+ {
239
+ if (note2.charAt(0) == 'D')
240
+ return true;
241
+ else
242
+ return false;
243
+ }
244
+ case 'D':
245
+ {
246
+ if (note2.charAt(0) == 'E')
247
+ return true;
248
+ else
249
+ return false;
250
+ }
251
+ case 'E':
252
+ {
253
+ if (note2.charAt(0) == 'F')
254
+ return true;
255
+ else
256
+ return false;
257
+ }
258
+ case 'F':
259
+ {
260
+ if (note2.charAt(0) == 'G')
261
+ return true;
262
+ else
263
+ return false;
264
+ }
265
+ case 'G':
266
+ {
267
+ if (note2.charAt(0) == 'A')
268
+ return true;
269
+ else
270
+ return false;
271
+ }
272
+ default:
273
+ return false;
274
+ }
275
+ }
276
+
277
+
278
+ function arrayRemove(arr, value) {
279
+
280
+ return arr.filter(function (ele) {
281
+ return ele != value;
282
+ });
283
+
284
+ }
285
+
286
+ function convert_pitch_to_int(name, accidental) {
287
+ iStepClass = -1;
288
+ switch (name) {
289
+ case 'C': iStepClass = 0; break;
290
+ case 'D': iStepClass = 1; break;
291
+ case 'E': iStepClass = 2; break;
292
+ case 'F': iStepClass = 3; break;
293
+ case 'G': iStepClass = 4; break;
294
+ case 'A': iStepClass = 5; break;
295
+ case 'B': iStepClass = 6; break;
296
+ default: break;
297
+ }
298
+ return iStepClass;
299
+ }
300
+
301
+ function change_mode() {
302
+ var key = document.getElementById("key");
303
+ var mode = document.getElementById("mode");
304
+ var index = key.selectedIndex;
305
+ if (mode.options[mode.selectedIndex].value == "Major") {
306
+ key.options[0] = new Option('C\u266D', 'Cb');
307
+ key.options[1] = new Option('G\u266D', 'Gb');
308
+ key.options[2] = new Option('D\u266D', 'Db');
309
+ key.options[3] = new Option('A\u266D', 'Ab');
310
+ key.options[4] = new Option('E\u266D', 'Eb');
311
+ key.options[5] = new Option('B\u266D', 'Bb');
312
+ key.options[6] = new Option('F', 'F');
313
+ key.options[7] = new Option('C', 'C');
314
+ key.options[8] = new Option('G', 'G');
315
+ key.options[9] = new Option('D', 'D');
316
+ key.options[10] = new Option('A', 'A');
317
+ key.options[11] = new Option('E', 'E');
318
+ key.options[12] = new Option('B', 'B');
319
+ key.options[13] = new Option('F\u266F', 'F#');
320
+ key.options[14] = new Option('C\u266F', 'C#');
321
+ index += 3;
322
+ if (index > 14)
323
+ index -= 12;
324
+ key.selectedIndex = index;
325
+ }
326
+ else {
327
+ key.options[0] = new Option('A\u266D', 'Ab');
328
+ key.options[1] = new Option('E\u266D', 'Eb');
329
+ key.options[2] = new Option('B\u266D', 'Bb');
330
+ key.options[3] = new Option('F', 'F');
331
+ key.options[4] = new Option('C', 'C');
332
+ key.options[5] = new Option('G', 'G');
333
+ key.options[6] = new Option('D', 'D');
334
+ key.options[7] = new Option('A', 'A');
335
+ key.options[8] = new Option('E', 'E');
336
+ key.options[9] = new Option('B', 'B');
337
+ key.options[10] = new Option('F\u266F', 'F#');
338
+ key.options[11] = new Option('C\u266F', 'C#');
339
+ key.options[12] = new Option('G\u266F', 'G#');
340
+ key.options[13] = new Option('D\u266F', 'D#');
341
+ key.options[14] = new Option('A\u266F', 'A#');
342
+ index -= 3;
343
+ if (index < 0)
344
+ index += 12;
345
+ key.selectedIndex = index;
346
+ }
347
+ }
348
+
349
+
350
+ function close_dropdown() {
351
+ // var lab = document.getElementById("dropbuttonlabel");
352
+ // var btn = document.getElementById("dropbutton");
353
+ // var radioButtons = document.getElementsByName("figures");
354
+ // for (var x = 0; x < radioButtons.length; x++) {
355
+ // if (radioButtons[x].checked) {
356
+ // lab.innerHTML = radioButtons[x].nextSibling.innerHTML + "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class='triangle'>&#9660;</span>";
357
+ // }
358
+ // }
359
+ // btn.checked = false;
360
+ }
361
+
362
+ function deleteAllCookies() {
363
+ var cookies = document.cookie.split(";");
364
+
365
+ for (var i = 0; i < cookies.length; i++) {
366
+ var cookie = cookies[i];
367
+ var eqPos = cookie.indexOf("=");
368
+ var name = eqPos > -1 ? cookie.substr(0, eqPos) : cookie;
369
+ document.cookie = name + "=;expires=Thu, 01 Jan 1970 00:00:00 GMT";
370
+ }
371
+ }
372
+
373
+ function getCookie(cname) {
374
+ var name = cname + "=";
375
+ var decodedCookie = decodeURIComponent(document.cookie);
376
+ var ca = decodedCookie.split(';');
377
+ for (var i = 0; i < ca.length; i++) {
378
+ var c = ca[i];
379
+ while (c.charAt(0) == ' ') {
380
+ c = c.substring(1);
381
+ }
382
+ if (c.indexOf(name) == 0) {
383
+ return c.substring(name.length, c.length);
384
+ }
385
+ }
386
+ return "";
387
+ }
src/+42.png ADDED
src/+6+43.png ADDED
src/+64.png ADDED
src/+643.png ADDED
src/+65.png ADDED
src/+6b5.png ADDED
src/2+.png ADDED
src/4+2.png ADDED
src/4+b3.png ADDED
src/42.png ADDED
src/43.png ADDED
src/4b.png ADDED
src/4b3.png ADDED
src/5+.png ADDED
src/5+3.png ADDED
src/53.png ADDED
src/54.png ADDED
src/6+43.png ADDED
src/64.png ADDED
src/642.png ADDED
src/643.png ADDED
src/65+.png ADDED
src/65+3.png ADDED
src/65.png ADDED
src/65b.png ADDED
src/65b3.png ADDED
src/6slash.png ADDED
src/6slash4.png ADDED
src/6slash5.png ADDED
src/6slashb5.png ADDED
src/7+.png ADDED
src/7+3.png ADDED
src/73.png ADDED
src/74.png ADDED
src/742.png ADDED
src/743.png ADDED
src/754.png ADDED
src/84.png ADDED
src/853.png ADDED
style.css DELETED
@@ -1,28 +0,0 @@
1
- body {
2
- padding: 2rem;
3
- font-family: -apple-system, BlinkMacSystemFont, "Arial", sans-serif;
4
- }
5
-
6
- h1 {
7
- font-size: 16px;
8
- margin-top: 0;
9
- }
10
-
11
- p {
12
- color: rgb(107, 114, 128);
13
- font-size: 15px;
14
- margin-bottom: 10px;
15
- margin-top: 5px;
16
- }
17
-
18
- .card {
19
- max-width: 620px;
20
- margin: 0 auto;
21
- padding: 16px;
22
- border: 1px solid lightgray;
23
- border-radius: 16px;
24
- }
25
-
26
- .card p:last-child {
27
- margin-bottom: 0;
28
- }