├── .browserslistrc
├── .gitignore
├── LICENSE
├── README.md
├── babel.config.js
├── package-lock.json
├── package.json
├── postcss.config.js
├── public
├── Rest_Test.xml
├── favicon.ico
├── index.html
└── score.xml
├── src
├── App.vue
├── assets
│ └── logo.png
├── components
│ ├── BpmSlider.vue
│ ├── InstrumentControl.vue
│ ├── PlaybackControls.vue
│ ├── PlaybackSidebar.vue
│ ├── Score.vue
│ └── VolumeSlider.vue
├── instruments.js
├── main.js
├── osmd
│ ├── PlaybackEngine.js
│ ├── PlaybackScheduler.js
│ └── StepQueue.js
├── plugins
│ └── vuetify.js
└── scores.js
└── vue.config.js
/.browserslistrc:
--------------------------------------------------------------------------------
1 | > 1%
2 | last 2 versions
3 | not ie <= 10
4 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules
3 | /dist
4 |
5 | # local env files
6 | .env.local
7 | .env.*.local
8 |
9 | # Log files
10 | npm-debug.log*
11 | yarn-debug.log*
12 | yarn-error.log*
13 |
14 | # Editor directories and files
15 | .idea
16 | .vscode
17 | *.suo
18 | *.ntvs*
19 | *.njsproj
20 | *.sln
21 | *.sw*
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2018 Jimmy Utterström
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ***
2 | ⚠️ **No further development will be done in this repository, please follow [https://github.com/jimutt/osmd-audio-player](https://github.com/jimutt/osmd-audio-player) for an improved and more user friendly OSMD audio playback extension.**
3 | ⚠️
4 | ***
5 |
6 | # OSMD Playback Demo
7 | Demo available on [https://heuristic-williams-b11ca6.netlify.com/](https://heuristic-williams-b11ca6.netlify.com/)
8 |
9 | ## About
10 |
11 | This is a proof of concept application enabling audio playback for [OSMD](https://github.com/opensheetmusicdisplay/opensheetmusicdisplay) scores. It features a simplistic note scheduler and utilizes [soundfont-player](https://github.com/danigb/soundfont-player) for the actual audio playback.
12 |
13 | The overall code quality is poor and has only been put together for personal prototyping.
14 |
15 | ## Limitations
16 |
17 | At its current state the playback functionality is very basic, it does not interprate dynamics and has no way to handle for example grace notes. In addition to the limited features the current build also contains the following bugs (along with various other misbehaviors...):
18 |
19 | - Occasional cursor desynchronization when using progress indicator to change cursor location in score.
20 | - Some issues with tie lengths
21 |
22 | ## Structure
23 |
24 | The demo site is built with Vue.js and Vuetify. Run `npm run serve` to build the project and run it on a local dev server. The audio playback and scheduling logic can be found in the `src/osmd` directory.
25 |
--------------------------------------------------------------------------------
/babel.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | "presets": [
3 | [
4 | "@vue/app",
5 | {
6 | "useBuiltIns": "entry"
7 | }
8 | ]
9 | ]
10 | }
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "osmd-playback-vue",
3 | "version": "0.1.0",
4 | "private": true,
5 | "scripts": {
6 | "serve": "vue-cli-service serve",
7 | "build": "vue-cli-service build"
8 | },
9 | "dependencies": {
10 | "axios": "^0.18.1",
11 | "opensheetmusicdisplay": "git://github.com/opensheetmusicdisplay/opensheetmusicdisplay.git#develop",
12 | "soundfont-player": "^0.10.7",
13 | "vue": "^2.6.11",
14 | "vuetify": "^1.5.22"
15 | },
16 | "devDependencies": {
17 | "@babel/polyfill": "^7.8.3",
18 | "@vue/cli-plugin-babel": "^3.12.1",
19 | "@vue/cli-service": "^3.12.1",
20 | "sass": "^1.25.0",
21 | "sass-loader": "^7.3.1",
22 | "vue-cli-plugin-vuetify": "^0.1.6",
23 | "vue-template-compiler": "^2.6.11"
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/postcss.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | plugins: {
3 | autoprefixer: {}
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/public/Rest_Test.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Title
6 |
7 |
8 | Composer
9 |
10 | MuseScore 2.1.0
11 | 2018-09-21
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 | 7.05556
22 | 40
23 |
24 |
25 | 1683.36
26 | 1190.88
27 |
28 | 56.6929
29 | 56.6929
30 | 56.6929
31 | 113.386
32 |
33 |
34 | 56.6929
35 | 56.6929
36 | 56.6929
37 | 113.386
38 |
39 |
40 |
41 |
42 |
43 |
44 | Rest Test
45 |
46 |
47 | Jimmy Utterström
48 |
49 |
50 |
51 | Piano
52 | Pno.
53 |
54 | Piano
55 |
56 |
57 |
58 | 1
59 | 1
60 | 78.7402
61 | 0
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 | 0.00
71 | -0.00
72 |
73 | 170.00
74 |
75 |
76 |
77 | 2
78 |
79 | 0
80 |
81 |
82 | 4
83 | 4
84 |
85 |
86 | G
87 | 2
88 |
89 |
90 |
91 |
92 | A
93 | 4
94 |
95 | 2
96 | 1
97 | quarter
98 | up
99 |
100 |
101 |
102 | B
103 | 4
104 |
105 | 2
106 | 1
107 | quarter
108 | up
109 |
110 |
111 |
112 | C
113 | 5
114 |
115 | 2
116 | 1
117 | quarter
118 | up
119 |
120 |
121 |
122 | B
123 | 4
124 |
125 | 2
126 | 1
127 | quarter
128 | up
129 |
130 |
131 | 8
132 |
133 |
134 |
135 | E
136 | 4
137 |
138 | 2
139 | 2
140 | quarter
141 | down
142 |
143 |
144 |
145 | F
146 | 1
147 | 4
148 |
149 | 2
150 | 2
151 | quarter
152 | sharp
153 | down
154 |
155 |
156 |
157 | 2
158 | 2
159 | quarter
160 |
161 |
162 |
163 | 1
164 | 2
165 | eighth
166 |
167 |
168 |
169 | D
170 | 4
171 |
172 | 1
173 | 2
174 | eighth
175 | down
176 |
177 |
178 |
179 |
180 |
181 | A
182 | 4
183 |
184 | 4
185 | 1
186 | half
187 | up
188 |
189 |
190 |
191 | A
192 | 4
193 |
194 | 4
195 | 1
196 | half
197 | up
198 |
199 |
200 | 8
201 |
202 |
203 |
204 | E
205 | 4
206 |
207 | 4
208 | 2
209 | half
210 | down
211 |
212 |
213 |
214 | 4
215 | 2
216 | half
217 |
218 |
219 |
220 |
221 |
222 | B
223 | 4
224 |
225 | 8
226 | 1
227 | whole
228 |
229 |
230 |
231 |
232 |
233 | 8
234 | 1
235 |
236 |
237 | light-heavy
238 |
239 |
240 |
241 |
242 |
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jimutt/osmd-playback-demo/c47d1b22ce1cbc4bb24a41e079b5fb5d09660b2a/public/favicon.ico
--------------------------------------------------------------------------------
/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 | osmd-playback-vue
11 |
12 |
13 |
14 |
15 | We're sorry but osmd-playback-vue doesn't work properly without JavaScript enabled. Please enable it to
16 | continue.
17 |
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/public/score.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 31. Herren är min herde god
6 |
7 |
8 | Melch. Vulpius, 1609
9 |
10 | MuseScore 2.1.0
11 | 2018-02-08
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 | 7.05556
22 | 40
23 |
24 |
25 | 1683.36
26 | 1190.88
27 |
28 | 56.6929
29 | 56.6929
30 | 56.6929
31 | 113.386
32 |
33 |
34 | 56.6929
35 | 56.6929
36 | 56.6929
37 | 113.386
38 |
39 |
40 |
41 |
42 |
43 |
44 | Herren är min herde god
45 |
46 |
47 | Melch. Vulpius, 1609
48 |
49 |
50 |
51 | bracket
52 |
53 |
54 | S
55 | A
56 |
57 | Soprano/Alto
58 |
59 |
60 |
61 | 1
62 | 53
63 | 78.7402
64 | 0
65 |
66 |
67 |
68 | T
69 | B
70 |
71 | Tenor/Bass
72 |
73 |
74 |
75 | 2
76 | 53
77 | 78.7402
78 | 0
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 | 33.78
89 | 0.00
90 |
91 | 170.00
92 |
93 |
94 |
95 | 4
96 |
97 | 3
98 |
99 |
100 | 4
101 | 4
102 |
103 |
104 | G
105 | 2
106 |
107 |
108 |
109 |
110 | C
111 | 1
112 | 5
113 |
114 | 4
115 | 1
116 | quarter
117 | up
118 |
119 |
120 |
121 | B
122 | 4
123 |
124 | 4
125 | 1
126 | quarter
127 | up
128 |
129 |
130 |
131 | A
132 | 4
133 |
134 | 4
135 | 1
136 | quarter
137 | up
138 |
139 |
140 |
141 | B
142 | 4
143 |
144 | 4
145 | 1
146 | quarter
147 | up
148 |
149 |
150 | 16
151 |
152 |
153 |
154 | A
155 | 4
156 |
157 | 4
158 | 2
159 | quarter
160 | down
161 |
162 | begin
163 | 1. Her
164 |
165 |
166 | single
167 | 2. För
168 |
169 |
170 | single
171 | 3. Med
172 |
173 |
174 |
175 |
176 | G
177 | 1
178 | 4
179 |
180 | 4
181 | 2
182 | quarter
183 | down
184 |
185 | end
186 | ren
187 |
188 |
189 | single
190 | sitt
191 |
192 |
193 | single
194 | din
195 |
196 |
197 |
198 |
199 | A
200 | 4
201 |
202 | 4
203 | 2
204 | quarter
205 | down
206 |
207 | single
208 | är
209 |
210 |
211 | single
212 | namn
213 |
214 |
215 | single
216 | stav,
217 |
218 |
219 |
220 |
221 | G
222 | 1
223 | 4
224 |
225 | 4
226 | 2
227 | quarter
228 | down
229 |
230 | single
231 | min
232 |
233 |
234 | single
235 | han
236 |
237 |
238 | single
239 | ditt
240 |
241 |
242 |
243 |
244 |
245 |
246 | C
247 | 1
248 | 5
249 |
250 | 4
251 | 1
252 | quarter
253 | up
254 |
255 |
256 |
257 | D
258 | 1
259 | 5
260 |
261 | 4
262 | 1
263 | quarter
264 | sharp
265 | up
266 |
267 |
268 |
269 | E
270 | 5
271 |
272 | 8
273 | 1
274 | half
275 | up
276 |
277 |
278 |
279 |
280 |
281 | 16
282 |
283 |
284 |
285 | A
286 | 4
287 |
288 | 2
289 | 2
290 | eighth
291 | down
292 | begin
293 |
294 | begin
295 | Her
296 |
297 |
298 | begin
299 | lå
300 |
301 |
302 | single
303 | ord
304 |
305 |
306 |
307 |
308 | G
309 | 1
310 | 4
311 |
312 | 2
313 | 2
314 | eighth
315 | down
316 | end
317 |
318 |
319 |
320 | F
321 | 1
322 | 4
323 |
324 | 4
325 | 2
326 | quarter
327 | down
328 |
329 | end
330 | de
331 |
332 |
333 | end
334 | ter
335 |
336 |
337 | single
338 | och
339 |
340 |
341 |
342 |
343 | G
344 | 1
345 | 4
346 |
347 | 8
348 | 2
349 | half
350 | down
351 |
352 | single
353 | god,
354 |
355 |
356 | single
357 | mig
358 |
359 |
360 | single
361 | råd
362 |
363 |
364 |
365 |
366 |
367 |
368 | F
369 | 1
370 | 5
371 |
372 | 4
373 | 1
374 | quarter
375 | up
376 |
377 |
378 |
379 | E
380 | 5
381 |
382 | 4
383 | 1
384 | quarter
385 | up
386 |
387 |
388 |
389 | D
390 | 5
391 |
392 | 4
393 | 1
394 | quarter
395 | natural
396 | up
397 |
398 |
399 |
400 | C
401 | 1
402 | 5
403 |
404 | 2
405 | 1
406 | eighth
407 | up
408 | begin
409 |
410 |
411 |
412 | B
413 | 4
414 |
415 | 2
416 | 1
417 | eighth
418 | up
419 | end
420 |
421 |
422 | 16
423 |
424 |
425 |
426 | B
427 | 4
428 |
429 | 4
430 | 2
431 | quarter
432 | down
433 |
434 | single
435 | mig
436 |
437 |
438 | begin
439 | ald
440 |
441 |
442 | single
443 | du
444 |
445 |
446 |
447 |
448 | B
449 | 4
450 |
451 | 4
452 | 2
453 | quarter
454 | down
455 |
456 | single
457 | skall
458 |
459 |
460 | end
461 | rig
462 |
463 |
464 | single
465 | mig
466 |
467 |
468 |
469 |
470 | G
471 | 1
472 | 4
473 |
474 | 4
475 | 2
476 | quarter
477 | down
478 |
479 | begin
480 | in
481 |
482 |
483 | begin
484 | vil
485 |
486 |
487 | begin
488 | tro
489 |
490 |
491 |
492 |
493 | A
494 | 4
495 |
496 | 4
497 | 2
498 | quarter
499 | down
500 |
501 | end
502 | tet
503 |
504 |
505 | end
506 | se
507 |
508 |
509 | end
510 | get
511 |
512 |
513 |
514 |
515 |
516 |
517 | B
518 | 4
519 |
520 | 8
521 | 1
522 | half
523 | up
524 |
525 |
526 |
527 | A
528 | 4
529 |
530 | 8
531 | 1
532 | half
533 | up
534 |
535 |
536 |
537 |
538 |
539 | 16
540 |
541 |
542 |
543 | A
544 | 4
545 |
546 | 4
547 | 2
548 | quarter
549 | down
550 |
551 |
552 |
553 |
554 | begin
555 | fat
556 |
557 |
558 | begin
559 | fa
560 |
561 |
562 | begin
563 | le
564 |
565 |
566 |
567 |
568 | G
569 | 1
570 | 4
571 |
572 | 4
573 | 2
574 | quarter
575 | down
576 |
577 |
578 |
579 |
580 |
581 |
582 | E
583 | 4
584 |
585 | 8
586 | 2
587 | half
588 | down
589 |
590 | end
591 | tas.
592 |
593 |
594 | end
595 | ra;
596 |
597 |
598 | end
599 | der,
600 |
601 |
602 |
603 |
604 |
605 |
606 |
607 | 6.50
608 | 0.00
609 |
610 | 108.43
611 |
612 |
613 |
614 |
615 | C
616 | 1
617 | 5
618 |
619 | 4
620 | 1
621 | quarter
622 | up
623 |
624 |
625 |
626 | E
627 | 5
628 |
629 | 4
630 | 1
631 | quarter
632 | up
633 |
634 |
635 |
636 | D
637 | 5
638 |
639 | 4
640 | 1
641 | quarter
642 | up
643 |
644 |
645 |
646 | C
647 | 1
648 | 5
649 |
650 | 4
651 | 1
652 | quarter
653 | up
654 |
655 |
656 | 16
657 |
658 |
659 |
660 | A
661 | 4
662 |
663 | 4
664 | 2
665 | quarter
666 | down
667 |
668 | single
669 | Han
670 |
671 |
672 | begin
673 | le
674 |
675 |
676 | single
677 | och
678 |
679 |
680 |
681 |
682 | B
683 | 4
684 |
685 | 4
686 | 2
687 | quarter
688 | down
689 |
690 | single
691 | mig
692 |
693 |
694 | end
695 | der
696 |
697 |
698 | single
699 | ett
700 |
701 |
702 |
703 |
704 | A
705 | 4
706 |
707 | 4
708 | 2
709 | quarter
710 | down
711 |
712 | single
713 | för
714 |
715 |
716 | single
717 | mig
718 |
719 |
720 | single
721 | bord
722 |
723 |
724 |
725 |
726 | G
727 | 1
728 | 4
729 |
730 | 4
731 | 2
732 | quarter
733 | down
734 |
735 | single
736 | till
737 |
738 |
739 | single
740 | den
741 |
742 |
743 | single
744 | av
745 |
746 |
747 |
748 |
749 |
750 |
751 | B
752 | 4
753 |
754 | 4
755 | 1
756 | quarter
757 | up
758 |
759 |
760 |
761 | A
762 | 4
763 |
764 | 4
765 | 1
766 | quarter
767 | up
768 |
769 |
770 |
771 | G
772 | 1
773 | 4
774 |
775 | 8
776 | 1
777 | half
778 | up
779 |
780 |
781 |
782 |
783 |
784 | 16
785 |
786 |
787 |
788 | F
789 | 1
790 | 4
791 |
792 | 4
793 | 2
794 | quarter
795 | down
796 |
797 | begin
798 | käl
799 |
800 |
801 | begin
802 | rät
803 |
804 |
805 | begin
806 | i
807 |
808 |
809 |
810 |
811 | F
812 | 1
813 | 4
814 |
815 | 4
816 | 2
817 | quarter
818 | down
819 |
820 | end
821 | lans
822 |
823 |
824 | end
825 | ta
826 |
827 |
828 | end
829 | del
830 |
831 |
832 |
833 |
834 | E
835 | 1
836 | 4
837 |
838 | 8
839 | 2
840 | half
841 | sharp
842 | down
843 |
844 | single
845 | flod,
846 |
847 |
848 | single
849 | stig,
850 |
851 |
852 | single
853 | nåd
854 |
855 |
856 |
857 |
858 |
859 |
860 | A
861 | 4
862 |
863 | 4
864 | 1
865 | quarter
866 | up
867 |
868 |
869 |
870 | B
871 | 4
872 |
873 | 4
874 | 1
875 | quarter
876 | up
877 |
878 |
879 |
880 | C
881 | 1
882 | 5
883 |
884 | 4
885 | 1
886 | quarter
887 | up
888 |
889 |
890 |
891 | C
892 | 1
893 | 5
894 |
895 | 2
896 | 1
897 | eighth
898 | up
899 | begin
900 |
901 |
902 |
903 | D
904 | 5
905 |
906 | 1
907 | 1
908 | 16th
909 | up
910 | continue
911 | begin
912 |
913 |
914 |
915 | E
916 | 5
917 |
918 | 1
919 | 1
920 | 16th
921 | up
922 | end
923 | end
924 |
925 |
926 | 16
927 |
928 |
929 |
930 | C
931 | 1
932 | 4
933 |
934 | 4
935 | 2
936 | quarter
937 | down
938 |
939 | single
940 | när
941 |
942 |
943 | single
944 | där
945 |
946 |
947 | single
948 | du
949 |
950 |
951 |
952 |
953 | E
954 | 4
955 |
956 | 4
957 | 2
958 | quarter
959 | natural
960 | down
961 |
962 | single
963 | av
964 |
965 |
966 | single
967 | jag
968 |
969 |
970 | single
971 | åt
972 |
973 |
974 |
975 |
976 | E
977 | 4
978 |
979 | 4
980 | 2
981 | quarter
982 | down
983 |
984 | single
985 | törst
986 |
987 |
988 | single
989 | trygg
990 |
991 |
992 | single
993 | mig
994 |
995 |
996 |
997 |
998 | E
999 | 4
1000 |
1001 | 4
1002 | 2
1003 | quarter
1004 | down
1005 |
1006 | single
1007 | jag
1008 |
1009 |
1010 | single
1011 | kan
1012 |
1013 |
1014 | begin
1015 | be
1016 |
1017 |
1018 |
1019 |
1020 |
1021 |
1022 | D
1023 | 5
1024 |
1025 | 8
1026 | 1
1027 | half
1028 | up
1029 |
1030 |
1031 |
1032 | C
1033 | 1
1034 | 5
1035 |
1036 | 8
1037 | 1
1038 | half
1039 | up
1040 |
1041 |
1042 |
1043 |
1044 |
1045 | 16
1046 |
1047 |
1048 |
1049 | A
1050 | 4
1051 |
1052 | 4
1053 | 2
1054 | quarter
1055 | down
1056 |
1057 |
1058 |
1059 |
1060 | begin
1061 | mat
1062 |
1063 |
1064 | begin
1065 | va
1066 |
1067 |
1068 | middle
1069 | re
1070 |
1071 |
1072 |
1073 |
1074 | B
1075 | 4
1076 |
1077 | 4
1078 | 2
1079 | quarter
1080 | down
1081 |
1082 |
1083 |
1084 |
1085 |
1086 |
1087 | A
1088 | 4
1089 |
1090 | 8
1091 | 2
1092 | half
1093 | down
1094 |
1095 | end
1096 | tas.
1097 |
1098 |
1099 | end
1100 | ra.
1101 |
1102 |
1103 | end
1104 | der.
1105 |
1106 |
1107 |
1108 |
1109 |
1110 |
1111 |
1112 | 6.50
1113 | 0.00
1114 |
1115 | 108.43
1116 |
1117 |
1118 |
1119 |
1120 | C
1121 | 1
1122 | 5
1123 |
1124 | 4
1125 | 1
1126 | quarter
1127 | up
1128 |
1129 |
1130 |
1131 | D
1132 | 5
1133 |
1134 | 4
1135 | 1
1136 | quarter
1137 | up
1138 |
1139 |
1140 |
1141 | E
1142 | 5
1143 |
1144 | 4
1145 | 1
1146 | quarter
1147 | up
1148 |
1149 |
1150 |
1151 | D
1152 | 5
1153 |
1154 | 4
1155 | 1
1156 | quarter
1157 | up
1158 |
1159 |
1160 | 16
1161 |
1162 |
1163 |
1164 | A
1165 | 4
1166 |
1167 | 4
1168 | 2
1169 | quarter
1170 | down
1171 |
1172 | single
1173 | Han
1174 |
1175 |
1176 | single
1177 | Om
1178 |
1179 |
1180 | begin
1181 | God
1182 |
1183 |
1184 |
1185 |
1186 | A
1187 | 4
1188 |
1189 | 4
1190 | 2
1191 | quarter
1192 | down
1193 |
1194 | single
1195 | mig
1196 |
1197 |
1198 | single
1199 | jag
1200 |
1201 |
1202 | end
1203 | het
1204 |
1205 |
1206 |
1207 |
1208 | A
1209 | 4
1210 |
1211 | 4
1212 | 2
1213 | quarter
1214 | down
1215 |
1216 | begin
1217 | ve
1218 |
1219 |
1220 | single
1221 | går
1222 |
1223 |
1224 | single
1225 | blott
1226 |
1227 |
1228 |
1229 |
1230 | A
1231 | 4
1232 |
1233 | 4
1234 | 2
1235 | quarter
1236 | down
1237 |
1238 | middle
1239 | der
1240 |
1241 |
1242 | single
1243 | i
1244 |
1245 |
1246 | single
1247 | skall
1248 |
1249 |
1250 |
1251 |
1252 |
1253 |
1254 | C
1255 | 1
1256 | 5
1257 |
1258 | 4
1259 | 1
1260 | quarter
1261 | up
1262 |
1263 |
1264 |
1265 | B
1266 | 4
1267 |
1268 | 4
1269 | 1
1270 | quarter
1271 | up
1272 |
1273 |
1274 |
1275 | C
1276 | 1
1277 | 5
1278 |
1279 | 8
1280 | 1
1281 | half
1282 | up
1283 |
1284 |
1285 |
1286 |
1287 |
1288 | 16
1289 |
1290 |
1291 |
1292 | A
1293 | 4
1294 |
1295 | 4
1296 | 2
1297 | quarter
1298 | down
1299 |
1300 | middle
1301 | kvic
1302 |
1303 |
1304 | begin
1305 | mörk
1306 |
1307 |
1308 | begin
1309 | föl
1310 |
1311 |
1312 |
1313 |
1314 | G
1315 | 1
1316 | 4
1317 |
1318 | 4
1319 | 2
1320 | quarter
1321 | down
1322 |
1323 | end
1324 | ker
1325 |
1326 |
1327 | end
1328 | rets
1329 |
1330 |
1331 | single
1332 | ja
1333 |
1334 |
1335 |
1336 |
1337 | A
1338 | 4
1339 |
1340 | 8
1341 | 2
1342 | half
1343 | down
1344 |
1345 | single
1346 | väl
1347 |
1348 |
1349 | single
1350 | dal,
1351 |
1352 |
1353 | single
1354 | mig
1355 |
1356 |
1357 |
1358 |
1359 |
1360 |
1361 | B
1362 | 4
1363 |
1364 | 4
1365 | 1
1366 | quarter
1367 | up
1368 |
1369 |
1370 |
1371 | B
1372 | 4
1373 |
1374 | 4
1375 | 1
1376 | quarter
1377 | up
1378 |
1379 |
1380 |
1381 | C
1382 | 1
1383 | 5
1384 |
1385 | 2
1386 | 1
1387 | eighth
1388 | up
1389 | begin
1390 |
1391 |
1392 |
1393 | D
1394 | 1
1395 | 5
1396 |
1397 | 2
1398 | 1
1399 | eighth
1400 | sharp
1401 | up
1402 | end
1403 |
1404 |
1405 |
1406 | E
1407 | 5
1408 |
1409 | 4
1410 | 1
1411 | quarter
1412 | up
1413 |
1414 |
1415 | 16
1416 |
1417 |
1418 |
1419 | G
1420 | 1
1421 | 4
1422 |
1423 | 4
1424 | 2
1425 | quarter
1426 | down
1427 |
1428 | single
1429 | på
1430 |
1431 |
1432 | single
1433 | jag
1434 |
1435 |
1436 | begin
1437 | he
1438 |
1439 |
1440 |
1441 |
1442 | E
1443 | 4
1444 |
1445 | 4
1446 | 2
1447 | quarter
1448 | down
1449 |
1450 | single
1451 | de
1452 |
1453 |
1454 | single
1455 | dock
1456 |
1457 |
1458 | end
1459 | la
1460 |
1461 |
1462 |
1463 |
1464 | A
1465 | 4
1466 |
1467 | 4
1468 | 2
1469 | quarter
1470 | down
1471 |
1472 | begin
1473 | äng
1474 |
1475 |
1476 | begin
1477 | ic
1478 |
1479 |
1480 | begin
1481 | lev
1482 |
1483 |
1484 |
1485 |
1486 | G
1487 | 1
1488 | 4
1489 |
1490 | 4
1491 | 2
1492 | quarter
1493 | down
1494 |
1495 | end
1496 | ar
1497 |
1498 |
1499 | end
1500 | ke
1501 |
1502 |
1503 | middle
1504 | nads
1505 |
1506 |
1507 |
1508 |
1509 |
1510 |
1511 | E
1512 | 5
1513 |
1514 | 4
1515 | 1
1516 | quarter
1517 | up
1518 |
1519 |
1520 |
1521 |
1522 |
1523 |
1524 | D
1525 | 1
1526 | 5
1527 |
1528 | 4
1529 | 1
1530 | quarter
1531 | sharp
1532 | up
1533 |
1534 |
1535 |
1536 |
1537 |
1538 |
1539 | E
1540 | 5
1541 |
1542 | 8
1543 | 1
1544 | half
1545 | up
1546 |
1547 |
1548 |
1549 |
1550 |
1551 | 16
1552 |
1553 |
1554 |
1555 | F
1556 | 1
1557 | 4
1558 |
1559 | 8
1560 | 2
1561 | half
1562 | down
1563 |
1564 | begin
1565 | grö
1566 |
1567 |
1568 | begin
1569 | rä
1570 |
1571 |
1572 | middle
1573 | da
1574 |
1575 |
1576 |
1577 |
1578 | G
1579 | 1
1580 | 4
1581 |
1582 | 8
1583 | 2
1584 | half
1585 | down
1586 |
1587 | end
1588 | na,
1589 |
1590 |
1591 | end
1592 | des.
1593 |
1594 |
1595 | single
1596 | gen.
1597 |
1598 |
1599 |
1600 |
1601 |
1602 |
1603 |
1604 | 6.50
1605 | 0.00
1606 |
1607 | 108.43
1608 |
1609 |
1610 |
1611 |
1612 | E
1613 | 5
1614 |
1615 | 4
1616 | 1
1617 | quarter
1618 | up
1619 |
1620 |
1621 |
1622 | C
1623 | 1
1624 | 5
1625 |
1626 | 4
1627 | 1
1628 | quarter
1629 | up
1630 |
1631 |
1632 |
1633 | F
1634 | 1
1635 | 5
1636 |
1637 | 6
1638 | 1
1639 | quarter
1640 |
1641 | up
1642 |
1643 |
1644 |
1645 | E
1646 | 5
1647 |
1648 | 2
1649 | 1
1650 | eighth
1651 | up
1652 |
1653 |
1654 | 16
1655 |
1656 |
1657 |
1658 | G
1659 | 4
1660 |
1661 | 4
1662 | 2
1663 | quarter
1664 | natural
1665 | down
1666 |
1667 | single
1668 | där
1669 |
1670 |
1671 | single
1672 | Gud,
1673 |
1674 |
1675 | single
1676 | Sist
1677 |
1678 |
1679 |
1680 |
1681 | G
1682 | 4
1683 |
1684 | 4
1685 | 2
1686 | quarter
1687 | down
1688 |
1689 | single
1690 | en
1691 |
1692 |
1693 | single
1694 | min
1695 |
1696 |
1697 | single
1698 | jag
1699 |
1700 |
1701 |
1702 |
1703 | F
1704 | 1
1705 | 4
1706 |
1707 | 2
1708 | 2
1709 | eighth
1710 | down
1711 | begin
1712 |
1713 | begin
1714 | ljuv
1715 |
1716 |
1717 | single
1718 | tröst
1719 |
1720 |
1721 | begin
1722 | var
1723 |
1724 |
1725 |
1726 |
1727 | G
1728 | 1
1729 | 4
1730 |
1731 | 2
1732 | 2
1733 | eighth
1734 | sharp
1735 | down
1736 | end
1737 |
1738 |
1739 |
1740 | A
1741 | 4
1742 |
1743 | 4
1744 | 2
1745 | quarter
1746 | natural
1747 | down
1748 |
1749 | end
1750 | lig
1751 |
1752 |
1753 | single
1754 | i
1755 |
1756 |
1757 | end
1758 | der
1759 |
1760 |
1761 |
1762 |
1763 |
1764 |
1765 | D
1766 | 5
1767 |
1768 | 4
1769 | 1
1770 | quarter
1771 | up
1772 |
1773 |
1774 |
1775 | C
1776 | 1
1777 | 5
1778 |
1779 | 2
1780 | 1
1781 | eighth
1782 | up
1783 | begin
1784 |
1785 |
1786 |
1787 | B
1788 | 4
1789 |
1790 | 2
1791 | 1
1792 | eighth
1793 | up
1794 | end
1795 |
1796 |
1797 |
1798 | B
1799 | 4
1800 |
1801 | 8
1802 | 1
1803 | half
1804 | up
1805 |
1806 |
1807 |
1808 |
1809 |
1810 | 16
1811 |
1812 |
1813 |
1814 | A
1815 | 4
1816 |
1817 | 2
1818 | 2
1819 | eighth
1820 | down
1821 | begin
1822 |
1823 | single
1824 | ro
1825 |
1826 |
1827 | begin
1828 | al
1829 |
1830 |
1831 | single
1832 | upp
1833 |
1834 |
1835 |
1836 |
1837 | G
1838 | 1
1839 | 4
1840 |
1841 | 2
1842 | 2
1843 | eighth
1844 | down
1845 | end
1846 |
1847 |
1848 |
1849 | A
1850 | 4
1851 |
1852 | 4
1853 | 2
1854 | quarter
1855 | down
1856 |
1857 | single
1858 | min
1859 |
1860 |
1861 | end
1862 | la
1863 |
1864 |
1865 | single
1866 | till
1867 |
1868 |
1869 |
1870 |
1871 | G
1872 | 1
1873 | 4
1874 |
1875 | 8
1876 | 2
1877 | half
1878 | down
1879 |
1880 | single
1881 | själ
1882 |
1883 |
1884 | single
1885 | kval,
1886 |
1887 |
1888 | single
1889 | dig
1890 |
1891 |
1892 |
1893 |
1894 |
1895 |
1896 | C
1897 | 1
1898 | 5
1899 |
1900 | 4
1901 | 1
1902 | quarter
1903 | up
1904 |
1905 |
1906 |
1907 | E
1908 | 5
1909 |
1910 | 4
1911 | 1
1912 | quarter
1913 | up
1914 |
1915 |
1916 |
1917 | D
1918 | 5
1919 |
1920 | 4
1921 | 1
1922 | quarter
1923 | up
1924 |
1925 |
1926 |
1927 | C
1928 | 1
1929 | 5
1930 |
1931 | 2
1932 | 1
1933 | eighth
1934 | up
1935 | begin
1936 |
1937 |
1938 |
1939 | B
1940 | 4
1941 |
1942 | 2
1943 | 1
1944 | eighth
1945 | up
1946 | end
1947 |
1948 |
1949 | 16
1950 |
1951 |
1952 |
1953 | A
1954 | 4
1955 |
1956 | 4
1957 | 2
1958 | quarter
1959 | down
1960 |
1961 | single
1962 | i
1963 |
1964 |
1965 | single
1966 | du
1967 |
1968 |
1969 | single
1970 | i
1971 |
1972 |
1973 |
1974 |
1975 | B
1976 | 4
1977 |
1978 | 4
1979 | 2
1980 | quarter
1981 | down
1982 |
1983 | single
1984 | hans
1985 |
1986 |
1987 | single
1988 | är
1989 |
1990 |
1991 | single
1992 | din
1993 |
1994 |
1995 |
1996 |
1997 | A
1998 | 4
1999 |
2000 | 4
2001 | 2
2002 | quarter
2003 | down
2004 |
2005 | single
2006 | vård
2007 |
2008 |
2009 | single
2010 | där
2011 |
2012 |
2013 | begin
2014 | bo
2015 |
2016 |
2017 |
2018 |
2019 | A
2020 | 4
2021 |
2022 | 4
2023 | 2
2024 | quarter
2025 | down
2026 |
2027 | single
2028 | får
2029 |
2030 |
2031 | begin
2032 | till
2033 |
2034 |
2035 | end
2036 | ning
2037 |
2038 |
2039 |
2040 |
2041 |
2042 |
2043 | B
2044 | 4
2045 |
2046 | 8
2047 | 1
2048 | half
2049 | up
2050 |
2051 |
2052 |
2053 | A
2054 | 4
2055 |
2056 | 8
2057 | 1
2058 | half
2059 | up
2060 |
2061 |
2062 |
2063 |
2064 |
2065 | 16
2066 |
2067 |
2068 |
2069 | A
2070 | 4
2071 |
2072 | 4
2073 | 2
2074 | quarter
2075 | down
2076 |
2077 |
2078 |
2079 |
2080 | begin
2081 | rö
2082 |
2083 |
2084 | middle
2085 | stä
2086 |
2087 |
2088 | begin
2089 | ta
2090 |
2091 |
2092 |
2093 |
2094 | G
2095 | 1
2096 | 4
2097 |
2098 | 4
2099 | 2
2100 | quarter
2101 | down
2102 |
2103 |
2104 |
2105 |
2106 |
2107 |
2108 | E
2109 | 4
2110 |
2111 | 8
2112 | 2
2113 | half
2114 | down
2115 |
2116 | end
2117 | na.
2118 |
2119 |
2120 | end
2121 | des.
2122 |
2123 |
2124 | end
2125 | gen.
2126 |
2127 |
2128 |
2129 | light-heavy
2130 |
2131 |
2132 |
2133 |
2134 |
2135 |
2136 |
2137 | 157.00
2138 |
2139 |
2140 |
2141 | 4
2142 |
2143 | 3
2144 |
2145 |
2146 | 4
2147 | 4
2148 |
2149 |
2150 | F
2151 | 4
2152 |
2153 |
2154 |
2155 |
2156 | E
2157 | 4
2158 |
2159 | 4
2160 | 1
2161 | quarter
2162 | up
2163 |
2164 |
2165 |
2166 | E
2167 | 4
2168 |
2169 | 4
2170 | 1
2171 | quarter
2172 | up
2173 |
2174 |
2175 |
2176 | E
2177 | 4
2178 |
2179 | 4
2180 | 1
2181 | quarter
2182 | up
2183 |
2184 |
2185 |
2186 | E
2187 | 4
2188 |
2189 | 4
2190 | 1
2191 | quarter
2192 | up
2193 |
2194 |
2195 | 16
2196 |
2197 |
2198 |
2199 | A
2200 | 3
2201 |
2202 | 4
2203 | 2
2204 | quarter
2205 | down
2206 |
2207 |
2208 |
2209 | E
2210 | 3
2211 |
2212 | 4
2213 | 2
2214 | quarter
2215 | down
2216 |
2217 |
2218 |
2219 | C
2220 | 1
2221 | 3
2222 |
2223 | 4
2224 | 2
2225 | quarter
2226 | down
2227 |
2228 |
2229 |
2230 | E
2231 | 3
2232 |
2233 | 4
2234 | 2
2235 | quarter
2236 | down
2237 |
2238 |
2239 |
2240 |
2241 |
2242 | E
2243 | 4
2244 |
2245 | 4
2246 | 1
2247 | quarter
2248 | up
2249 |
2250 |
2251 |
2252 | B
2253 | 3
2254 |
2255 | 4
2256 | 1
2257 | quarter
2258 | up
2259 |
2260 |
2261 |
2262 | B
2263 | 3
2264 |
2265 | 8
2266 | 1
2267 | half
2268 | up
2269 |
2270 |
2271 | 16
2272 |
2273 |
2274 |
2275 | A
2276 | 2
2277 |
2278 | 4
2279 | 2
2280 | quarter
2281 | down
2282 |
2283 |
2284 |
2285 | B
2286 | 2
2287 |
2288 | 4
2289 | 2
2290 | quarter
2291 | down
2292 |
2293 |
2294 |
2295 | E
2296 | 3
2297 |
2298 | 8
2299 | 2
2300 | half
2301 | down
2302 |
2303 |
2304 |
2305 |
2306 |
2307 |
2308 |
2309 |
2310 | D
2311 | 4
2312 |
2313 | 4
2314 | 1
2315 | quarter
2316 | natural
2317 | up
2318 |
2319 |
2320 |
2321 | B
2322 | 3
2323 |
2324 | 4
2325 | 1
2326 | quarter
2327 | up
2328 |
2329 |
2330 |
2331 | E
2332 | 4
2333 |
2334 | 4
2335 | 1
2336 | quarter
2337 | up
2338 |
2339 |
2340 |
2341 | E
2342 | 4
2343 |
2344 | 4
2345 | 1
2346 | quarter
2347 | up
2348 |
2349 |
2350 | 16
2351 |
2352 |
2353 |
2354 | B
2355 | 3
2356 |
2357 | 4
2358 | 2
2359 | quarter
2360 | down
2361 |
2362 |
2363 |
2364 | G
2365 | 1
2366 | 3
2367 |
2368 | 4
2369 | 2
2370 | quarter
2371 | down
2372 |
2373 |
2374 |
2375 | E
2376 | 3
2377 |
2378 | 4
2379 | 2
2380 | quarter
2381 | down
2382 |
2383 |
2384 |
2385 | A
2386 | 3
2387 |
2388 | 4
2389 | 2
2390 | quarter
2391 | down
2392 |
2393 |
2394 |
2395 |
2396 |
2397 | F
2398 | 1
2399 | 4
2400 |
2401 | 4
2402 | 1
2403 | quarter
2404 | up
2405 |
2406 |
2407 |
2408 |
2409 |
2410 |
2411 | E
2412 | 4
2413 |
2414 | 2
2415 | 1
2416 | eighth
2417 | up
2418 | begin
2419 |
2420 |
2421 |
2422 | D
2423 | 4
2424 |
2425 | 2
2426 | 1
2427 | eighth
2428 | up
2429 | end
2430 |
2431 |
2432 |
2433 |
2434 |
2435 |
2436 | C
2437 | 1
2438 | 4
2439 |
2440 | 8
2441 | 1
2442 | half
2443 | up
2444 |
2445 |
2446 | 16
2447 |
2448 |
2449 |
2450 | D
2451 | 3
2452 |
2453 | 4
2454 | 2
2455 | quarter
2456 | down
2457 |
2458 |
2459 |
2460 |
2461 |
2462 |
2463 | E
2464 | 3
2465 |
2466 | 4
2467 | 2
2468 | quarter
2469 | down
2470 |
2471 |
2472 |
2473 |
2474 |
2475 |
2476 | A
2477 | 2
2478 |
2479 | 8
2480 | 2
2481 | half
2482 | down
2483 |
2484 |
2485 |
2486 |
2487 |
2488 |
2489 |
2490 |
2491 | 157.00
2492 |
2493 |
2494 |
2495 |
2496 | E
2497 | 4
2498 |
2499 | 4
2500 | 1
2501 | quarter
2502 | up
2503 |
2504 |
2505 |
2506 | E
2507 | 4
2508 |
2509 | 4
2510 | 1
2511 | quarter
2512 | up
2513 |
2514 |
2515 |
2516 | F
2517 | 1
2518 | 4
2519 |
2520 | 4
2521 | 1
2522 | quarter
2523 | up
2524 |
2525 |
2526 |
2527 | C
2528 | 1
2529 | 4
2530 |
2531 | 4
2532 | 1
2533 | quarter
2534 | up
2535 |
2536 |
2537 | 16
2538 |
2539 |
2540 |
2541 | A
2542 | 3
2543 |
2544 | 4
2545 | 2
2546 | quarter
2547 | down
2548 |
2549 |
2550 |
2551 | G
2552 | 1
2553 | 3
2554 |
2555 | 4
2556 | 2
2557 | quarter
2558 | down
2559 |
2560 |
2561 |
2562 | F
2563 | 1
2564 | 3
2565 |
2566 | 4
2567 | 2
2568 | quarter
2569 | down
2570 |
2571 |
2572 |
2573 | E
2574 | 3
2575 |
2576 | 4
2577 | 2
2578 | quarter
2579 | down
2580 |
2581 |
2582 |
2583 |
2584 |
2585 | D
2586 | 4
2587 |
2588 | 4
2589 | 1
2590 | quarter
2591 | up
2592 |
2593 |
2594 |
2595 | D
2596 | 4
2597 |
2598 | 4
2599 | 1
2600 | quarter
2601 | up
2602 |
2603 |
2604 |
2605 | G
2606 | 1
2607 | 3
2608 |
2609 | 8
2610 | 1
2611 | half
2612 | up
2613 |
2614 |
2615 | 16
2616 |
2617 |
2618 |
2619 | D
2620 | 3
2621 |
2622 | 4
2623 | 2
2624 | quarter
2625 | down
2626 |
2627 |
2628 |
2629 | C
2630 | 1
2631 | 3
2632 |
2633 | 2
2634 | 2
2635 | eighth
2636 | down
2637 | begin
2638 |
2639 |
2640 |
2641 | B
2642 | 2
2643 |
2644 | 2
2645 | 2
2646 | eighth
2647 | down
2648 | end
2649 |
2650 |
2651 |
2652 | C
2653 | 1
2654 | 3
2655 |
2656 | 8
2657 | 2
2658 | half
2659 | down
2660 |
2661 |
2662 |
2663 |
2664 |
2665 |
2666 |
2667 |
2668 | F
2669 | 1
2670 | 3
2671 |
2672 | 4
2673 | 1
2674 | quarter
2675 | up
2676 |
2677 |
2678 |
2679 | G
2680 | 1
2681 | 3
2682 |
2683 | 4
2684 | 1
2685 | quarter
2686 | up
2687 |
2688 |
2689 |
2690 | A
2691 | 3
2692 |
2693 | 4
2694 | 1
2695 | quarter
2696 | up
2697 |
2698 |
2699 |
2700 | B
2701 | 3
2702 |
2703 | 4
2704 | 1
2705 | quarter
2706 | up
2707 |
2708 |
2709 | 16
2710 |
2711 |
2712 |
2713 | F
2714 | 1
2715 | 3
2716 |
2717 | 4
2718 | 2
2719 | quarter
2720 | down
2721 |
2722 |
2723 |
2724 | E
2725 | 3
2726 |
2727 | 4
2728 | 2
2729 | quarter
2730 | natural
2731 | down
2732 |
2733 |
2734 |
2735 | A
2736 | 3
2737 |
2738 | 4
2739 | 2
2740 | quarter
2741 | down
2742 |
2743 |
2744 |
2745 | G
2746 | 1
2747 | 3
2748 |
2749 | 4
2750 | 2
2751 | quarter
2752 | down
2753 |
2754 |
2755 |
2756 |
2757 |
2758 | F
2759 | 1
2760 | 4
2761 |
2762 | 4
2763 | 1
2764 | quarter
2765 | up
2766 |
2767 |
2768 |
2769 |
2770 |
2771 |
2772 | E
2773 | 4
2774 |
2775 | 4
2776 | 1
2777 | quarter
2778 | up
2779 |
2780 |
2781 |
2782 |
2783 |
2784 |
2785 | E
2786 | 4
2787 |
2788 | 8
2789 | 1
2790 | half
2791 | up
2792 |
2793 |
2794 | 16
2795 |
2796 |
2797 |
2798 | F
2799 | 1
2800 | 3
2801 |
2802 | 4
2803 | 2
2804 | quarter
2805 | down
2806 |
2807 |
2808 |
2809 |
2810 |
2811 |
2812 | G
2813 | 1
2814 | 3
2815 |
2816 | 4
2817 | 2
2818 | quarter
2819 | down
2820 |
2821 |
2822 |
2823 |
2824 |
2825 |
2826 | A
2827 | 3
2828 |
2829 | 8
2830 | 2
2831 | half
2832 | down
2833 |
2834 |
2835 |
2836 |
2837 |
2838 |
2839 |
2840 |
2841 | 157.00
2842 |
2843 |
2844 |
2845 |
2846 | E
2847 | 4
2848 |
2849 | 4
2850 | 1
2851 | quarter
2852 | up
2853 |
2854 |
2855 |
2856 | D
2857 | 4
2858 |
2859 | 4
2860 | 1
2861 | quarter
2862 | up
2863 |
2864 |
2865 |
2866 | C
2867 | 1
2868 | 4
2869 |
2870 | 4
2871 | 1
2872 | quarter
2873 | up
2874 |
2875 |
2876 |
2877 | B
2878 | 3
2879 |
2880 | 4
2881 | 1
2882 | quarter
2883 | up
2884 |
2885 |
2886 | 16
2887 |
2888 |
2889 |
2890 | A
2891 | 3
2892 |
2893 | 4
2894 | 2
2895 | quarter
2896 | down
2897 |
2898 |
2899 |
2900 | F
2901 | 1
2902 | 3
2903 |
2904 | 4
2905 | 2
2906 | quarter
2907 | down
2908 |
2909 |
2910 |
2911 | C
2912 | 1
2913 | 3
2914 |
2915 | 4
2916 | 2
2917 | quarter
2918 | down
2919 |
2920 |
2921 |
2922 | D
2923 | 3
2924 |
2925 | 4
2926 | 2
2927 | quarter
2928 | down
2929 |
2930 |
2931 |
2932 |
2933 |
2934 | C
2935 | 1
2936 | 4
2937 |
2938 | 2
2939 | 1
2940 | eighth
2941 | up
2942 | begin
2943 |
2944 |
2945 |
2946 | D
2947 | 4
2948 |
2949 | 2
2950 | 1
2951 | eighth
2952 | up
2953 | end
2954 |
2955 |
2956 |
2957 | E
2958 | 4
2959 |
2960 | 4
2961 | 1
2962 | quarter
2963 | up
2964 |
2965 |
2966 |
2967 | E
2968 | 4
2969 |
2970 | 8
2971 | 1
2972 | half
2973 | up
2974 |
2975 |
2976 | 16
2977 |
2978 |
2979 |
2980 | E
2981 | 3
2982 |
2983 | 4
2984 | 2
2985 | quarter
2986 | down
2987 |
2988 |
2989 |
2990 | E
2991 | 3
2992 |
2993 | 4
2994 | 2
2995 | quarter
2996 | down
2997 |
2998 |
2999 |
3000 | A
3001 | 2
3002 |
3003 | 8
3004 | 2
3005 | half
3006 | down
3007 |
3008 |
3009 |
3010 |
3011 |
3012 |
3013 |
3014 |
3015 | E
3016 | 4
3017 |
3018 | 4
3019 | 1
3020 | quarter
3021 | up
3022 |
3023 |
3024 |
3025 | B
3026 | 3
3027 |
3028 | 4
3029 | 1
3030 | quarter
3031 | up
3032 |
3033 |
3034 |
3035 | A
3036 | 3
3037 |
3038 | 4
3039 | 1
3040 | quarter
3041 | up
3042 |
3043 |
3044 |
3045 | B
3046 | 3
3047 |
3048 | 4
3049 | 1
3050 | quarter
3051 | up
3052 |
3053 |
3054 | 16
3055 |
3056 |
3057 |
3058 | E
3059 | 3
3060 |
3061 | 2
3062 | 2
3063 | eighth
3064 | down
3065 | begin
3066 |
3067 |
3068 |
3069 | F
3070 | 1
3071 | 3
3072 |
3073 | 2
3074 | 2
3075 | eighth
3076 | down
3077 | end
3078 |
3079 |
3080 |
3081 | G
3082 | 1
3083 | 3
3084 |
3085 | 4
3086 | 2
3087 | quarter
3088 | down
3089 |
3090 |
3091 |
3092 | F
3093 | 1
3094 | 3
3095 |
3096 | 4
3097 | 2
3098 | quarter
3099 | down
3100 |
3101 |
3102 |
3103 | E
3104 | 3
3105 |
3106 | 4
3107 | 2
3108 | quarter
3109 | down
3110 |
3111 |
3112 |
3113 |
3114 |
3115 | C
3116 | 1
3117 | 4
3118 |
3119 | 4
3120 | 1
3121 | quarter
3122 | up
3123 |
3124 |
3125 |
3126 |
3127 |
3128 |
3129 | B
3130 | 3
3131 |
3132 | 4
3133 | 1
3134 | quarter
3135 | up
3136 |
3137 |
3138 |
3139 |
3140 |
3141 |
3142 | B
3143 | 3
3144 |
3145 | 8
3146 | 1
3147 | half
3148 | up
3149 |
3150 |
3151 | 16
3152 |
3153 |
3154 |
3155 | A
3156 | 3
3157 |
3158 | 4
3159 | 2
3160 | quarter
3161 | down
3162 |
3163 |
3164 |
3165 |
3166 |
3167 |
3168 | B
3169 | 3
3170 |
3171 | 4
3172 | 2
3173 | quarter
3174 | down
3175 |
3176 |
3177 |
3178 |
3179 |
3180 |
3181 | E
3182 | 3
3183 |
3184 | 8
3185 | 2
3186 | half
3187 | down
3188 |
3189 |
3190 |
3191 |
3192 |
3193 |
3194 |
3195 |
3196 | 157.00
3197 |
3198 |
3199 |
3200 |
3201 | B
3202 | -1
3203 | 3
3204 |
3205 | 4
3206 | 1
3207 | quarter
3208 | flat
3209 | up
3210 |
3211 |
3212 |
3213 | A
3214 | 3
3215 |
3216 | 4
3217 | 1
3218 | quarter
3219 | up
3220 |
3221 |
3222 |
3223 | A
3224 | 3
3225 |
3226 | 2
3227 | 1
3228 | eighth
3229 | up
3230 | begin
3231 |
3232 |
3233 |
3234 | B
3235 | 3
3236 |
3237 | 2
3238 | 1
3239 | eighth
3240 | natural
3241 | up
3242 | end
3243 |
3244 |
3245 |
3246 | C
3247 | 1
3248 | 4
3249 |
3250 | 4
3251 | 1
3252 | quarter
3253 | sharp
3254 | up
3255 |
3256 |
3257 | 16
3258 |
3259 |
3260 |
3261 | G
3262 | 3
3263 |
3264 | 4
3265 | 2
3266 | quarter
3267 | natural
3268 | down
3269 |
3270 |
3271 |
3272 | A
3273 | 3
3274 |
3275 | 4
3276 | 2
3277 | quarter
3278 | down
3279 |
3280 |
3281 |
3282 | D
3283 | 3
3284 |
3285 | 4
3286 | 2
3287 | quarter
3288 | natural
3289 | down
3290 |
3291 |
3292 |
3293 | C
3294 | 1
3295 | 3
3296 |
3297 | 4
3298 | 2
3299 | quarter
3300 | sharp
3301 | down
3302 |
3303 |
3304 |
3305 |
3306 |
3307 | D
3308 | 4
3309 |
3310 | 4
3311 | 1
3312 | quarter
3313 | up
3314 |
3315 |
3316 |
3317 | E
3318 | 4
3319 |
3320 | 4
3321 | 1
3322 | quarter
3323 | up
3324 |
3325 |
3326 |
3327 | E
3328 | 4
3329 |
3330 | 8
3331 | 1
3332 | half
3333 | up
3334 |
3335 |
3336 | 16
3337 |
3338 |
3339 |
3340 | B
3341 | 2
3342 |
3343 | 4
3344 | 2
3345 | quarter
3346 | down
3347 |
3348 |
3349 |
3350 | A
3351 | 2
3352 |
3353 | 4
3354 | 2
3355 | quarter
3356 | down
3357 |
3358 |
3359 |
3360 | E
3361 | 3
3362 |
3363 | 8
3364 | 2
3365 | half
3366 | down
3367 |
3368 |
3369 |
3370 |
3371 |
3372 |
3373 |
3374 |
3375 | E
3376 | 4
3377 |
3378 | 4
3379 | 1
3380 | quarter
3381 | up
3382 |
3383 |
3384 |
3385 | E
3386 | 4
3387 |
3388 | 4
3389 | 1
3390 | quarter
3391 | up
3392 |
3393 |
3394 |
3395 | F
3396 | 1
3397 | 4
3398 |
3399 | 4
3400 | 1
3401 | quarter
3402 | up
3403 |
3404 |
3405 |
3406 | F
3407 | 1
3408 | 4
3409 |
3410 | 4
3411 | 1
3412 | quarter
3413 | up
3414 |
3415 |
3416 | 16
3417 |
3418 |
3419 |
3420 | A
3421 | 3
3422 |
3423 | 4
3424 | 2
3425 | quarter
3426 | down
3427 |
3428 |
3429 |
3430 | G
3431 | 1
3432 | 3
3433 |
3434 | 4
3435 | 2
3436 | quarter
3437 | down
3438 |
3439 |
3440 |
3441 | F
3442 | 1
3443 | 3
3444 |
3445 | 4
3446 | 2
3447 | quarter
3448 | down
3449 |
3450 |
3451 |
3452 | E
3453 | 3
3454 |
3455 | 4
3456 | 2
3457 | quarter
3458 | down
3459 |
3460 |
3461 |
3462 |
3463 |
3464 | F
3465 | 1
3466 | 4
3467 |
3468 | 4
3469 | 1
3470 | quarter
3471 | up
3472 |
3473 |
3474 |
3475 | E
3476 | 4
3477 |
3478 | 2
3479 | 1
3480 | eighth
3481 | up
3482 | begin
3483 |
3484 |
3485 |
3486 | D
3487 | 4
3488 |
3489 | 2
3490 | 1
3491 | eighth
3492 | natural
3493 | up
3494 | end
3495 |
3496 |
3497 |
3498 | C
3499 | 1
3500 | 4
3501 |
3502 | 8
3503 | 1
3504 | half
3505 | up
3506 |
3507 |
3508 | 16
3509 |
3510 |
3511 |
3512 | D
3513 | 1
3514 | 3
3515 |
3516 | 4
3517 | 2
3518 | quarter
3519 | sharp
3520 | down
3521 |
3522 |
3523 |
3524 |
3525 |
3526 |
3527 | E
3528 | 3
3529 |
3530 | 4
3531 | 2
3532 | quarter
3533 | down
3534 |
3535 |
3536 |
3537 |
3538 |
3539 |
3540 | A
3541 | 2
3542 |
3543 | 8
3544 | 2
3545 | half
3546 | down
3547 |
3548 |
3549 |
3550 |
3551 |
3552 | light-heavy
3553 |
3554 |
3555 |
3556 |
3557 |
--------------------------------------------------------------------------------
/src/App.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
7 |
8 |
9 | Playback settings
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
27 |
28 |
29 |
30 |
77 |
78 |
86 |
--------------------------------------------------------------------------------
/src/assets/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jimutt/osmd-playback-demo/c47d1b22ce1cbc4bb24a41e079b5fb5d09660b2a/src/assets/logo.png
--------------------------------------------------------------------------------
/src/components/BpmSlider.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 | this.$emit('update:bpm', Number(val))"
10 | thumb-label
11 | >
12 |
13 |
14 |
15 |
20 |
--------------------------------------------------------------------------------
/src/components/InstrumentControl.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
{{ instrument.name }}
4 |
5 |
{{ voice.name }}
6 |
7 |
8 |
9 |
10 |
11 |
21 |
--------------------------------------------------------------------------------
/src/components/PlaybackControls.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
10 |
11 |
12 | this.playbackEngine.jumpToStep(val)"
19 | class="progress-slider"
20 | >
21 |
22 |
23 | {{ scoreTitle }}
24 |
25 |
26 |
27 |
30 |
39 | play_arrow
40 |
41 |
42 | pause
43 |
44 |
45 |
46 |
47 |
48 | stop
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
66 |
67 |
--------------------------------------------------------------------------------
/src/components/PlaybackSidebar.vue:
--------------------------------------------------------------------------------
1 |
2 |
51 |
52 |
53 |
81 |
82 |
87 |
--------------------------------------------------------------------------------
/src/components/Score.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
56 |
57 |
69 |
--------------------------------------------------------------------------------
/src/components/VolumeSlider.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 | this.$emit('update:volume', Number(val))"
11 | >
12 |
13 |
14 |
15 |
20 |
--------------------------------------------------------------------------------
/src/instruments.js:
--------------------------------------------------------------------------------
1 | export default [
2 | "accordion",
3 | "acoustic_bass",
4 | "acoustic_grand_piano",
5 | "acoustic_guitar_nylon",
6 | "acoustic_guitar_steel",
7 | "agogo",
8 | "alto_sax",
9 | "applause",
10 | "bagpipe",
11 | "banjo",
12 | "baritone_sax",
13 | "bassoon",
14 | "bird_tweet",
15 | "blown_bottle",
16 | "brass_section",
17 | "breath_noise",
18 | "bright_acoustic_piano",
19 | "celesta",
20 | "cello",
21 | "choir_aahs",
22 | "church_organ",
23 | "clarinet",
24 | "clavinet",
25 | "contrabass",
26 | "distortion_guitar",
27 | "drawbar_organ",
28 | "dulcimer",
29 | "electric_bass_finger",
30 | "electric_bass_pick",
31 | "electric_grand_piano",
32 | "electric_guitar_clean",
33 | "electric_guitar_jazz",
34 | "electric_guitar_muted",
35 | "electric_piano_1",
36 | "electric_piano_2",
37 | "english_horn",
38 | "fiddle",
39 | "flute",
40 | "french_horn",
41 | "fretless_bass",
42 | "fx_1_rain",
43 | "fx_2_soundtrack",
44 | "fx_3_crystal",
45 | "fx_4_atmosphere",
46 | "fx_5_brightness",
47 | "fx_6_goblins",
48 | "fx_7_echoes",
49 | "fx_8_scifi",
50 | "glockenspiel",
51 | "guitar_fret_noise",
52 | "guitar_harmonics",
53 | "gunshot",
54 | "harmonica",
55 | "harpsichord",
56 | "helicopter",
57 | "honkytonk_piano",
58 | "kalimba",
59 | "koto",
60 | "lead_1_square",
61 | "lead_2_sawtooth",
62 | "lead_3_calliope",
63 | "lead_4_chiff",
64 | "lead_5_charang",
65 | "lead_6_voice",
66 | "lead_7_fifths",
67 | "lead_8_bass__lead",
68 | "marimba",
69 | "melodic_tom",
70 | "music_box",
71 | "muted_trumpet",
72 | "oboe",
73 | "ocarina",
74 | "orchestra_hit",
75 | "orchestral_harp",
76 | "overdriven_guitar",
77 | "pad_1_new_age",
78 | "pad_2_warm",
79 | "pad_3_polysynth",
80 | "pad_4_choir",
81 | "pad_5_bowed",
82 | "pad_6_metallic",
83 | "pad_7_halo",
84 | "pad_8_sweep",
85 | "pan_flute",
86 | "percussive_organ",
87 | "piccolo",
88 | "pizzicato_strings",
89 | "recorder",
90 | "reed_organ",
91 | "reverse_cymbal",
92 | "rock_organ",
93 | "seashore",
94 | "shakuhachi",
95 | "shamisen",
96 | "shanai",
97 | "sitar",
98 | "slap_bass_1",
99 | "slap_bass_2",
100 | "soprano_sax",
101 | "steel_drums",
102 | "string_ensemble_1",
103 | "string_ensemble_2",
104 | "synth_bass_1",
105 | "synth_bass_2",
106 | "synth_brass_1",
107 | "synth_brass_2",
108 | "synth_choir",
109 | "synth_drum",
110 | "synth_strings_1",
111 | "synth_strings_2",
112 | "taiko_drum",
113 | "tango_accordion",
114 | "telephone_ring",
115 | "tenor_sax",
116 | "timpani",
117 | "tinkle_bell",
118 | "tremolo_strings",
119 | "trombone",
120 | "trumpet",
121 | "tuba",
122 | "tubular_bells",
123 | "vibraphone",
124 | "viola",
125 | "violin",
126 | "voice_oohs",
127 | "whistle",
128 | "woodblock",
129 | "xylophone"
130 | ]
--------------------------------------------------------------------------------
/src/main.js:
--------------------------------------------------------------------------------
1 | import '@babel/polyfill'
2 | import Vue from 'vue'
3 | import './plugins/vuetify'
4 | import App from './App.vue'
5 |
6 | import Vuetify from 'vuetify'
7 | import 'vuetify/dist/vuetify.min.css'
8 |
9 | Vue.use(Vuetify)
10 | Vue.config.productionTip = false
11 |
12 | new Vue({
13 | render: h => h(App)
14 | }).$mount('#app')
--------------------------------------------------------------------------------
/src/osmd/PlaybackEngine.js:
--------------------------------------------------------------------------------
1 | import Soundfont from 'soundfont-player';
2 | import PlaybackScheduler from './PlaybackScheduler';
3 |
4 | const playbackStates = {
5 | INIT: 'INIT',
6 | PLAYING: 'PLAYING',
7 | STOPPED: 'STOPPED',
8 | PAUSED: 'PAUSED'
9 | };
10 |
11 | export default class PlaybackEngine {
12 | constructor() {
13 | this.ac = new AudioContext();
14 | this.ac.suspend();
15 | this.defaultBpm = 100;
16 |
17 | this.cursor = null;
18 | this.sheet = null;
19 | this.iterator = null;
20 | this.denominator = null;
21 |
22 | this.scheduler = null;
23 |
24 | this.iterationSteps = 0;
25 | this.currentIterationStep = 0;
26 |
27 | this.timeoutHandles = [];
28 |
29 | this.playbackSettings = {
30 | bpm: this.defaultBpm,
31 | instrument: null,
32 | volumes: {
33 | master: 1,
34 | instruments: []
35 | }
36 | };
37 |
38 | this.state = playbackStates.INIT;
39 | }
40 |
41 | get wholeNoteLength() {
42 | return Math.round((60 / this.playbackSettings.bpm) * this.denominator * 1000);
43 | }
44 |
45 | async loadInstrument(instrumentName) {
46 | this.playbackSettings.instrument = await Soundfont.instrument(this.ac, instrumentName);
47 | }
48 |
49 | loadScore(osmd) {
50 | this.sheet = osmd.sheet;
51 | this.cursor = osmd.cursor;
52 | this.denominator = this.sheet.playbackSettings.rhythm.denominator;
53 | if (this.sheet.HasBPMInfo) {
54 | this.setBpm(this.sheet.DefaultStartTempoInBpm);
55 | }
56 |
57 | let instruments = this.sheet.Instruments.map(i => {
58 | return {
59 | name: i.Name,
60 | id: i.id,
61 | voices: i.Voices.map(v => {
62 | return {
63 | name: 'Voice ' + v.VoiceId,
64 | id: v.VoiceId,
65 | volume: 1
66 | };
67 | })
68 | };
69 | });
70 |
71 | this.playbackSettings.volumes.instruments = instruments;
72 |
73 | this.scheduler = new PlaybackScheduler(this.denominator, this.wholeNoteLength, this.ac, (delay, notes) =>
74 | this._notePlaybackCallback(delay, notes)
75 | );
76 | this._countAndSetIterationSteps();
77 | }
78 |
79 | async play() {
80 | if (!this.playbackSettings.instrument) await this.loadInstrument('acoustic_grand_piano');
81 | await this.ac.resume();
82 |
83 | this.cursor.show();
84 |
85 | this.state = playbackStates.PLAYING;
86 | this.scheduler.start();
87 | }
88 |
89 | async stop() {
90 | this.state = playbackStates.STOPPED;
91 | if (this.playbackSettings.instrument) this.playbackSettings.instrument.stop();
92 | this._clearTimeouts();
93 | this.scheduler.reset();
94 | this.cursor.reset();
95 | this.currentIterationStep = 0;
96 | this.cursor.hide();
97 | }
98 |
99 | pause() {
100 | this.state = playbackStates.PAUSED;
101 | this.ac.suspend();
102 | if (this.playbackSettings.instrument) this.playbackSettings.instrument.stop();
103 | this.scheduler.setIterationStep(this.currentIterationStep);
104 | this.scheduler.pause();
105 | this._clearTimeouts();
106 | }
107 |
108 | resume() {
109 | this.state = playbackStates.PLAYING;
110 | this.scheduler.resume();
111 | this.ac.resume();
112 | }
113 |
114 | jumpToStep(step) {
115 | this.pause();
116 | console.log('Jump to step ' + step);
117 | if (this.currentIterationStep > step) {
118 | this.cursor.hide();
119 | this.cursor.reset();
120 | this.currentIterationStep = 0;
121 | }
122 | while (this.currentIterationStep < step) {
123 | this.cursor.next();
124 | ++this.currentIterationStep;
125 | }
126 | let schedulerStep = this.currentIterationStep;
127 | if (this.currentIterationStep > 0 && this.currentIterationStep < this.iterationSteps) ++schedulerStep;
128 | this.scheduler.setIterationStep(schedulerStep);
129 | this.cursor.show();
130 | }
131 |
132 | setVoiceVolume(instrumentId, voiceId, volume) {
133 | let playbackInstrument = this.playbackSettings.volumes.instruments.find(i => i.id === instrumentId);
134 | let playbackVoice = playbackInstrument.voices.find(v => v.id === voiceId);
135 | playbackVoice.volume = volume;
136 | }
137 |
138 | setBpm(bpm) {
139 | this.playbackSettings.bpm = bpm;
140 | if (this.scheduler) this.scheduler.wholeNoteLength = this.wholeNoteLength;
141 | }
142 |
143 | _countAndSetIterationSteps() {
144 | this.cursor.reset();
145 | let steps = 0;
146 | while (!this.cursor.iterator.endReached) {
147 | if (this.cursor.iterator.currentVoiceEntries)
148 | this.scheduler.loadNotes(this.cursor.iterator.currentVoiceEntries);
149 | this.cursor.next();
150 | ++steps;
151 | }
152 | this.iterationSteps = steps;
153 | this.cursor.reset();
154 | }
155 |
156 | _notePlaybackCallback(audioDelay, notes) {
157 | if (this.state !== playbackStates.PLAYING) return;
158 | let scheduledNotes = [];
159 |
160 | for (let note of notes) {
161 | let noteDuration = this._getNoteDuration(note);
162 | if (noteDuration === 0) continue;
163 | let noteVolume = this._getNoteVolume(note);
164 |
165 | scheduledNotes.push({
166 | note: note.halfTone,
167 | duration: noteDuration / 1000,
168 | gain: noteVolume
169 | });
170 | }
171 |
172 | this.playbackSettings.instrument.schedule(this.ac.currentTime + audioDelay, scheduledNotes);
173 |
174 | this.timeoutHandles.push(
175 | setTimeout(() => this._iterationCallback(), Math.max(0, audioDelay * 1000 - 40))
176 | ); // Subtracting 40 milliseconds to compensate for update delay
177 | }
178 |
179 | // Used to avoid duplicate cursor movements after a rapid pause/resume action
180 | _clearTimeouts() {
181 | for (let h of this.timeoutHandles) {
182 | clearTimeout(h);
183 | }
184 | this.timeoutHandles = [];
185 | }
186 |
187 | _iterationCallback() {
188 | if (this.state !== playbackStates.PLAYING) return;
189 | if (this.currentIterationStep > 0) this.cursor.next();
190 | ++this.currentIterationStep;
191 | }
192 |
193 | _getNoteDuration(note) {
194 | let duration = note.length.realValue * this.wholeNoteLength;
195 | if (note.NoteTie) {
196 | if (Object.is(note.NoteTie.StartNote, note) && note.NoteTie.notes[1]) {
197 | duration += note.NoteTie.notes[1].length.realValue * this.wholeNoteLength;
198 | } else {
199 | duration = 0;
200 | }
201 | }
202 | return duration;
203 | }
204 |
205 | _getNoteVolume(note) {
206 | let instrument = note.voiceEntry.ParentVoice.Parent;
207 | let playbackInstrument = this.playbackSettings.volumes.instruments.find(i => i.id === instrument.Id);
208 | let playbackVoice = playbackInstrument.voices.find(v => v.id === note.voiceEntry.ParentVoice.VoiceId);
209 | return playbackVoice.volume;
210 | }
211 | }
212 |
--------------------------------------------------------------------------------
/src/osmd/PlaybackScheduler.js:
--------------------------------------------------------------------------------
1 | import StepQueue from './StepQueue';
2 |
3 | export default class PlaybackScheduler {
4 | denominator;
5 | wholeNoteLength;
6 | stepQueue = new StepQueue();
7 | stepQueueIndex = 0;
8 | scheduledTicks = new Set();
9 |
10 | currentTick = 0;
11 | currentTickTimestamp = 0;
12 |
13 | _audioContextStartTime = 0;
14 |
15 | _schedulerInterval = null;
16 | _scheduleInterval = 200; // Milliseconds
17 | _schedulePeriod = 1500;
18 | _tickDenominator = 1024;
19 |
20 | _lastTickOffset = 300; // Hack to get the initial notes play better
21 |
22 | playing = false;
23 |
24 | _loaderFutureTicks = new Set();
25 |
26 | constructor(denominator, wholeNoteLength, audioContext, noteSchedulingCallback, iterationCallback) {
27 | this.noteSchedulingCallback = noteSchedulingCallback;
28 | this.iterationCallback = iterationCallback;
29 | this.denominator = denominator;
30 | this.wholeNoteLength = wholeNoteLength;
31 | this.audioContext = audioContext;
32 | }
33 |
34 | get schedulePeriodTicks() {
35 | return this._schedulePeriod / this.tickDuration;
36 | }
37 |
38 | get audioContextTime() {
39 | if (!this.audioContext) return 0;
40 | return (this.audioContext.currentTime - this._audioContextStartTime) * 1000;
41 | }
42 |
43 | get _calculatedTick() {
44 | return (
45 | this.currentTick + Math.round((this.audioContextTime - this.currentTickTimestamp) / this.tickDuration)
46 | );
47 | }
48 |
49 | get tickDuration() {
50 | return this.wholeNoteLength / this._tickDenominator;
51 | }
52 |
53 | start() {
54 | this.playing = true;
55 | this.stepQueue.sort();
56 | console.log('AudioContext time: ', this.audioContextTime);
57 | console.log('Tick duration: ', this.tickDuration);
58 | this._audioContextStartTime = this.audioContext.currentTime;
59 | this.currentTickTimestamp = this.audioContextTime;
60 | if (!this._schedulerInterval) {
61 | this._schedulerInterval = setInterval(() => this._scheduleIterationStep(), this._scheduleInterval);
62 | }
63 | }
64 |
65 | setIterationStep(step) {
66 | step = Math.min(this.stepQueue.steps.length - 1, step);
67 | this.stepQueueIndex = step;
68 | this.currentTick = this.stepQueue.steps[this.stepQueueIndex].tick;
69 | }
70 |
71 | pause() {
72 | this.playing = false;
73 | }
74 |
75 | resume() {
76 | this.playing = true;
77 | this.currentTickTimestamp = this.audioContextTime;
78 | }
79 |
80 | reset() {
81 | this.playing = false;
82 | this.currentTick = 0;
83 | this.currentTickTimestamp = 0;
84 | this.stepQueueIndex = 0;
85 | clearInterval(this._scheduleInterval);
86 | this._schedulerInterval = null;
87 | }
88 |
89 | loadNotes(currentVoiceEntries) {
90 | let thisTick = this._lastTickOffset;
91 | if (this.stepQueue.steps.length > 0) {
92 | thisTick = Math.min(...this._loaderFutureTicks);
93 | }
94 |
95 | for (let entry of currentVoiceEntries) {
96 | for (let note of entry.notes) {
97 | this._loaderFutureTicks.add(thisTick + note.length.realValue * this._tickDenominator);
98 | let step = { tick: thisTick };
99 | this.stepQueue.add(step, note);
100 | }
101 | }
102 |
103 | for (let tick of this._loaderFutureTicks) {
104 | if (tick <= thisTick) this._loaderFutureTicks.delete(tick);
105 | }
106 | }
107 |
108 | _scheduleIterationStep() {
109 | if (!this.playing) return;
110 | this.currentTick = this._calculatedTick;
111 | this.currentTickTimestamp = this.audioContextTime;
112 |
113 | let nextTick = this.stepQueue.steps[this.stepQueueIndex]
114 | ? this.stepQueue.steps[this.stepQueueIndex].tick
115 | : undefined;
116 | while (
117 | nextTick &&
118 | this.currentTickTimestamp + (nextTick - this.currentTick) * this.tickDuration <=
119 | this.currentTickTimestamp + this._schedulePeriod
120 | ) {
121 | let step = this.stepQueue.steps[this.stepQueueIndex];
122 |
123 | let timeToTick = (step.tick - this.currentTick) * this.tickDuration;
124 | if (timeToTick < 0) timeToTick = 0;
125 |
126 | this.scheduledTicks.add(step.tick);
127 | this.noteSchedulingCallback(timeToTick / 1000, step.notes);
128 |
129 | this.stepQueueIndex++;
130 | nextTick = this.stepQueue.steps[this.stepQueueIndex]
131 | ? this.stepQueue.steps[this.stepQueueIndex].tick
132 | : undefined;
133 | }
134 |
135 | for (let tick of this.scheduledTicks) {
136 | if (tick <= this.currentTick) {
137 | this.scheduledTicks.delete(tick);
138 | }
139 | }
140 | }
141 | }
142 |
--------------------------------------------------------------------------------
/src/osmd/StepQueue.js:
--------------------------------------------------------------------------------
1 | export default class StepQueue {
2 | steps = [];
3 |
4 | constructor() {}
5 |
6 | [Symbol.iterator]() {
7 | return this.steps.values();
8 | }
9 |
10 | add(stepObject, note) {
11 | let existingStep = this.steps.find(s => s.tick === stepObject.tick);
12 | if (existingStep) {
13 | stepObject = existingStep;
14 | stepObject.notes.push(note);
15 | } else {
16 | stepObject.notes = [note];
17 | this.steps.push(stepObject);
18 | }
19 | }
20 |
21 | delete(value) {
22 | let index = this.steps.findIndex(v => v.tick === value.tick);
23 | if (index != null) this.steps.splice(index, 1);
24 | }
25 |
26 | sort() {
27 | this.steps.sort((a, b) => (a.tick > b.tick ? 1 : 0));
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/src/plugins/vuetify.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import Vuetify from 'vuetify'
3 | import 'vuetify/dist/vuetify.min.css'
4 |
5 | Vue.use(Vuetify, {
6 | })
7 |
--------------------------------------------------------------------------------
/src/scores.js:
--------------------------------------------------------------------------------
1 | export default [{
2 | value: "https://opensheetmusicdisplay.github.io/demo/sheets/Beethoven_AnDieFerneGeliebte.xml",
3 | text: "Beethoven, L.v. - An die ferne Geliebte"
4 | },
5 | {
6 | value: "score.xml",
7 | text: "Herren är min herde god"
8 | },
9 | // {
10 | // value: "https://opensheetmusicdisplay.github.io/demo/sheets/MuzioClementi_SonatinaOpus36No1_Part1.xml",
11 | // text: "Clementi, M. - Sonatina Op.36 No.1 Pt.1"
12 | // },
13 | // {
14 | // value: "https://opensheetmusicdisplay.github.io/demo/sheets/MuzioClementi_SonatinaOpus36No1_Part2.xml",
15 | // text: "Clementi, M. - Sonatina Op.36 No.1 Pt.2"
16 | // },
17 | {
18 | value: "https://opensheetmusicdisplay.github.io/demo/sheets/MuzioClementi_SonatinaOpus36No3_Part1.xml",
19 | text: "Clementi, M. - Sonatina Op.36 No.3 Pt.1"
20 | },
21 | {
22 | value: "https://opensheetmusicdisplay.github.io/demo/sheets/MuzioClementi_SonatinaOpus36No3_Part2.xml",
23 | text: "Clementi, M. - Sonatina Op.36 No.3 Pt.2"
24 | },
25 | {
26 | value: "https://opensheetmusicdisplay.github.io/demo/sheets/JohannSebastianBach_PraeludiumInCDur_BWV846_1.xml",
27 | text: "Bach, J.S. - Praeludium in C-Dur BWV846 1"
28 | },
29 | // {
30 | // value: "https://opensheetmusicdisplay.github.io/demo/sheets/JohannSebastianBach_Air.xml",
31 | // text: "Bach, J.S. - Air"
32 | // },
33 | // {
34 | // value: "https://opensheetmusicdisplay.github.io/demo/sheets/CharlesGounod_Meditation.xml",
35 | // text: "Gounod, C. - Méditation"
36 | // },
37 | // {
38 | // value: "https://opensheetmusicdisplay.github.io/demo/sheets/JosephHaydn_ConcertanteCello.xml",
39 | // text: "Haydn, J. - Concertante Cello"
40 | // },
41 | {
42 | value: "https://opensheetmusicdisplay.github.io/demo/sheets/ScottJoplin_EliteSyncopations.xml",
43 | text: "Joplin, S. - Elite Syncopations"
44 | },
45 | {
46 | value: "https://opensheetmusicdisplay.github.io/demo/sheets/ScottJoplin_The_Entertainer.xml",
47 | text: "Joplin, S. - The Entertainer"
48 | },
49 | // {
50 | // value: "https://opensheetmusicdisplay.github.io/demo/sheets/Mozart_AnChloe.xml",
51 | // text: "Mozart, W.A. - An Chloe"
52 | // },
53 | // {
54 | // value: "https://opensheetmusicdisplay.github.io/demo/sheets/Mozart_DasVeilchen.xml",
55 | // text: "Mozart, W.A. - Das Veilchen"
56 | // },
57 | // {
58 | // value: "https://opensheetmusicdisplay.github.io/demo/sheets/Mozart_Clarinet_Quintet_Excerpt.mxl",
59 | // text: "Mozart, W.A.- Clarinet Quintet (Excerpt)"
60 | // },
61 | {
62 | value: "https://opensheetmusicdisplay.github.io/demo/sheets/Land_der_Berge.musicxml",
63 | text: "Mozart/Holzer - Land der Berge (national anthem of Austria)"
64 | },
65 | // {
66 | // value: "https://opensheetmusicdisplay.github.io/demo/sheets/OSMD_function_test_all.xml",
67 | // text: "OSMD Function Test - All"
68 | // },
69 | // {
70 | // value: "https://opensheetmusicdisplay.github.io/demo/sheets/OSMD_function_test_GraceNotes.xml",
71 | // text: "OSMD Function Test - Grace Notes"
72 | // },
73 | // {
74 | // value: "https://opensheetmusicdisplay.github.io/demo/sheets/OSMD_function_test_Ornaments.xml",
75 | // text: "OSMD Function Test - Ornaments"
76 | // },
77 | // {
78 | // value: "https://opensheetmusicdisplay.github.io/demo/sheets/OSMD_function_test_accidentals.musicxml",
79 | // text: "OSMD Function Test - Accidentals"
80 | // },
81 | // {
82 | // value: "https://opensheetmusicdisplay.github.io/demo/sheets/OSMD_function_test_expressions.musicxml",
83 | // text: "OSMD Function Test - Expressions"
84 | // },
85 | // {
86 | // value: "https://opensheetmusicdisplay.github.io/demo/sheets/OSMD_function_test_noteHeadShapes.musicxml",
87 | // text: "OSMD Function Test - NoteHeadShapes"
88 | // },
89 | // {
90 | // value: "https://opensheetmusicdisplay.github.io/demo/sheets/OSMD_function_test_drumset.musicxml",
91 | // text: "OSMD Function Test - Drumset"
92 | // },
93 | {
94 | value: "https://opensheetmusicdisplay.github.io/demo/sheets/Schubert_An_die_Musik.xml",
95 | text: "Schubert, F. - An Die Musik"
96 | },
97 | // {
98 | // value: "https://opensheetmusicdisplay.github.io/demo/sheets/ActorPreludeSample.xml",
99 | // text: "Actor, L. - Prelude (Sample)"
100 | // },
101 | // {
102 | // value: "https://opensheetmusicdisplay.github.io/demo/sheets/Saltarello.mxl",
103 | // text: "Anonymous - Saltarello"
104 | // },
105 | // {
106 | // value: "https://opensheetmusicdisplay.github.io/demo/sheets/Debussy_Mandoline.xml",
107 | // text: "Debussy, C. - Mandoline"
108 | // },
109 | {
110 | value: "https://opensheetmusicdisplay.github.io/demo/sheets/Parlez-moi.mxl",
111 | text: "Levasseur, F. - Parlez Mois"
112 | },
113 | {
114 | value: "https://opensheetmusicdisplay.github.io/demo/sheets/Dichterliebe01.xml",
115 | text: "Schumann, R. - Dichterliebe"
116 | },
117 | {
118 | value: "https://opensheetmusicdisplay.github.io/demo/sheets/TelemannWV40.102_Sonate-Nr.1.1-Dolce.xml",
119 | text: "Telemann, G.P. - Sonate-Nr.1.1-Dolce"
120 | },
121 | {
122 | value: "https://opensheetmusicdisplay.github.io/demo/sheets/TelemannWV40.102_Sonate-Nr.1.2-Allegro-F-Dur.xml",
123 | text: "Telemann, G.P. - Sonate-Nr.1.2-Allegro"
124 | },
125 | ];
--------------------------------------------------------------------------------
/vue.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | productionSourceMap: false
3 | }
--------------------------------------------------------------------------------