├── .gitattributes ├── .gitignore ├── PRIVACY.md ├── .github └── FUNDING.yml ├── media ├── 128.png ├── 16.png ├── 256.png ├── 32.png ├── 512.png ├── 64.png ├── 1024.png ├── icon128.png ├── icon48.png ├── safari-install-2560-1600.png ├── midi-player-screenshot-272x42.png ├── midi-player-screenshot-440x280.png ├── midi-player-screenshot-640x400.png ├── PRIVACY.md ├── en.md ├── ru.md ├── es.md ├── README.md └── icon.svg ├── test ├── test.mid ├── embed.html ├── bgsound.html ├── audio.html ├── object.html └── url.html ├── firefox ├── midi-player │ ├── icon48.png │ ├── icon128.png │ ├── content.js │ ├── _locales │ │ ├── en │ │ │ └── messages.json │ │ ├── ru │ │ │ └── messages.json │ │ └── es │ │ │ └── messages.json │ └── manifest.json └── README.md ├── safari ├── midi-player │ ├── midi-player │ │ ├── Assets.xcassets │ │ │ ├── Contents.json │ │ │ └── AppIcon.appiconset │ │ │ │ ├── 128.png │ │ │ │ ├── 16.png │ │ │ │ ├── 256.png │ │ │ │ ├── 32.png │ │ │ │ ├── 512.png │ │ │ │ ├── 64.png │ │ │ │ ├── 1024.png │ │ │ │ ├── 256-1.png │ │ │ │ ├── 32-1.png │ │ │ │ ├── 512-1.png │ │ │ │ └── Contents.json │ │ ├── midi_player.entitlements │ │ ├── AppDelegate.swift │ │ ├── Base.lproj │ │ │ └── MainMenu.xib │ │ └── Info.plist │ ├── extension │ │ ├── SafariExtensionHandler.swift │ │ ├── content.js │ │ ├── extension.entitlements │ │ └── Info.plist │ └── midi-player.xcodeproj │ │ └── project.pbxproj └── README.md ├── src ├── content.js └── tools │ ├── assemble.js │ └── main.js ├── package.json ├── Gruntfile.js └── README.md /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json 3 | .DS_Store 4 | -------------------------------------------------------------------------------- /PRIVACY.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jazz-soft/midi-player/HEAD/PRIVACY.md -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: jazz-soft 2 | custom: https://paypal.me/jazzsoft 3 | -------------------------------------------------------------------------------- /media/128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jazz-soft/midi-player/HEAD/media/128.png -------------------------------------------------------------------------------- /media/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jazz-soft/midi-player/HEAD/media/16.png -------------------------------------------------------------------------------- /media/256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jazz-soft/midi-player/HEAD/media/256.png -------------------------------------------------------------------------------- /media/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jazz-soft/midi-player/HEAD/media/32.png -------------------------------------------------------------------------------- /media/512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jazz-soft/midi-player/HEAD/media/512.png -------------------------------------------------------------------------------- /media/64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jazz-soft/midi-player/HEAD/media/64.png -------------------------------------------------------------------------------- /test/test.mid: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jazz-soft/midi-player/HEAD/test/test.mid -------------------------------------------------------------------------------- /media/1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jazz-soft/midi-player/HEAD/media/1024.png -------------------------------------------------------------------------------- /media/icon128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jazz-soft/midi-player/HEAD/media/icon128.png -------------------------------------------------------------------------------- /media/icon48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jazz-soft/midi-player/HEAD/media/icon48.png -------------------------------------------------------------------------------- /firefox/midi-player/icon48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jazz-soft/midi-player/HEAD/firefox/midi-player/icon48.png -------------------------------------------------------------------------------- /firefox/midi-player/icon128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jazz-soft/midi-player/HEAD/firefox/midi-player/icon128.png -------------------------------------------------------------------------------- /media/safari-install-2560-1600.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jazz-soft/midi-player/HEAD/media/safari-install-2560-1600.png -------------------------------------------------------------------------------- /media/midi-player-screenshot-272x42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jazz-soft/midi-player/HEAD/media/midi-player-screenshot-272x42.png -------------------------------------------------------------------------------- /media/midi-player-screenshot-440x280.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jazz-soft/midi-player/HEAD/media/midi-player-screenshot-440x280.png -------------------------------------------------------------------------------- /media/midi-player-screenshot-640x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jazz-soft/midi-player/HEAD/media/midi-player-screenshot-640x400.png -------------------------------------------------------------------------------- /safari/midi-player/midi-player/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /safari/midi-player/extension/SafariExtensionHandler.swift: -------------------------------------------------------------------------------- 1 | import SafariServices 2 | 3 | class SafariExtensionHandler: SFSafariExtensionHandler { 4 | } 5 | -------------------------------------------------------------------------------- /media/PRIVACY.md: -------------------------------------------------------------------------------- 1 | # Privacy Policy 2 | 3 | ## MIDI Player 4 |  5 | 6 | ## This app and extension collect no user data. 7 | 8 | [website](https://jazz-soft.net) -------------------------------------------------------------------------------- /safari/midi-player/midi-player/Assets.xcassets/AppIcon.appiconset/128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jazz-soft/midi-player/HEAD/safari/midi-player/midi-player/Assets.xcassets/AppIcon.appiconset/128.png -------------------------------------------------------------------------------- /safari/midi-player/midi-player/Assets.xcassets/AppIcon.appiconset/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jazz-soft/midi-player/HEAD/safari/midi-player/midi-player/Assets.xcassets/AppIcon.appiconset/16.png -------------------------------------------------------------------------------- /safari/midi-player/midi-player/Assets.xcassets/AppIcon.appiconset/256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jazz-soft/midi-player/HEAD/safari/midi-player/midi-player/Assets.xcassets/AppIcon.appiconset/256.png -------------------------------------------------------------------------------- /safari/midi-player/midi-player/Assets.xcassets/AppIcon.appiconset/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jazz-soft/midi-player/HEAD/safari/midi-player/midi-player/Assets.xcassets/AppIcon.appiconset/32.png -------------------------------------------------------------------------------- /safari/midi-player/midi-player/Assets.xcassets/AppIcon.appiconset/512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jazz-soft/midi-player/HEAD/safari/midi-player/midi-player/Assets.xcassets/AppIcon.appiconset/512.png -------------------------------------------------------------------------------- /safari/midi-player/midi-player/Assets.xcassets/AppIcon.appiconset/64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jazz-soft/midi-player/HEAD/safari/midi-player/midi-player/Assets.xcassets/AppIcon.appiconset/64.png -------------------------------------------------------------------------------- /safari/midi-player/midi-player/Assets.xcassets/AppIcon.appiconset/1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jazz-soft/midi-player/HEAD/safari/midi-player/midi-player/Assets.xcassets/AppIcon.appiconset/1024.png -------------------------------------------------------------------------------- /safari/midi-player/midi-player/Assets.xcassets/AppIcon.appiconset/256-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jazz-soft/midi-player/HEAD/safari/midi-player/midi-player/Assets.xcassets/AppIcon.appiconset/256-1.png -------------------------------------------------------------------------------- /safari/midi-player/midi-player/Assets.xcassets/AppIcon.appiconset/32-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jazz-soft/midi-player/HEAD/safari/midi-player/midi-player/Assets.xcassets/AppIcon.appiconset/32-1.png -------------------------------------------------------------------------------- /safari/midi-player/midi-player/Assets.xcassets/AppIcon.appiconset/512-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jazz-soft/midi-player/HEAD/safari/midi-player/midi-player/Assets.xcassets/AppIcon.appiconset/512-1.png -------------------------------------------------------------------------------- /src/content.js: -------------------------------------------------------------------------------- 1 | var script = document.createElement('script'); 2 | if (typeof browser == 'undefined') browser = chrome; 3 | script.src = browser.runtime.getURL('inject.js'); 4 | script.onload = function() { script.remove(); } 5 | document.documentElement.appendChild(script); 6 | -------------------------------------------------------------------------------- /firefox/midi-player/content.js: -------------------------------------------------------------------------------- 1 | var script = document.createElement('script'); 2 | if (typeof browser == 'undefined') browser = chrome; 3 | script.src = browser.runtime.getURL('inject.js'); 4 | script.onload = function() { script.remove(); } 5 | document.documentElement.appendChild(script); 6 | -------------------------------------------------------------------------------- /safari/midi-player/extension/content.js: -------------------------------------------------------------------------------- 1 | var script = document.createElement('script'); 2 | if (typeof browser == 'undefined') browser = chrome; 3 | script.src = browser.runtime.getURL('inject.js'); 4 | script.onload = function() { script.remove(); } 5 | document.documentElement.appendChild(script); 6 | -------------------------------------------------------------------------------- /firefox/midi-player/_locales/en/messages.json: -------------------------------------------------------------------------------- 1 | { 2 | "extensionName": { 3 | "message": "MIDI Player", 4 | "description": "Name of the extension" 5 | }, 6 | "extensionDescription": { 7 | "message": "MIDI Player - plays all types of MIDI files", 8 | "description": "Description of the extension" 9 | } 10 | } -------------------------------------------------------------------------------- /firefox/midi-player/_locales/ru/messages.json: -------------------------------------------------------------------------------- 1 | { 2 | "extensionName": { 3 | "message": "MIDI Player", 4 | "description": "Name of the extension" 5 | }, 6 | "extensionDescription": { 7 | "message": "MIDI Player - играет все виды MIDI файлов", 8 | "description": "Description of the extension" 9 | } 10 | } -------------------------------------------------------------------------------- /firefox/midi-player/_locales/es/messages.json: -------------------------------------------------------------------------------- 1 | { 2 | "extensionName": { 3 | "message": "MIDI Player", 4 | "description": "Name of the extension" 5 | }, 6 | "extensionDescription": { 7 | "message": "MIDI Player - reproduce todo tipo de archivos MIDI", 8 | "description": "Description of the extension" 9 | } 10 | } -------------------------------------------------------------------------------- /firefox/README.md: -------------------------------------------------------------------------------- 1 | # Extensions for Firefox, Chrome, Opera, Edge (Chrome) 2 | 3 | ## midi-player 4 | 5 | Testing the extension: 6 | 7 | #### Firefox 8 | 9 | - Go to `about:debugging`->`This Firefox`->`Temporary Extensions` 10 | 11 | 12 | #### Chrome 13 | 14 | - Go to `chrome://extensions` 15 | - Turn the `Developer mode` on 16 | - Click `Load unpacked` -------------------------------------------------------------------------------- /safari/midi-player/extension/extension.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.files.user-selected.read-only 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /safari/midi-player/midi-player/midi_player.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.files.user-selected.read-only 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "midi-player-dev", 3 | "version": "0.0.0", 4 | "description": "MIDI player for browsers", 5 | "devDependencies": { 6 | "grunt": "^1.6.1", 7 | "grunt-contrib-copy": "^1.0.0", 8 | "grunt-contrib-jshint": "^3.2.0", 9 | "jzz": "^1.9.3", 10 | "jzz-gui-player": "^1.7.8", 11 | "jzz-midi-smf": "^1.9.8", 12 | "jzz-synth-tiny": "^1.4.3" 13 | }, 14 | "private": true 15 | } 16 | -------------------------------------------------------------------------------- /safari/midi-player/midi-player/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import Cocoa 2 | import SafariServices.SFSafariApplication 3 | 4 | @NSApplicationMain 5 | class AppDelegate: NSObject, NSApplicationDelegate { 6 | func applicationDidFinishLaunching(_ aNotification: Notification) { 7 | SFSafariApplication.showPreferencesForExtension( 8 | withIdentifier: "com.jazz-soft.midi-player.extension", 9 | completionHandler: { (_: Error?) -> Void in sleep(1); NSApp.terminate(nil); }); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /safari/README.md: -------------------------------------------------------------------------------- 1 | # Extension for Safari 2 | 3 | ## midi-player 4 | 5 | #### For Safari v.12 and up. 6 | 7 | For those without a developer certificate, 8 | Safari requires quite a ceremonial dance *each time* you need to reload the extension: 9 | 10 | - Go to `Safari`->`Preferences`->`Extensions` and uninstall the previous version of the extension 11 | - Quit Safari completely (with `⌘-Q`) 12 | - Restart Safari 13 | - Check the `Develope`->`Allow Unsigned Extensions` menu item 14 | - Run the extension app (can do it from Xcode) 15 | - In `Safari`->`Preferences`->`Extensions` click the checkbox to enable the extension -------------------------------------------------------------------------------- /firefox/midi-player/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "manifest_version": 3, 3 | "name": "__MSG_extensionName__", 4 | "description": "__MSG_extensionDescription__", 5 | "author": "Jazz-Soft", 6 | "version": "1.0.2.0", 7 | "icons": { 8 | "48": "icon48.png", 9 | "128": "icon128.png" 10 | }, 11 | "content_scripts": [{"matches": [""], "js": ["content.js"], "all_frames": true, "run_at": "document_end"}], 12 | "web_accessible_resources": [{"matches": [""], "resources": ["inject.js"]}], 13 | "browser_specific_settings": { 14 | "gecko": { 15 | "id": "{dd2a8325-13f3-40ad-93be-457e84e39883}" 16 | } 17 | }, 18 | "default_locale": "en", 19 | "homepage_url": "https://jazz-soft.net" 20 | } 21 | -------------------------------------------------------------------------------- /media/en.md: -------------------------------------------------------------------------------- 1 | # en (English) 2 | 3 | [messages.json](../firefox/midi-player/_locales/en/messages.json) 4 | 5 | ## Name 6 | MIDI Player 7 | 8 | ## Summary 9 | Plays all types of MIDI files in browser 10 | 11 | ## Description (Mozilla Add-ons, Chrome Web Store) 12 | Play all kinds of MIDI files in browser. Including MIDI 2.0. 13 | 14 | MIDI Player extension supports *.mid/*.kar/*.rmi/*.midi2 formats. 15 | 16 | It looks for MIDI files in hyperlinks and /// tags on the web pages, and plays them. 17 | 18 | For the best sound quality, you may want to install the Jazz-Plugin and the Jazz-MIDI extension. 19 | 20 | Same-origin limitation: MIDI files must be located at the same domain with the referencing web page, or at the CORS-enabled server. 21 | 22 | Please visit https://github.com/jazz-soft/midi-player to see the source code and share your feedback. -------------------------------------------------------------------------------- /media/ru.md: -------------------------------------------------------------------------------- 1 | # ru (Russian) 2 | 3 | [messages.json](../firefox/midi-player/_locales/ru/messages.json) 4 | 5 | ## Name 6 | MIDI Player 7 | 8 | ## Summary 9 | Играет все виды MIDI-файлов в браузере 10 | 11 | ## Description (Mozilla Add-ons, Chrome Web Store) 12 | Играет все виды MIDI-файлов в браузере. Включая MIDI 2.0. 13 | 14 | Расширение MIDI Player поддерживает форматы *.mid/*.kar/*.rmi/*.midi2 15 | 16 | Оно находит и играет MIDI-файлы в гиперссылках и тагах /// на веб-страницах. 17 | 18 | Для лучшего качества звучания возможно дополнительно установить Jazz-Plugin и расширение Jazz-MIDI. 19 | 20 | Ограничение по Cross-Origin запросам: MIDI-файл должен находиться в том же домене, что и ссылающаяся на него страница, или на сервере, поддерживающем технологию CORS. 21 | 22 | Посмотреть исходный код и оставить замечания и предложения, можно на странице GutHub: https://github.com/jazz-soft/midi-player 23 | -------------------------------------------------------------------------------- /media/es.md: -------------------------------------------------------------------------------- 1 | # en (English) 2 | 3 | [messages.json](../firefox/midi-player/_locales/en/messages.json) 4 | 5 | ## Name 6 | MIDI Player 7 | 8 | ## Summary 9 | Reproduce todo tipo de archivos MIDI en el navegador. 10 | 11 | ## Description (Mozilla Add-ons, Chrome Web Store) 12 | Reproduce toda clase de archivos MIDI en el navegador. Incluso MIDI 2.0. 13 | 14 | La extensión MIDI Player soporta formatos *.mid/*.kar/*.rmi/*.midi2 15 | 16 | Busca archivos MIDI en hipervínculos y etiquetas /// en páginas web y los reproduce. 17 | 18 | Para mejor calidad de sonido puedes instalar la extensión Jazz-Plugin y Jazz-MIDI. 19 | 20 | Política Same-origin (mismo-origen): los archivos MIDI deben de estar localizados en el mismo dominio con la web a la que hacen referencia, o en un servidor que permita CORS (origen cruzado). 21 | 22 | Por favor, visita https://github.com/jazz-soft/midi-player para ver el código fuente y dar tu opinión. -------------------------------------------------------------------------------- /safari/midi-player/midi-player/Base.lproj/MainMenu.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /test/embed.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | MIDI-Player Test: <embed> 5 | 6 | 7 | 8 | MIDI-Player Test: <embed> 9 | 10 | 11 | 12 | <embed> @ MDN web docs 13 | 14 | 15 | -------------------------------------------------------------------------------- /test/bgsound.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | MIDI-Player Test: <bgsound> 5 | 6 | 7 | 8 | MIDI-Player Test: <bgsound> 9 | 10 | 11 | 12 | <bgsound> @ MDN web docs 13 | 14 | 15 | -------------------------------------------------------------------------------- /Gruntfile.js: -------------------------------------------------------------------------------- 1 | module.exports = function(grunt) { 2 | grunt.initConfig({ 3 | pkg: grunt.file.readJSON('package.json'), 4 | jshint: { 5 | all: ['src/**/*.js'] 6 | }, 7 | assemble: { 8 | main: 'src/tools/main.js', 9 | src: [ 10 | 'node_modules/jzz/javascript/JZZ.js', 11 | 'node_modules/jzz-synth-tiny/javascript/JZZ.synth.Tiny.js', 12 | 'node_modules/jzz-midi-smf/javascript/JZZ.midi.SMF.js', 13 | 'node_modules/jzz-gui-player/javascript/JZZ.gui.Player.js' 14 | ], 15 | dest: 'src/inject.js' 16 | }, 17 | copy: { 18 | firefox: { 19 | expand: true, 20 | cwd: 'src', 21 | src: '*.js', 22 | dest: 'firefox/midi-player' 23 | }, 24 | safari: { 25 | expand: true, 26 | cwd: 'src', 27 | src: '*.js', 28 | dest: 'safari/midi-player/extension' 29 | } 30 | } 31 | }); 32 | grunt.loadNpmTasks('grunt-contrib-copy'); 33 | grunt.loadNpmTasks('grunt-contrib-jshint'); 34 | grunt.registerTask('assemble', require('./src/tools/assemble.js')(grunt)); 35 | grunt.registerTask('default', ['assemble', 'copy']); 36 | }; 37 | -------------------------------------------------------------------------------- /test/audio.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | MIDI-Player Test: <audio> 5 | 6 | 7 | 8 | MIDI-Player Test: <audio> 9 | 10 | 11 | 12 | Your browser does not support the audio element. 13 | 14 | 15 | <audio> @ MDN web docs 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/tools/assemble.js: -------------------------------------------------------------------------------- 1 | module.exports = function(grunt) { 2 | return function() { 3 | var i, j, k, s; 4 | var eol = require('os').EOL; 5 | var config = grunt.config('assemble'); 6 | var out = []; 7 | var src; 8 | var main = grunt.file.read(config.main).split(/\r?\n/); 9 | for (i = 0; i < main.length; i++) { 10 | if (main[i] == '/* insert here */') { 11 | for (j = 0; j < config.src.length; j++) { 12 | s = config.src[j].substr(config.src[j].lastIndexOf('/') + 1); 13 | out.push('// ' + s); 14 | s = s.substr(0, s.lastIndexOf('.')); 15 | s = s.substr(s.lastIndexOf('.') + 1); 16 | out.push('function _' + s + '() {'); 17 | src = grunt.file.read(config.src[j]).split(/\r?\n/); 18 | for (k = 0; k < src.length; k++) { 19 | if (src[k].match(/}\)\(this, function\(\S*\)\s*{/)) break; 20 | } 21 | for (k++; k < src.length; k++) { 22 | if (src[k].match(/^}\);/)) break; 23 | out.push(src[k]); 24 | } 25 | out.push('}'); 26 | out.push(''); 27 | } 28 | } 29 | else out.push(main[i]); 30 | } 31 | grunt.file.write(config.dest, out.join(eol)); 32 | }; 33 | }; 34 | -------------------------------------------------------------------------------- /test/object.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | MIDI-Player Test: <object> 5 | 6 | 7 | 8 | MIDI-Player Test: <object> 9 | 10 | 11 | 12 | 13 | If you're seeing this, you don't have a MIDI player 14 | on your computer. 15 | 16 | 17 | <object> @ MDN web docs 18 | 19 | 20 | -------------------------------------------------------------------------------- /safari/midi-player/midi-player/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleVersion 22 | 1 23 | LSApplicationCategoryType 24 | public.app-category.music 25 | LSMinimumSystemVersion 26 | $(MACOSX_DEPLOYMENT_TARGET) 27 | NSHumanReadableCopyright 28 | Copyright © 2020 Jazz-Soft. All rights reserved. 29 | NSMainNibFile 30 | MainMenu 31 | NSPrincipalClass 32 | NSApplication 33 | 34 | 35 | -------------------------------------------------------------------------------- /safari/midi-player/midi-player/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "16.png", 5 | "idiom" : "mac", 6 | "scale" : "1x", 7 | "size" : "16x16" 8 | }, 9 | { 10 | "filename" : "32.png", 11 | "idiom" : "mac", 12 | "scale" : "2x", 13 | "size" : "16x16" 14 | }, 15 | { 16 | "filename" : "32-1.png", 17 | "idiom" : "mac", 18 | "scale" : "1x", 19 | "size" : "32x32" 20 | }, 21 | { 22 | "filename" : "64.png", 23 | "idiom" : "mac", 24 | "scale" : "2x", 25 | "size" : "32x32" 26 | }, 27 | { 28 | "filename" : "128.png", 29 | "idiom" : "mac", 30 | "scale" : "1x", 31 | "size" : "128x128" 32 | }, 33 | { 34 | "filename" : "256.png", 35 | "idiom" : "mac", 36 | "scale" : "2x", 37 | "size" : "128x128" 38 | }, 39 | { 40 | "filename" : "256-1.png", 41 | "idiom" : "mac", 42 | "scale" : "1x", 43 | "size" : "256x256" 44 | }, 45 | { 46 | "filename" : "512.png", 47 | "idiom" : "mac", 48 | "scale" : "2x", 49 | "size" : "256x256" 50 | }, 51 | { 52 | "filename" : "512-1.png", 53 | "idiom" : "mac", 54 | "scale" : "1x", 55 | "size" : "512x512" 56 | }, 57 | { 58 | "filename" : "1024.png", 59 | "idiom" : "mac", 60 | "scale" : "2x", 61 | "size" : "512x512" 62 | } 63 | ], 64 | "info" : { 65 | "author" : "xcode", 66 | "version" : 1 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # midi-player 2 | 3 | ## MIDI Player browser extension 4 | 5 |  6 | 7 | Playing MIDI files in `hyperlinks` and ``, ``, ``, `` tags. 8 | 9 | Supported file formats: `*.mid`, `*.kar`, `*.rmi`, `*.midi2`. 10 | 11 | Same-origin limitation: MIDI files must be located at the same domain with the referencing web page, or at the CORS-enabled server. 12 | 13 | ## Chrome (also works on Chromebook), Opera, and Microsoft Edge 14 | [Get the **MIDI Player** extension at **Chrome Web Store**](https://chrome.google.com/webstore/detail/midi-player/khppfbnjbaampmeeiocjhcodkklkcfjf). 15 | For better sound quality, you may also want to install 16 | [**Jazz-MIDI**](https://chrome.google.com/webstore/detail/jazz-midi/jhdoobfdaejmldnpihidjemjcbpfmbkm) extension and 17 | [**Jazz-Plugin**](https://jazz-soft.net). 18 | 19 | ## Microsoft Edge 20 | [Get the **MIDI Player** extension at **Edge Add-ons**](https://microsoftedge.microsoft.com/addons/detail/midi-player/cfllhpolodlcjlomdphognlodkaikmfo) 21 | 22 | ## Firefox (also works on Android) 23 | [Get the **MIDI Player** extension at **Mozilla Add-ons**](https://addons.mozilla.org/en-US/firefox/addon/midi-player). 24 | For better sound quality, you may also want to install 25 | [**Jazz-MIDI**](https://addons.mozilla.org/firefox/addon/jazz-midi/) extension and 26 | [**Jazz-Plugin**](https://jazz-soft.net). 27 | 28 | ## Safari 29 | Coming soon... 30 | 31 | ## Test page 32 | https://jazz-soft.net/download/midi-player 33 | 34 | ## Help needed! 35 | We are looking for your help to [**localize the extension**](media/README.md)... 36 | 37 | *Your comments and suggestions are [**welcome**](https://jazz-soft.org). 38 | We would really appreciate your [**support**](https://jazz-soft.net/donate)!* 39 | -------------------------------------------------------------------------------- /safari/midi-player/extension/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | MIDI Player 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | XPC! 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleVersion 22 | 1 23 | LSMinimumSystemVersion 24 | $(MACOSX_DEPLOYMENT_TARGET) 25 | NSExtension 26 | 27 | NSExtensionPointIdentifier 28 | com.apple.Safari.extension 29 | NSExtensionPrincipalClass 30 | $(PRODUCT_MODULE_NAME).SafariExtensionHandler 31 | SFSafariContentScript 32 | 33 | 34 | Script 35 | content.js 36 | 37 | 38 | Script 39 | inject.js 40 | 41 | 42 | SFSafariWebsiteAccess 43 | 44 | Level 45 | All 46 | 47 | 48 | NSHumanReadableCopyright 49 | Copyright © 2020 Jazz-Soft. All rights reserved. 50 | NSHumanReadableDescription 51 | This Extension plays all types of MIDI files in Safari. 52 | 53 | 54 | -------------------------------------------------------------------------------- /media/README.md: -------------------------------------------------------------------------------- 1 | # midi-player media resources 2 | 3 | ## Help needed! 4 | 5 | We would really appreciate your help with localizing the extension for *your native language*. 6 | 7 | To add a new language, for example, **zz (Klingon)**: 8 | 9 | - clone this repository 10 | - copy `firefox/midi-player/_locales/en/messages.json` to `firefox/midi-player/_locales/zz/messages.json` 11 | - translate the `extensionDescription.message` string in the new `messages.json` file 12 | - copy `media/en.md` to `media/zz.md` 13 | - translate the relevant text (except the headers) in the new `zz.md` file 14 | - commit the new files and open the pull request 15 | 16 | **NO AI/GOOGLE TRANSLATE PLEASE!** 17 | 18 | We also need your help to ensure that the existing translations are in sync with the English version, 19 | free from typos and don't sound awkward. 20 | 21 | ### Currently available: 22 | 23 | [**en (English)**](en.md) 24 | [**es (Spanish)**](es.md) 25 | [**ru (Russian)**](ru.md) 26 | 27 | [Privacy Policy](PRIVACY.md) 28 | 29 | ## Images 30 | 31 | #### icon48.png 32 |  33 | 34 | #### icon128.png 35 |  36 | 37 | #### 16.png 38 |  39 | 40 | #### 32.png 41 |  42 | 43 | #### 64.png 44 |  45 | 46 | #### 128.png 47 |  48 | 49 | #### 256.png 50 |  51 | 52 | #### 512.png 53 |  54 | 55 | #### 1024.png 56 |  57 | 58 | #### midi-player-screenshot-272x42.png 59 |  60 | 61 | #### midi-player-screenshot-640x400.png 62 |  63 | 64 | #### midi-player-screenshot-640x400.png 65 |  66 | 67 | #### safari-install-2560-1600.png 68 |  69 | -------------------------------------------------------------------------------- /test/url.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | MIDI-Player Test: URL 5 | 6 | 7 | 8 | MIDI-Player Test: URL 9 | 10 | 11 | local url 12 | local not found 13 | 14 | remote url 15 | remote CORS 16 | 17 | data url base64 18 | data url plain 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /media/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/tools/main.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | var _data_ = /^data:/i; 3 | var _data = /^data:audio\/midi/i; 4 | var _midi_kar_rmi = /\.(midi?|kar|rmi|midi2)$/i; 5 | var _mp3_wav_ogg = /\.(mp3|wav|ogg)$/i; 6 | var __midi1 = 'audio/midi'; 7 | var __midi2 = 'audio/mid'; 8 | var __midi3 = 'audio/x-midi'; 9 | var __midi4 = 'audio/x-mid'; 10 | var __midi5 = 'midi/mid'; 11 | var __midi6 = 'application/x-midi'; 12 | var __midi7 = 'audio/midi2'; 13 | var __mpeg = 'audio/mpeg'; 14 | var __ogg = 'audio/ogg'; 15 | var __wav = 'audio/wav'; 16 | 17 | function isTrue(str) { 18 | if (str == '') return true; 19 | str = str.toLowerCase(); 20 | if (str == 'f' || str == 'false' || str == 0) return false; 21 | return !!str; 22 | } 23 | function getBool(x, a) { 24 | if (x && x.attributes && x.attributes[a]) return isTrue(x.attributes[a].nodeValue); 25 | return false; 26 | } 27 | function getAttr(x, a) { 28 | if (x && x.attributes && x.attributes[a]) return x.attributes[a].nodeValue; 29 | return ''; 30 | } 31 | function getInt(x, a) { 32 | var n = getAttr(x, a); 33 | return n == parseInt(n) ? n : 0; 34 | } 35 | function isMidi(s, t) { 36 | return s.match(_data) || s.match(_midi_kar_rmi) || 37 | t ==__midi1 || t ==__midi2 || t ==__midi3 || t ==__midi4 || t ==__midi5 || t ==__midi6 || t ==__midi7; 38 | } 39 | function isAudio(s, t) { return s.match(_mp3_wav_ogg) || t == __mpeg || t == __wav || t == __ogg; } 40 | 41 | function search() { 42 | var a, x, i, j, s, t, h, w; 43 | var added = false; 44 | var all = []; 45 | var src; 46 | a = document.getElementsByTagName('BGSOUND'); 47 | for (i = 0; i < a.length; i++) { 48 | x = a[i]; 49 | s = getAttr(x, 'src'); 50 | w = getAttr(x, 'loop'); 51 | if (w.toLowerCase() == 'infinity' || w.toLowerCase() == 'infinite') w = -1; 52 | else if (w != parseInt(w) || w < 2) w = 0; 53 | if (isMidi(s)) { 54 | all.push({ 55 | dom: x, 56 | type: 'bgsound', 57 | src: s, 58 | loop: w, 59 | auto: true, 60 | ctrl: false, 61 | h: 0, 62 | w: 0 63 | }); 64 | } 65 | } 66 | a = document.getElementsByTagName('AUDIO'); 67 | for (i = 0; i < a.length; i++) { 68 | x = a[i]; 69 | src = []; 70 | if (x.attributes && x.attributes.src) src.push([getAttr(x, 'src')]); 71 | if (x.children) { 72 | for (j = 0; j < x.children.length; j++) { 73 | if (x.children[j].nodeName == 'SOURCE' && x.children[j].attributes) { 74 | src.push([getAttr(x.children[j], 'src'), getAttr(x.children[j], 'type')]); 75 | } 76 | } 77 | } 78 | s = undefined; 79 | for (j = 0; j < src.length; j++) { 80 | if (isMidi(src[j][0], src[j][1])) { 81 | s = src[j][0]; break; 82 | } 83 | if (isAudio(src[j][0], src[j][1])) { 84 | break; 85 | } 86 | } 87 | if (s) { 88 | all.push({ 89 | dom: x, 90 | type: 'audio', 91 | src: s, 92 | loop: getBool(x, 'loop') ? -1 : 0, 93 | auto: getBool(x, 'autoplay'), 94 | ctrl: getBool(x, 'controls'), 95 | h: x.clientHeight, 96 | w: x.clientWidth 97 | }); 98 | } 99 | } 100 | a = document.getElementsByTagName('EMBED'); 101 | for (i = 0; i < a.length; i++) { 102 | x = a[i]; 103 | s = getAttr(x, 'src'); 104 | t = s ? getAttr(x.children[j], 'type') : undefined; 105 | if (isMidi(s, t)) { 106 | h = getInt(x, 'height'); 107 | w = getInt(x, 'width'); 108 | all.push({ 109 | dom: x, 110 | type: 'embed', 111 | src: s, 112 | loop: 0, 113 | auto: getBool(x, 'autostart') || getBool(x, 'autoplay'), 114 | h: h, 115 | w: w, 116 | ctrl: true 117 | }); 118 | } 119 | } 120 | a = document.getElementsByTagName('OBJECT'); 121 | for (i = 0; i < a.length; i++) { 122 | x = a[i]; 123 | s = getAttr(x, 'data'); 124 | t = s ? getAttr(x.children[j], 'type') : undefined; 125 | if (isMidi(s, t)) { 126 | h = getInt(x, 'height'); 127 | w = getInt(x, 'width'); 128 | all.push({ 129 | dom: x, 130 | type: 'object', 131 | src: s, 132 | loop: 0, 133 | auto: false, 134 | h: h, 135 | w: w, 136 | ctrl: true 137 | }); 138 | if (x.children) { 139 | for (j = 0; j < x.children.length; j++) { 140 | if (x.children[j].nodeName == 'PARAM' && x.children[j].attributes) { 141 | if (getAttr(x.children[j], 'name') == 'loop') all[all.length - 1].loop = getAttr(x.children[j], 'value') || 0; 142 | if (getAttr(x.children[j], 'name') == 'autoplay') all[all.length - 1].auto = getBool(x.children[j], 'value'); 143 | if (getAttr(x.children[j], 'name') == 'autostart') all[all.length - 1].auto = getBool(x.children[j], 'value'); 144 | } 145 | } 146 | } 147 | } 148 | } 149 | a = document.links; 150 | var midisite = window.location.hostname.match(/midi/i); 151 | for (i = 0; i < a.length; i++) { 152 | if (a[i].dataset && a[i].dataset.jzzGuiPlayer) continue; 153 | if (!a[i].dataset) a[i].dataset = {}; 154 | a[i].dataset.jzzGuiPlayer = true; 155 | if (midisite || a[i].href.match(_data) || a[i].href.match(_midi_kar_rmi)) { 156 | added = true; 157 | link(a[i]); 158 | } 159 | } 160 | if (all.length || added) init(); 161 | for (i = 0; i < all.length; i++) create(all[i]); 162 | } 163 | function testMime(url, good, bad, ugly) { 164 | if (url.match(_data_)) { 165 | if (url.match(_data)) { 166 | good(); 167 | } 168 | else { 169 | bad(); 170 | } 171 | } 172 | else { 173 | var xhttp = new XMLHttpRequest(); 174 | var received = false; 175 | xhttp.onreadystatechange = function() { 176 | if (this.readyState == this.HEADERS_RECEIVED || (this.readyState == this.DONE && !received)) { 177 | received = true; 178 | if (this.status == 200) { 179 | var type = this.getResponseHeader("Content-Type"); 180 | var disposition = this.getResponseHeader("Content-Disposition"); 181 | if (disposition && disposition[disposition.length - 1] == '"') disposition = disposition.substring(0, disposition.length - 1); 182 | if (type && ( 183 | type.match(__midi1) || type.match(__midi2) || type.match(__midi3) || 184 | type.match(__midi4) || type.match(__midi5) || type.match(__midi6) || type.match(__midi7))) { 185 | good(); 186 | } 187 | else if (type == 'application/octet-stream' && url.match(_midi_kar_rmi)) { 188 | good(); 189 | } 190 | else if (disposition && disposition.match(_midi_kar_rmi)) { 191 | good(); 192 | } 193 | else if (url.match(/^file:/i)) { 194 | good(); 195 | } 196 | else { 197 | bad(); 198 | } 199 | } 200 | else ugly(); 201 | xhttp.abort(); 202 | } 203 | }; 204 | xhttp.open('HEAD', url, true); 205 | xhttp.send(); 206 | } 207 | } 208 | function decode(s) { 209 | var n = s.indexOf(',') + 1; 210 | if (s.substring(0, n).match(/;base64/i)) return JZZ.lib.fromBase64(s.substring(n)); 211 | var i, x, a = ''; 212 | for (i = n; i < s.length; i++) { 213 | if (s[i] == '%') { 214 | x = parseInt(s.substr(i + 1, 2), 16); 215 | if (x >= 0 && x <= 255) { 216 | a += String.fromCharCode(x); 217 | i += 2; 218 | } 219 | else a += '%'; 220 | } 221 | else a += s[i]; 222 | } 223 | return a; 224 | } 225 | function load_midi(data) { 226 | try { 227 | return JZZ.MIDI.SMF(data); 228 | } 229 | catch (e) { 230 | try { 231 | return new JZZ.MIDI.Clip(data); 232 | } 233 | catch (e) {/**/} 234 | } 235 | } 236 | function load(player, url, play, loop) { 237 | var isData = url.match(_data_); 238 | var div = player.gui; 239 | var title = isData ? 'data:audio/midi' : url; 240 | player.setUrl(url, isData ? 'midi-player.mid' : undefined); 241 | player.label('jazz-soft'); 242 | if (isData) { 243 | var smf = load_midi(decode(url)); 244 | if (smf) { 245 | player.load(smf); 246 | div.title = title; 247 | if (loop) player.loop(loop); 248 | if (play) player.play(); 249 | } 250 | else { 251 | div.title = 'Cannot load ' + title; 252 | } 253 | } 254 | else { 255 | div.title = 'Loading ' + title; 256 | var xhttp = new XMLHttpRequest(); 257 | xhttp.onreadystatechange = function() { 258 | if (this.readyState == this.DONE) { 259 | if (this.status == 200) { 260 | var r, i; 261 | var data = ''; 262 | r = xhttp.response; 263 | if (r instanceof ArrayBuffer) { 264 | r = new Uint8Array(r); 265 | for (i = 0; i < r.length; i++) data += String.fromCharCode(r[i]); 266 | } 267 | else { 268 | r = xhttp.responseText; 269 | for (i = 0; i < r.length; i++) data += String.fromCharCode(r.charCodeAt(i) & 0xff); 270 | } 271 | var smf = load_midi(data); 272 | if (smf) { 273 | player.load(smf); 274 | div.title = title; 275 | if (loop) player.loop(loop); 276 | if (play) player.play(); 277 | } 278 | else { 279 | div.title = 'Cannot load ' + title; 280 | } 281 | } 282 | else { 283 | div.title = 'Cannot load ' + title; 284 | } 285 | } 286 | }; 287 | try { 288 | xhttp.responseType = 'arraybuffer'; 289 | } 290 | catch (e) {} 291 | xhttp.overrideMimeType('text/plain; charset=x-user-defined'); 292 | xhttp.open('GET', url, true); 293 | xhttp.send(); 294 | } 295 | } 296 | function link(a) { 297 | var busy = false; 298 | var player; 299 | var cancel = function() { 300 | a.removeEventListener('click', listener); 301 | a.click(); 302 | }; 303 | var proceed = function() { 304 | var r = a.getBoundingClientRect(); 305 | var x = Math.round(r.left) - 32; 306 | if (x < 0) x = 0; 307 | if (x > document.documentElement.clientWidth - 270) x = document.documentElement.clientWidth - 270; 308 | var y = Math.round(r.top) - 32; 309 | if (y > document.documentElement.clientHeight - 40) y = document.documentElement.clientHeight - 40; 310 | if (y < 0) y = 0; 311 | player = new JZZ.gui.Player({ link: true, close: true, x: x, y: y }); 312 | player.onClose = function() { busy = false; }; 313 | load(player, a.href, true); 314 | } 315 | var listener = function(e) { 316 | e.preventDefault(); 317 | if (busy) { 318 | if (player) player.play(); 319 | return; 320 | } 321 | busy = true; 322 | testMime(a.href, proceed, cancel, cancel); 323 | }; 324 | a.addEventListener('click', listener); 325 | } 326 | function create(x) { 327 | var player; 328 | var parent = x.dom.parentNode; 329 | var div; 330 | if (x.ctrl) { 331 | div = document.createElement('div'); 332 | div.style.display = 'inline-block'; 333 | div.style.margin = '0px'; 334 | div.style.padding = '0px'; 335 | div.style.borderStyle = 'none'; 336 | div.style.cursor = 'default'; 337 | parent.insertBefore(div, x.dom); 338 | player = new JZZ.gui.Player({ at: div, link: true }); 339 | } 340 | else { 341 | player = new JZZ.gui.Player({ link: true, close: true }); 342 | } 343 | parent.removeChild(x.dom); 344 | load(player, x.src, x.auto, x.loop); 345 | } 346 | var init = function() { 347 | if (!window.JZZ) window.JZZ = _JZZ(); 348 | if (!JZZ.synth || !JZZ.synth.Tiny) _Tiny(); 349 | JZZ.synth.Tiny.register('Web Audio'); 350 | JZZ().openMidiOut(); 351 | if (!JZZ.MIDI.SMF) _SMF(); 352 | if (!JZZ.gui || !JZZ.gui.Player) _Player(); 353 | init = function() {}; 354 | }; 355 | search(); 356 | setInterval(search, 500); 357 | 358 | /* insert here */ 359 | })(); 360 | 361 | -------------------------------------------------------------------------------- /safari/midi-player/midi-player.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | A277B05023EE6DAA00DAA781 /* content.js in Resources */ = {isa = PBXBuildFile; fileRef = A277B04B23EE6DAA00DAA781 /* content.js */; }; 11 | A277B05123EE6DAA00DAA781 /* xJZZ.js in Resources */ = {isa = PBXBuildFile; fileRef = A277B04C23EE6DAA00DAA781 /* xJZZ.js */; }; 12 | A277B05223EE6DAA00DAA781 /* xPlayer.js in Resources */ = {isa = PBXBuildFile; fileRef = A277B04D23EE6DAA00DAA781 /* xPlayer.js */; }; 13 | A277B05323EE6DAA00DAA781 /* xSMF.js in Resources */ = {isa = PBXBuildFile; fileRef = A277B04E23EE6DAA00DAA781 /* xSMF.js */; }; 14 | A277B05423EE6DAA00DAA781 /* xTiny.js in Resources */ = {isa = PBXBuildFile; fileRef = A277B04F23EE6DAA00DAA781 /* xTiny.js */; }; 15 | A2AF607E23ED3B85000E163A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2AF607D23ED3B85000E163A /* AppDelegate.swift */; }; 16 | A2AF608023ED3B86000E163A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A2AF607F23ED3B86000E163A /* Assets.xcassets */; }; 17 | A2AF608323ED3B86000E163A /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = A2AF608123ED3B86000E163A /* MainMenu.xib */; }; 18 | A2AF609223ED3CF1000E163A /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A2AF609123ED3CF1000E163A /* Cocoa.framework */; }; 19 | A2AF609523ED3CF1000E163A /* SafariExtensionHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2AF609423ED3CF1000E163A /* SafariExtensionHandler.swift */; }; 20 | A2AF60A323ED3CF2000E163A /* extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = A2AF608F23ED3CF1000E163A /* extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 21 | /* End PBXBuildFile section */ 22 | 23 | /* Begin PBXContainerItemProxy section */ 24 | A2AF60A123ED3CF2000E163A /* PBXContainerItemProxy */ = { 25 | isa = PBXContainerItemProxy; 26 | containerPortal = A2AF607223ED3B85000E163A /* Project object */; 27 | proxyType = 1; 28 | remoteGlobalIDString = A2AF608E23ED3CF1000E163A; 29 | remoteInfo = extension; 30 | }; 31 | /* End PBXContainerItemProxy section */ 32 | 33 | /* Begin PBXCopyFilesBuildPhase section */ 34 | A2AF60A723ED3CF2000E163A /* Embed App Extensions */ = { 35 | isa = PBXCopyFilesBuildPhase; 36 | buildActionMask = 2147483647; 37 | dstPath = ""; 38 | dstSubfolderSpec = 13; 39 | files = ( 40 | A2AF60A323ED3CF2000E163A /* extension.appex in Embed App Extensions */, 41 | ); 42 | name = "Embed App Extensions"; 43 | runOnlyForDeploymentPostprocessing = 0; 44 | }; 45 | /* End PBXCopyFilesBuildPhase section */ 46 | 47 | /* Begin PBXFileReference section */ 48 | A277B04B23EE6DAA00DAA781 /* content.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = content.js; sourceTree = ""; }; 49 | A277B04C23EE6DAA00DAA781 /* xJZZ.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = xJZZ.js; sourceTree = ""; }; 50 | A277B04D23EE6DAA00DAA781 /* xPlayer.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = xPlayer.js; sourceTree = ""; }; 51 | A277B04E23EE6DAA00DAA781 /* xSMF.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = xSMF.js; sourceTree = ""; }; 52 | A277B04F23EE6DAA00DAA781 /* xTiny.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = xTiny.js; sourceTree = ""; }; 53 | A2AF607A23ED3B85000E163A /* midi-player.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "midi-player.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 54 | A2AF607D23ED3B85000E163A /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 55 | A2AF607F23ED3B86000E163A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 56 | A2AF608223ED3B86000E163A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; 57 | A2AF608423ED3B86000E163A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 58 | A2AF608523ED3B86000E163A /* midi_player.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = midi_player.entitlements; sourceTree = ""; }; 59 | A2AF608F23ED3CF1000E163A /* extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = extension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 60 | A2AF609123ED3CF1000E163A /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; 61 | A2AF609423ED3CF1000E163A /* SafariExtensionHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SafariExtensionHandler.swift; sourceTree = ""; }; 62 | A2AF609B23ED3CF2000E163A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 63 | A2AF60A023ED3CF2000E163A /* extension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = extension.entitlements; sourceTree = ""; }; 64 | /* End PBXFileReference section */ 65 | 66 | /* Begin PBXFrameworksBuildPhase section */ 67 | A2AF607723ED3B85000E163A /* Frameworks */ = { 68 | isa = PBXFrameworksBuildPhase; 69 | buildActionMask = 2147483647; 70 | files = ( 71 | ); 72 | runOnlyForDeploymentPostprocessing = 0; 73 | }; 74 | A2AF608C23ED3CF1000E163A /* Frameworks */ = { 75 | isa = PBXFrameworksBuildPhase; 76 | buildActionMask = 2147483647; 77 | files = ( 78 | A2AF609223ED3CF1000E163A /* Cocoa.framework in Frameworks */, 79 | ); 80 | runOnlyForDeploymentPostprocessing = 0; 81 | }; 82 | /* End PBXFrameworksBuildPhase section */ 83 | 84 | /* Begin PBXGroup section */ 85 | A2AF607123ED3B85000E163A = { 86 | isa = PBXGroup; 87 | children = ( 88 | A2AF607C23ED3B85000E163A /* midi-player */, 89 | A2AF609323ED3CF1000E163A /* extension */, 90 | A2AF609023ED3CF1000E163A /* Frameworks */, 91 | A2AF607B23ED3B85000E163A /* Products */, 92 | ); 93 | sourceTree = ""; 94 | }; 95 | A2AF607B23ED3B85000E163A /* Products */ = { 96 | isa = PBXGroup; 97 | children = ( 98 | A2AF607A23ED3B85000E163A /* midi-player.app */, 99 | A2AF608F23ED3CF1000E163A /* extension.appex */, 100 | ); 101 | name = Products; 102 | sourceTree = ""; 103 | }; 104 | A2AF607C23ED3B85000E163A /* midi-player */ = { 105 | isa = PBXGroup; 106 | children = ( 107 | A2AF607D23ED3B85000E163A /* AppDelegate.swift */, 108 | A2AF607F23ED3B86000E163A /* Assets.xcassets */, 109 | A2AF608123ED3B86000E163A /* MainMenu.xib */, 110 | A2AF608423ED3B86000E163A /* Info.plist */, 111 | A2AF608523ED3B86000E163A /* midi_player.entitlements */, 112 | ); 113 | path = "midi-player"; 114 | sourceTree = ""; 115 | }; 116 | A2AF609023ED3CF1000E163A /* Frameworks */ = { 117 | isa = PBXGroup; 118 | children = ( 119 | A2AF609123ED3CF1000E163A /* Cocoa.framework */, 120 | ); 121 | name = Frameworks; 122 | sourceTree = ""; 123 | }; 124 | A2AF609323ED3CF1000E163A /* extension */ = { 125 | isa = PBXGroup; 126 | children = ( 127 | A277B04B23EE6DAA00DAA781 /* content.js */, 128 | A277B04C23EE6DAA00DAA781 /* xJZZ.js */, 129 | A277B04D23EE6DAA00DAA781 /* xPlayer.js */, 130 | A277B04E23EE6DAA00DAA781 /* xSMF.js */, 131 | A277B04F23EE6DAA00DAA781 /* xTiny.js */, 132 | A2AF609423ED3CF1000E163A /* SafariExtensionHandler.swift */, 133 | A2AF609B23ED3CF2000E163A /* Info.plist */, 134 | A2AF60A023ED3CF2000E163A /* extension.entitlements */, 135 | ); 136 | path = extension; 137 | sourceTree = ""; 138 | }; 139 | /* End PBXGroup section */ 140 | 141 | /* Begin PBXNativeTarget section */ 142 | A2AF607923ED3B85000E163A /* midi-player */ = { 143 | isa = PBXNativeTarget; 144 | buildConfigurationList = A2AF608823ED3B86000E163A /* Build configuration list for PBXNativeTarget "midi-player" */; 145 | buildPhases = ( 146 | A2AF607623ED3B85000E163A /* Sources */, 147 | A2AF607723ED3B85000E163A /* Frameworks */, 148 | A2AF607823ED3B85000E163A /* Resources */, 149 | A2AF60A723ED3CF2000E163A /* Embed App Extensions */, 150 | ); 151 | buildRules = ( 152 | ); 153 | dependencies = ( 154 | A2AF60A223ED3CF2000E163A /* PBXTargetDependency */, 155 | ); 156 | name = "midi-player"; 157 | productName = "midi-player"; 158 | productReference = A2AF607A23ED3B85000E163A /* midi-player.app */; 159 | productType = "com.apple.product-type.application"; 160 | }; 161 | A2AF608E23ED3CF1000E163A /* extension */ = { 162 | isa = PBXNativeTarget; 163 | buildConfigurationList = A2AF60A423ED3CF2000E163A /* Build configuration list for PBXNativeTarget "extension" */; 164 | buildPhases = ( 165 | A2AF608B23ED3CF1000E163A /* Sources */, 166 | A2AF608C23ED3CF1000E163A /* Frameworks */, 167 | A2AF608D23ED3CF1000E163A /* Resources */, 168 | ); 169 | buildRules = ( 170 | ); 171 | dependencies = ( 172 | ); 173 | name = extension; 174 | productName = extension; 175 | productReference = A2AF608F23ED3CF1000E163A /* extension.appex */; 176 | productType = "com.apple.product-type.app-extension"; 177 | }; 178 | /* End PBXNativeTarget section */ 179 | 180 | /* Begin PBXProject section */ 181 | A2AF607223ED3B85000E163A /* Project object */ = { 182 | isa = PBXProject; 183 | attributes = { 184 | LastSwiftUpdateCheck = 1010; 185 | LastUpgradeCheck = 1140; 186 | ORGANIZATIONNAME = "Jazz-Soft"; 187 | TargetAttributes = { 188 | A2AF607923ED3B85000E163A = { 189 | CreatedOnToolsVersion = 10.1; 190 | LastSwiftMigration = 1140; 191 | }; 192 | A2AF608E23ED3CF1000E163A = { 193 | CreatedOnToolsVersion = 10.1; 194 | LastSwiftMigration = 1140; 195 | }; 196 | }; 197 | }; 198 | buildConfigurationList = A2AF607523ED3B85000E163A /* Build configuration list for PBXProject "midi-player" */; 199 | compatibilityVersion = "Xcode 9.3"; 200 | developmentRegion = en; 201 | hasScannedForEncodings = 0; 202 | knownRegions = ( 203 | en, 204 | Base, 205 | ); 206 | mainGroup = A2AF607123ED3B85000E163A; 207 | productRefGroup = A2AF607B23ED3B85000E163A /* Products */; 208 | projectDirPath = ""; 209 | projectRoot = ""; 210 | targets = ( 211 | A2AF607923ED3B85000E163A /* midi-player */, 212 | A2AF608E23ED3CF1000E163A /* extension */, 213 | ); 214 | }; 215 | /* End PBXProject section */ 216 | 217 | /* Begin PBXResourcesBuildPhase section */ 218 | A2AF607823ED3B85000E163A /* Resources */ = { 219 | isa = PBXResourcesBuildPhase; 220 | buildActionMask = 2147483647; 221 | files = ( 222 | A2AF608023ED3B86000E163A /* Assets.xcassets in Resources */, 223 | A2AF608323ED3B86000E163A /* MainMenu.xib in Resources */, 224 | ); 225 | runOnlyForDeploymentPostprocessing = 0; 226 | }; 227 | A2AF608D23ED3CF1000E163A /* Resources */ = { 228 | isa = PBXResourcesBuildPhase; 229 | buildActionMask = 2147483647; 230 | files = ( 231 | A277B05123EE6DAA00DAA781 /* xJZZ.js in Resources */, 232 | A277B05423EE6DAA00DAA781 /* xTiny.js in Resources */, 233 | A277B05323EE6DAA00DAA781 /* xSMF.js in Resources */, 234 | A277B05023EE6DAA00DAA781 /* content.js in Resources */, 235 | A277B05223EE6DAA00DAA781 /* xPlayer.js in Resources */, 236 | ); 237 | runOnlyForDeploymentPostprocessing = 0; 238 | }; 239 | /* End PBXResourcesBuildPhase section */ 240 | 241 | /* Begin PBXSourcesBuildPhase section */ 242 | A2AF607623ED3B85000E163A /* Sources */ = { 243 | isa = PBXSourcesBuildPhase; 244 | buildActionMask = 2147483647; 245 | files = ( 246 | A2AF607E23ED3B85000E163A /* AppDelegate.swift in Sources */, 247 | ); 248 | runOnlyForDeploymentPostprocessing = 0; 249 | }; 250 | A2AF608B23ED3CF1000E163A /* Sources */ = { 251 | isa = PBXSourcesBuildPhase; 252 | buildActionMask = 2147483647; 253 | files = ( 254 | A2AF609523ED3CF1000E163A /* SafariExtensionHandler.swift in Sources */, 255 | ); 256 | runOnlyForDeploymentPostprocessing = 0; 257 | }; 258 | /* End PBXSourcesBuildPhase section */ 259 | 260 | /* Begin PBXTargetDependency section */ 261 | A2AF60A223ED3CF2000E163A /* PBXTargetDependency */ = { 262 | isa = PBXTargetDependency; 263 | target = A2AF608E23ED3CF1000E163A /* extension */; 264 | targetProxy = A2AF60A123ED3CF2000E163A /* PBXContainerItemProxy */; 265 | }; 266 | /* End PBXTargetDependency section */ 267 | 268 | /* Begin PBXVariantGroup section */ 269 | A2AF608123ED3B86000E163A /* MainMenu.xib */ = { 270 | isa = PBXVariantGroup; 271 | children = ( 272 | A2AF608223ED3B86000E163A /* Base */, 273 | ); 274 | name = MainMenu.xib; 275 | sourceTree = ""; 276 | }; 277 | /* End PBXVariantGroup section */ 278 | 279 | /* Begin XCBuildConfiguration section */ 280 | A2AF608623ED3B86000E163A /* Debug */ = { 281 | isa = XCBuildConfiguration; 282 | buildSettings = { 283 | ALWAYS_SEARCH_USER_PATHS = NO; 284 | CLANG_ANALYZER_NONNULL = YES; 285 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 286 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 287 | CLANG_CXX_LIBRARY = "libc++"; 288 | CLANG_ENABLE_MODULES = YES; 289 | CLANG_ENABLE_OBJC_ARC = YES; 290 | CLANG_ENABLE_OBJC_WEAK = YES; 291 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 292 | CLANG_WARN_BOOL_CONVERSION = YES; 293 | CLANG_WARN_COMMA = YES; 294 | CLANG_WARN_CONSTANT_CONVERSION = YES; 295 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 296 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 297 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 298 | CLANG_WARN_EMPTY_BODY = YES; 299 | CLANG_WARN_ENUM_CONVERSION = YES; 300 | CLANG_WARN_INFINITE_RECURSION = YES; 301 | CLANG_WARN_INT_CONVERSION = YES; 302 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 303 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 304 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 305 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 306 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 307 | CLANG_WARN_STRICT_PROTOTYPES = YES; 308 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 309 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 310 | CLANG_WARN_UNREACHABLE_CODE = YES; 311 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 312 | CODE_SIGN_IDENTITY = "-"; 313 | COPY_PHASE_STRIP = NO; 314 | DEBUG_INFORMATION_FORMAT = dwarf; 315 | ENABLE_STRICT_OBJC_MSGSEND = YES; 316 | ENABLE_TESTABILITY = YES; 317 | GCC_C_LANGUAGE_STANDARD = gnu11; 318 | GCC_DYNAMIC_NO_PIC = NO; 319 | GCC_NO_COMMON_BLOCKS = YES; 320 | GCC_OPTIMIZATION_LEVEL = 0; 321 | GCC_PREPROCESSOR_DEFINITIONS = ( 322 | "DEBUG=1", 323 | "$(inherited)", 324 | ); 325 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 326 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 327 | GCC_WARN_UNDECLARED_SELECTOR = YES; 328 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 329 | GCC_WARN_UNUSED_FUNCTION = YES; 330 | GCC_WARN_UNUSED_VARIABLE = YES; 331 | MACOSX_DEPLOYMENT_TARGET = 10.13; 332 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 333 | MTL_FAST_MATH = YES; 334 | ONLY_ACTIVE_ARCH = YES; 335 | SDKROOT = macosx; 336 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 337 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 338 | }; 339 | name = Debug; 340 | }; 341 | A2AF608723ED3B86000E163A /* Release */ = { 342 | isa = XCBuildConfiguration; 343 | buildSettings = { 344 | ALWAYS_SEARCH_USER_PATHS = NO; 345 | CLANG_ANALYZER_NONNULL = YES; 346 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 347 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 348 | CLANG_CXX_LIBRARY = "libc++"; 349 | CLANG_ENABLE_MODULES = YES; 350 | CLANG_ENABLE_OBJC_ARC = YES; 351 | CLANG_ENABLE_OBJC_WEAK = YES; 352 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 353 | CLANG_WARN_BOOL_CONVERSION = YES; 354 | CLANG_WARN_COMMA = YES; 355 | CLANG_WARN_CONSTANT_CONVERSION = YES; 356 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 357 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 358 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 359 | CLANG_WARN_EMPTY_BODY = YES; 360 | CLANG_WARN_ENUM_CONVERSION = YES; 361 | CLANG_WARN_INFINITE_RECURSION = YES; 362 | CLANG_WARN_INT_CONVERSION = YES; 363 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 364 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 365 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 366 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 367 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 368 | CLANG_WARN_STRICT_PROTOTYPES = YES; 369 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 370 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 371 | CLANG_WARN_UNREACHABLE_CODE = YES; 372 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 373 | CODE_SIGN_IDENTITY = "-"; 374 | COPY_PHASE_STRIP = NO; 375 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 376 | ENABLE_NS_ASSERTIONS = NO; 377 | ENABLE_STRICT_OBJC_MSGSEND = YES; 378 | GCC_C_LANGUAGE_STANDARD = gnu11; 379 | GCC_NO_COMMON_BLOCKS = YES; 380 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 381 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 382 | GCC_WARN_UNDECLARED_SELECTOR = YES; 383 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 384 | GCC_WARN_UNUSED_FUNCTION = YES; 385 | GCC_WARN_UNUSED_VARIABLE = YES; 386 | MACOSX_DEPLOYMENT_TARGET = 10.13; 387 | MTL_ENABLE_DEBUG_INFO = NO; 388 | MTL_FAST_MATH = YES; 389 | SDKROOT = macosx; 390 | SWIFT_COMPILATION_MODE = wholemodule; 391 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 392 | }; 393 | name = Release; 394 | }; 395 | A2AF608923ED3B86000E163A /* Debug */ = { 396 | isa = XCBuildConfiguration; 397 | buildSettings = { 398 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 399 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 400 | CODE_SIGN_ENTITLEMENTS = "midi-player/midi_player.entitlements"; 401 | CODE_SIGN_IDENTITY = "Apple Development"; 402 | CODE_SIGN_STYLE = Automatic; 403 | COMBINE_HIDPI_IMAGES = YES; 404 | DEVELOPMENT_TEAM = 76EXZ289MK; 405 | INFOPLIST_FILE = "midi-player/Info.plist"; 406 | LD_RUNPATH_SEARCH_PATHS = ( 407 | "$(inherited)", 408 | "@executable_path/../Frameworks", 409 | ); 410 | PRODUCT_BUNDLE_IDENTIFIER = "com.jazz-soft.midi-player"; 411 | PRODUCT_NAME = "$(TARGET_NAME)"; 412 | SWIFT_VERSION = 5.0; 413 | }; 414 | name = Debug; 415 | }; 416 | A2AF608A23ED3B86000E163A /* Release */ = { 417 | isa = XCBuildConfiguration; 418 | buildSettings = { 419 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 420 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 421 | CODE_SIGN_ENTITLEMENTS = "midi-player/midi_player.entitlements"; 422 | CODE_SIGN_IDENTITY = "Apple Development"; 423 | CODE_SIGN_STYLE = Automatic; 424 | COMBINE_HIDPI_IMAGES = YES; 425 | DEVELOPMENT_TEAM = 76EXZ289MK; 426 | INFOPLIST_FILE = "midi-player/Info.plist"; 427 | LD_RUNPATH_SEARCH_PATHS = ( 428 | "$(inherited)", 429 | "@executable_path/../Frameworks", 430 | ); 431 | PRODUCT_BUNDLE_IDENTIFIER = "com.jazz-soft.midi-player"; 432 | PRODUCT_NAME = "$(TARGET_NAME)"; 433 | SWIFT_VERSION = 5.0; 434 | }; 435 | name = Release; 436 | }; 437 | A2AF60A523ED3CF2000E163A /* Debug */ = { 438 | isa = XCBuildConfiguration; 439 | buildSettings = { 440 | CODE_SIGN_ENTITLEMENTS = extension/extension.entitlements; 441 | CODE_SIGN_IDENTITY = "Apple Development"; 442 | CODE_SIGN_STYLE = Automatic; 443 | DEVELOPMENT_TEAM = 76EXZ289MK; 444 | INFOPLIST_FILE = extension/Info.plist; 445 | LD_RUNPATH_SEARCH_PATHS = ( 446 | "$(inherited)", 447 | "@executable_path/../Frameworks", 448 | "@executable_path/../../../../Frameworks", 449 | ); 450 | PRODUCT_BUNDLE_IDENTIFIER = "com.jazz-soft.midi-player.extension"; 451 | PRODUCT_NAME = "$(TARGET_NAME)"; 452 | SKIP_INSTALL = YES; 453 | SWIFT_VERSION = 5.0; 454 | }; 455 | name = Debug; 456 | }; 457 | A2AF60A623ED3CF2000E163A /* Release */ = { 458 | isa = XCBuildConfiguration; 459 | buildSettings = { 460 | CODE_SIGN_ENTITLEMENTS = extension/extension.entitlements; 461 | CODE_SIGN_IDENTITY = "Apple Development"; 462 | CODE_SIGN_STYLE = Automatic; 463 | DEVELOPMENT_TEAM = 76EXZ289MK; 464 | INFOPLIST_FILE = extension/Info.plist; 465 | LD_RUNPATH_SEARCH_PATHS = ( 466 | "$(inherited)", 467 | "@executable_path/../Frameworks", 468 | "@executable_path/../../../../Frameworks", 469 | ); 470 | PRODUCT_BUNDLE_IDENTIFIER = "com.jazz-soft.midi-player.extension"; 471 | PRODUCT_NAME = "$(TARGET_NAME)"; 472 | SKIP_INSTALL = YES; 473 | SWIFT_VERSION = 5.0; 474 | }; 475 | name = Release; 476 | }; 477 | /* End XCBuildConfiguration section */ 478 | 479 | /* Begin XCConfigurationList section */ 480 | A2AF607523ED3B85000E163A /* Build configuration list for PBXProject "midi-player" */ = { 481 | isa = XCConfigurationList; 482 | buildConfigurations = ( 483 | A2AF608623ED3B86000E163A /* Debug */, 484 | A2AF608723ED3B86000E163A /* Release */, 485 | ); 486 | defaultConfigurationIsVisible = 0; 487 | defaultConfigurationName = Release; 488 | }; 489 | A2AF608823ED3B86000E163A /* Build configuration list for PBXNativeTarget "midi-player" */ = { 490 | isa = XCConfigurationList; 491 | buildConfigurations = ( 492 | A2AF608923ED3B86000E163A /* Debug */, 493 | A2AF608A23ED3B86000E163A /* Release */, 494 | ); 495 | defaultConfigurationIsVisible = 0; 496 | defaultConfigurationName = Release; 497 | }; 498 | A2AF60A423ED3CF2000E163A /* Build configuration list for PBXNativeTarget "extension" */ = { 499 | isa = XCConfigurationList; 500 | buildConfigurations = ( 501 | A2AF60A523ED3CF2000E163A /* Debug */, 502 | A2AF60A623ED3CF2000E163A /* Release */, 503 | ); 504 | defaultConfigurationIsVisible = 0; 505 | defaultConfigurationName = Release; 506 | }; 507 | /* End XCConfigurationList section */ 508 | }; 509 | rootObject = A2AF607223ED3B85000E163A /* Project object */; 510 | } 511 | --------------------------------------------------------------------------------
audio
11 | local url 12 | local not found 13 |
14 | remote url 15 | remote CORS 16 |
17 | data url base64 18 | data url plain 19 |