├── .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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 14 | 15 | 20 | -------------------------------------------------------------------------------- /src/components/InstrumentControl.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 21 | -------------------------------------------------------------------------------- /src/components/PlaybackControls.vue: -------------------------------------------------------------------------------- 1 | 57 | 58 | 66 | 67 | -------------------------------------------------------------------------------- /src/components/PlaybackSidebar.vue: -------------------------------------------------------------------------------- 1 | 52 | 53 | 81 | 82 | 87 | -------------------------------------------------------------------------------- /src/components/Score.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 56 | 57 | 69 | -------------------------------------------------------------------------------- /src/components/VolumeSlider.vue: -------------------------------------------------------------------------------- 1 | 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 | } --------------------------------------------------------------------------------