├── .github └── workflows │ └── ci.yml ├── .gitignore ├── .gitmodules ├── LICENSE ├── MidiKeys.xcodeproj ├── project.pbxproj ├── xcshareddata │ └── xcschemes │ │ └── MidiKeys.xcscheme └── xcuserdata │ └── creed.xcuserdatad │ └── xcschemes │ └── xcschememanagement.plist ├── MidiKeys.xcworkspace ├── contents.xcworkspacedata ├── xcshareddata │ ├── IDEWorkspaceChecks.plist │ ├── MidiKeys.xccheckout │ └── WorkspaceSettings.xcsettings └── xcuserdata │ └── creed.xcuserdatad │ ├── IDEFindNavigatorScopes.plist │ ├── WorkspaceSettings.xcsettings │ └── xcschemes │ └── xcschememanagement.plist ├── README.md ├── Resources ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── Midikeys_v3_1024.png │ │ ├── Midikeys_v3_128.png │ │ ├── Midikeys_v3_256-1.png │ │ ├── Midikeys_v3_256.png │ │ ├── Midikeys_v3_32.png │ │ ├── Midikeys_v3_512-1.png │ │ ├── Midikeys_v3_512.png │ │ └── Midikeys_v3_64.png │ ├── Contents.json │ ├── Octave.imageset │ │ ├── Contents.json │ │ └── Octave.png │ ├── OctaveDown.imageset │ │ ├── Contents.json │ │ └── OctaveDown.png │ └── OctaveUp.imageset │ │ ├── Contents.json │ │ └── OctaveUp.png ├── KeyMaps.plist ├── MidiKeys-Info.plist ├── MidiKeys.entitlements ├── de.lproj │ ├── Credits.html │ ├── InfoPlist.strings │ ├── KeyMapNames.strings │ ├── Localizable.strings │ ├── MainMenu.xib │ └── Preferences.xib ├── dsa_pub.pem ├── en.lproj │ ├── Credits.html │ ├── InfoPlist.strings │ ├── KeyMapNames.strings │ ├── Localizable.strings │ ├── MainMenu.xib │ └── Preferences.xib └── fr.lproj │ ├── Credits.html │ ├── InfoPlist.strings │ ├── KeyMapNames.strings │ ├── Localizable.strings │ ├── MainMenu.xib │ └── Preferences.xib ├── Source ├── AppController.h ├── AppController.m ├── CTGradient.h ├── CTGradient.m ├── ColourDefaults.h ├── ColourDefaults.m ├── EndpointDefaults.h ├── EndpointDefaults.m ├── KeyMapManager.h ├── KeyMapManager.m ├── MIDI.h ├── MidiKeyMap.h ├── MidiKeyMap.m ├── MidiKeyView.h ├── MidiKeyView.m ├── MidiKeysApplication.h ├── MidiKeysApplication.m ├── MidiKeys_Prefix.h ├── MidiParser.h ├── MidiParser.m ├── OverlayIndicator.h ├── OverlayIndicator.m ├── Preferences.h ├── PreferencesController.h ├── PreferencesController.m └── main.m ├── Sparkle.framework.dSYM └── Contents │ ├── Info.plist │ └── Resources │ └── DWARF │ └── Sparkle ├── Sparkle.framework ├── Headers ├── Modules ├── PrivateHeaders ├── Resources ├── Sparkle └── Versions │ ├── A │ ├── Headers │ │ ├── SPUDownloadData.h │ │ ├── SPUDownloader.h │ │ ├── SPUDownloaderDelegate.h │ │ ├── SPUDownloaderDeprecated.h │ │ ├── SPUDownloaderProtocol.h │ │ ├── SPUDownloaderSession.h │ │ ├── SPUURLRequest.h │ │ ├── SUAppcast.h │ │ ├── SUAppcastItem.h │ │ ├── SUCodeSigningVerifier.h │ │ ├── SUErrors.h │ │ ├── SUExport.h │ │ ├── SUStandardVersionComparator.h │ │ ├── SUUpdater.h │ │ ├── SUUpdaterDelegate.h │ │ ├── SUVersionComparisonProtocol.h │ │ ├── SUVersionDisplayProtocol.h │ │ └── Sparkle.h │ ├── Modules │ │ └── module.modulemap │ ├── PrivateHeaders │ │ └── SUUnarchiver.h │ ├── Resources │ │ ├── Autoupdate.app │ │ │ └── Contents │ │ │ │ ├── Info.plist │ │ │ │ ├── MacOS │ │ │ │ ├── Autoupdate │ │ │ │ └── fileop │ │ │ │ ├── PkgInfo │ │ │ │ ├── Resources │ │ │ │ ├── AppIcon.icns │ │ │ │ ├── SUStatus.nib │ │ │ │ ├── ar.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── ca.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── cs.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── da.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── de.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── el.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── en.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── es.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── fi.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── fr.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── he.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── hr.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── hu.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── is.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── it.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── ja.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── ko.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── nb.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── nl.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── pl.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── pt_BR.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── pt_PT.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── ro.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── ru.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── sk.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── sl.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── sv.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── th.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── tr.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── uk.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── zh_CN.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ └── zh_TW.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ └── _CodeSignature │ │ │ │ └── CodeResources │ │ ├── DarkAqua.css │ │ ├── Info.plist │ │ ├── SUModelTranslation.plist │ │ ├── SUStatus.nib │ │ ├── ar.lproj │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ ├── SUUpdateAlert.nib │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ └── Sparkle.strings │ │ ├── ca.lproj │ │ │ └── Sparkle.strings │ │ ├── cs.lproj │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ ├── SUUpdateAlert.nib │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ └── Sparkle.strings │ │ ├── da.lproj │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ ├── SUUpdateAlert.nib │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ └── Sparkle.strings │ │ ├── de.lproj │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ ├── SUUpdateAlert.nib │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ └── Sparkle.strings │ │ ├── el.lproj │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ ├── SUUpdateAlert.nib │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ └── Sparkle.strings │ │ ├── en.lproj │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ ├── SUUpdateAlert.nib │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ └── Sparkle.strings │ │ ├── es.lproj │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ ├── SUUpdateAlert.nib │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ └── Sparkle.strings │ │ ├── fi.lproj │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ ├── SUUpdateAlert.nib │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ └── Sparkle.strings │ │ ├── fr.lproj │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ ├── SUUpdateAlert.nib │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ └── Sparkle.strings │ │ ├── fr_CA.lproj │ │ ├── he.lproj │ │ │ └── Sparkle.strings │ │ ├── hr.lproj │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ ├── SUUpdateAlert.nib │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ └── Sparkle.strings │ │ ├── hu.lproj │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ ├── SUUpdateAlert.nib │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ └── Sparkle.strings │ │ ├── is.lproj │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ ├── SUUpdateAlert.nib │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ └── Sparkle.strings │ │ ├── it.lproj │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ ├── SUUpdateAlert.nib │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ └── Sparkle.strings │ │ ├── ja.lproj │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ ├── SUUpdateAlert.nib │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ └── Sparkle.strings │ │ ├── ko.lproj │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ ├── SUUpdateAlert.nib │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ └── Sparkle.strings │ │ ├── nb.lproj │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ ├── SUUpdateAlert.nib │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ └── Sparkle.strings │ │ ├── nl.lproj │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ ├── SUUpdateAlert.nib │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ └── Sparkle.strings │ │ ├── pl.lproj │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ ├── SUUpdateAlert.nib │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ └── Sparkle.strings │ │ ├── pt.lproj │ │ ├── pt_BR.lproj │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ ├── SUUpdateAlert.nib │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ └── Sparkle.strings │ │ ├── pt_PT.lproj │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ ├── SUUpdateAlert.nib │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ └── Sparkle.strings │ │ ├── ro.lproj │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ ├── SUUpdateAlert.nib │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ └── Sparkle.strings │ │ ├── ru.lproj │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ ├── SUUpdateAlert.nib │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ └── Sparkle.strings │ │ ├── sk.lproj │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ ├── SUUpdateAlert.nib │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ └── Sparkle.strings │ │ ├── sl.lproj │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ ├── SUUpdateAlert.nib │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ └── Sparkle.strings │ │ ├── sv.lproj │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ ├── SUUpdateAlert.nib │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ └── Sparkle.strings │ │ ├── th.lproj │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ ├── SUUpdateAlert.nib │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ └── Sparkle.strings │ │ ├── tr.lproj │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ ├── SUUpdateAlert.nib │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ └── Sparkle.strings │ │ ├── uk.lproj │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ ├── SUUpdateAlert.nib │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ └── Sparkle.strings │ │ ├── zh_CN.lproj │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ ├── SUUpdateAlert.nib │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ └── Sparkle.strings │ │ └── zh_TW.lproj │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ ├── SUUpdateAlert.nib │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ └── Sparkle.strings │ ├── Sparkle │ └── _CodeSignature │ │ └── CodeResources │ └── Current ├── ci.xcconfig ├── docs ├── LiesMich.rtf ├── Lisez-Moi.rtf ├── ReadMe (Japanese).rtf └── ReadMe.rtf ├── img └── midikeys_screen.png └── version_history.md /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | # Workflow to build MidiKeys. 2 | 3 | name: CI 4 | 5 | on: 6 | - push 7 | - pull_request 8 | 9 | jobs: 10 | build: 11 | name: Build 12 | runs-on: macos-latest 13 | 14 | steps: 15 | - name: Checkout 16 | uses: actions/checkout@v2 17 | with: 18 | submodules: true 19 | - name: Build 20 | env: 21 | scheme: MidiKeys 22 | run: | 23 | xcodebuild build -scheme "$scheme" -workspace MidiKeys.xcworkspace -xcconfig ci.xcconfig -allowProvisioningUpdates 24 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # 2 | # NOTE! Don't add files that are generated in specific 3 | # subdirectories here. Add them in the ".gitignore" file 4 | # in that subdirectory instead. 5 | # 6 | # NOTE! Please use 'git-ls-files -i --exclude-standard' 7 | # command after changing this file, to see if there are 8 | # any tracked files which get ignored after the change. 9 | # 10 | # Normal rules 11 | # 12 | *.o 13 | *.o.* 14 | *.a 15 | *.ko 16 | *.so 17 | *.so.dbg 18 | *.mod.c 19 | *.i 20 | *.lst 21 | *.symtypes 22 | *.order 23 | *.elf 24 | *.bin 25 | *.gz 26 | ._* 27 | .DS_Store 28 | 29 | # 30 | # Top-level generic files 31 | # 32 | release 33 | *_release 34 | tags 35 | TAGS 36 | vmlinux 37 | System.map 38 | Module.markers 39 | Module.symvers 40 | !.gitignore 41 | !.mailmap 42 | 43 | # 44 | # Generated include files 45 | # 46 | 47 | # stgit generated dirs 48 | patches-* 49 | 50 | # quilt's files 51 | patches 52 | series 53 | *.patch 54 | 55 | # cscope files 56 | cscope.* 57 | ncscope.* 58 | 59 | *.orig 60 | *~ 61 | \#*# 62 | workspace 63 | .BUILD* 64 | ~* 65 | 66 | # Windows project stuff 67 | *.suo 68 | *.sdf 69 | *.opensdf 70 | 71 | # Xcode user state 72 | *.xcbkptlist 73 | *.xcuserstate 74 | *.xcuserdatad 75 | 76 | # Python bytecode 77 | *.pyc 78 | __pycache__ 79 | 80 | # IAR temp files 81 | EW*.tmp 82 | 83 | 84 | .svn 85 | Build 86 | build 87 | DerivedData 88 | 89 | # Sparkle private key 90 | dsa_priv.pem 91 | 92 | 93 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "ShortcutRecorder"] 2 | path = ShortcutRecorder 3 | url = git@github.com:Kentzo/ShortcutRecorder.git 4 | -------------------------------------------------------------------------------- /MidiKeys.xcodeproj/xcshareddata/xcschemes/MidiKeys.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 37 | 38 | 39 | 40 | 41 | 42 | 53 | 55 | 61 | 62 | 63 | 64 | 70 | 72 | 78 | 79 | 80 | 81 | 83 | 84 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /MidiKeys.xcodeproj/xcuserdata/creed.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | MidiKeys.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 3 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 02D210DB2309F20A007F7B5E 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /MidiKeys.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /MidiKeys.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /MidiKeys.xcworkspace/xcshareddata/MidiKeys.xccheckout: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDESourceControlProjectFavoriteDictionaryKey 6 | 7 | IDESourceControlProjectIdentifier 8 | C56180C3-F612-4901-BFF8-D2799CFFEF60 9 | IDESourceControlProjectName 10 | MidiKeys 11 | IDESourceControlProjectOriginsDictionary 12 | 13 | 16C17E10-D637-4CCA-8138-24FC791BB562 14 | svn://himiko.local/svnroot/MidiKeys/trunk 15 | 16 | IDESourceControlProjectPath 17 | MidiKeys.xcodeproj/project.xcworkspace 18 | IDESourceControlProjectRelativeInstallPathDictionary 19 | 20 | 16C17E10-D637-4CCA-8138-24FC791BB562 21 | ../.. 22 | 23 | IDESourceControlProjectRepositoryRootDictionary 24 | 25 | 16C17E10-D637-4CCA-8138-24FC791BB562 26 | svn://himiko.local/svnroot 27 | 28 | IDESourceControlProjectURL 29 | svn://himiko.local/svnroot/MidiKeys/trunk/MidiKeys.xcodeproj 30 | IDESourceControlProjectVersion 31 | 110 32 | IDESourceControlProjectWCCIdentifier 33 | 16C17E10-D637-4CCA-8138-24FC791BB562 34 | IDESourceControlProjectWCConfigurations 35 | 36 | 37 | IDESourceControlRepositoryExtensionIdentifierKey 38 | public.vcs.subversion 39 | IDESourceControlWCCIdentifierKey 40 | 16C17E10-D637-4CCA-8138-24FC791BB562 41 | IDESourceControlWCCName 42 | MidiKeys 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /MidiKeys.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /MidiKeys.xcworkspace/xcuserdata/creed.xcuserdatad/IDEFindNavigatorScopes.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /MidiKeys.xcworkspace/xcuserdata/creed.xcuserdatad/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildLocationStyle 6 | UseAppPreferences 7 | CustomBuildLocationType 8 | RelativeToDerivedData 9 | DerivedDataLocationStyle 10 | Default 11 | EnabledFullIndexStoreVisibility 12 | 13 | HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges 14 | 15 | IDEWorkspaceUserSettings_HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges 16 | 17 | IDEWorkspaceUserSettings_SnapshotAutomaticallyBeforeSignificantChanges 18 | 19 | IssueFilterStyle 20 | ShowActiveSchemeOnly 21 | LiveSourceIssuesEnabled 22 | 23 | SnapshotAutomaticallyBeforeSignificantChanges 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /MidiKeys.xcworkspace/xcuserdata/creed.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Documentation (Playground) 1.xcscheme 8 | 9 | isShown 10 | 11 | orderHint 12 | 4 13 | 14 | Documentation (Playground) 2.xcscheme 15 | 16 | isShown 17 | 18 | orderHint 19 | 5 20 | 21 | Documentation (Playground) 3.xcscheme 22 | 23 | isShown 24 | 25 | orderHint 26 | 6 27 | 28 | Documentation (Playground).xcscheme 29 | 30 | isShown 31 | 32 | orderHint 33 | 1 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![icon](Resources/Assets.xcassets/AppIcon.appiconset/Midikeys_v3_128.png) 2 | 3 | MidiKeys 4 | ========== 5 | 6 | macOS application that presents an on-screen MIDI keyboard. 7 | 8 | ![screenshot](img/midikeys_screen.png) 9 | 10 | The keys are clickable and the physical keyboard is mapped to notes. Global shortcuts can be 11 | configured to enable playing notes while MidiKeys is in the background. 12 | 13 | Sends on any MIDI channel either to a chosen destination port or as a virtual source. 14 | Listen to another device to show ntoes being played on the keys. 15 | 16 | Runs on macOS 10.11 (Big Sur) and above. (Please note that you need to use at least version 17 | [1.9.1](/flit/MidiKeys/releases/tag/v1.9.1) when running on 10.11 and above.) 18 | 19 | 20 | Made available through the [Apache 2.0 license](LICENSE). 21 | 22 | Copyright © 2002-2020 beatimprint LLC 23 | -------------------------------------------------------------------------------- /Resources/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "mac", 5 | "size" : "16x16", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "mac", 10 | "size" : "16x16", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "size" : "32x32", 15 | "idiom" : "mac", 16 | "filename" : "Midikeys_v3_32.png", 17 | "scale" : "1x" 18 | }, 19 | { 20 | "size" : "32x32", 21 | "idiom" : "mac", 22 | "filename" : "Midikeys_v3_64.png", 23 | "scale" : "2x" 24 | }, 25 | { 26 | "size" : "128x128", 27 | "idiom" : "mac", 28 | "filename" : "Midikeys_v3_128.png", 29 | "scale" : "1x" 30 | }, 31 | { 32 | "size" : "128x128", 33 | "idiom" : "mac", 34 | "filename" : "Midikeys_v3_256-1.png", 35 | "scale" : "2x" 36 | }, 37 | { 38 | "size" : "256x256", 39 | "idiom" : "mac", 40 | "filename" : "Midikeys_v3_256.png", 41 | "scale" : "1x" 42 | }, 43 | { 44 | "size" : "256x256", 45 | "idiom" : "mac", 46 | "filename" : "Midikeys_v3_512-1.png", 47 | "scale" : "2x" 48 | }, 49 | { 50 | "size" : "512x512", 51 | "idiom" : "mac", 52 | "filename" : "Midikeys_v3_512.png", 53 | "scale" : "1x" 54 | }, 55 | { 56 | "size" : "512x512", 57 | "idiom" : "mac", 58 | "filename" : "Midikeys_v3_1024.png", 59 | "scale" : "2x" 60 | } 61 | ], 62 | "info" : { 63 | "version" : 1, 64 | "author" : "xcode" 65 | } 66 | } -------------------------------------------------------------------------------- /Resources/Assets.xcassets/AppIcon.appiconset/Midikeys_v3_1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Resources/Assets.xcassets/AppIcon.appiconset/Midikeys_v3_1024.png -------------------------------------------------------------------------------- /Resources/Assets.xcassets/AppIcon.appiconset/Midikeys_v3_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Resources/Assets.xcassets/AppIcon.appiconset/Midikeys_v3_128.png -------------------------------------------------------------------------------- /Resources/Assets.xcassets/AppIcon.appiconset/Midikeys_v3_256-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Resources/Assets.xcassets/AppIcon.appiconset/Midikeys_v3_256-1.png -------------------------------------------------------------------------------- /Resources/Assets.xcassets/AppIcon.appiconset/Midikeys_v3_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Resources/Assets.xcassets/AppIcon.appiconset/Midikeys_v3_256.png -------------------------------------------------------------------------------- /Resources/Assets.xcassets/AppIcon.appiconset/Midikeys_v3_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Resources/Assets.xcassets/AppIcon.appiconset/Midikeys_v3_32.png -------------------------------------------------------------------------------- /Resources/Assets.xcassets/AppIcon.appiconset/Midikeys_v3_512-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Resources/Assets.xcassets/AppIcon.appiconset/Midikeys_v3_512-1.png -------------------------------------------------------------------------------- /Resources/Assets.xcassets/AppIcon.appiconset/Midikeys_v3_512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Resources/Assets.xcassets/AppIcon.appiconset/Midikeys_v3_512.png -------------------------------------------------------------------------------- /Resources/Assets.xcassets/AppIcon.appiconset/Midikeys_v3_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Resources/Assets.xcassets/AppIcon.appiconset/Midikeys_v3_64.png -------------------------------------------------------------------------------- /Resources/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Resources/Assets.xcassets/Octave.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Octave.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /Resources/Assets.xcassets/Octave.imageset/Octave.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Resources/Assets.xcassets/Octave.imageset/Octave.png -------------------------------------------------------------------------------- /Resources/Assets.xcassets/OctaveDown.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "OctaveDown.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /Resources/Assets.xcassets/OctaveDown.imageset/OctaveDown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Resources/Assets.xcassets/OctaveDown.imageset/OctaveDown.png -------------------------------------------------------------------------------- /Resources/Assets.xcassets/OctaveUp.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "OctaveUp.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /Resources/Assets.xcassets/OctaveUp.imageset/OctaveUp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Resources/Assets.xcassets/OctaveUp.imageset/OctaveUp.png -------------------------------------------------------------------------------- /Resources/KeyMaps.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Full 6 | 7 | Ranges 8 | 9 | 10 | FirstMidiNote 11 | 39 12 | KeyCodes 13 | 14 | 50 15 | 48 16 | 12 17 | 19 18 | 13 19 | 20 20 | 14 21 | 21 22 | 15 23 | 17 24 | 22 25 | 16 26 | 26 27 | 32 28 | 34 29 | 25 30 | 31 31 | 29 32 | 35 33 | 27 34 | 33 35 | 30 36 | 51 37 | 42 38 | 39 | 40 | 41 | FirstMidiNote 42 | 60 43 | KeyCodes 44 | 45 | 6 46 | 1 47 | 7 48 | 2 49 | 8 50 | 9 51 | 5 52 | 11 53 | 4 54 | 45 55 | 38 56 | 46 57 | 43 58 | 37 59 | 47 60 | 41 61 | 44 62 | 63 | 64 | 65 | 66 | Reversed Full 67 | 68 | Ranges 69 | 70 | 71 | FirstMidiNote 72 | 63 73 | KeyCodes 74 | 75 | 50 76 | 48 77 | 12 78 | 19 79 | 13 80 | 20 81 | 14 82 | 21 83 | 15 84 | 17 85 | 22 86 | 16 87 | 26 88 | 32 89 | 34 90 | 25 91 | 31 92 | 29 93 | 35 94 | 27 95 | 33 96 | 30 97 | 51 98 | 42 99 | 100 | 101 | 102 | FirstMidiNote 103 | 48 104 | KeyCodes 105 | 106 | 6 107 | 1 108 | 7 109 | 2 110 | 8 111 | 9 112 | 5 113 | 11 114 | 4 115 | 45 116 | 38 117 | 46 118 | 43 119 | 37 120 | 47 121 | 41 122 | 44 123 | 124 | 125 | 126 | 127 | FL Style 128 | 129 | Ranges 130 | 131 | 132 | FirstMidiNote 133 | 60 134 | KeyCodes 135 | 136 | 12 137 | 19 138 | 13 139 | 20 140 | 14 141 | 15 142 | 23 143 | 17 144 | 22 145 | 16 146 | 26 147 | 32 148 | 34 149 | 25 150 | 31 151 | 29 152 | 35 153 | 33 154 | 24 155 | 30 156 | 51 157 | 158 | 159 | 160 | FirstMidiNote 161 | 48 162 | KeyCodes 163 | 164 | 6 165 | 1 166 | 7 167 | 2 168 | 8 169 | 9 170 | 5 171 | 11 172 | 4 173 | 45 174 | 38 175 | 46 176 | 43 177 | 37 178 | 47 179 | 41 180 | 44 181 | 182 | 183 | 184 | 185 | Single 186 | 187 | Ranges 188 | 189 | 190 | FirstMidiNote 191 | 60 192 | KeyCodes 193 | 194 | 6 195 | 1 196 | 7 197 | 2 198 | 8 199 | 9 200 | 5 201 | 11 202 | 4 203 | 45 204 | 38 205 | 46 206 | 43 207 | 37 208 | 47 209 | 41 210 | 44 211 | 212 | 213 | 214 | 215 | Upper Single 216 | 217 | Ranges 218 | 219 | 220 | FirstMidiNote 221 | 51 222 | KeyCodes 223 | 224 | 50 225 | 48 226 | 12 227 | 19 228 | 13 229 | 20 230 | 14 231 | 21 232 | 15 233 | 17 234 | 22 235 | 16 236 | 26 237 | 32 238 | 34 239 | 25 240 | 31 241 | 29 242 | 35 243 | 27 244 | 33 245 | 30 246 | 51 247 | 42 248 | 249 | 250 | 251 | 252 | 253 | 254 | -------------------------------------------------------------------------------- /Resources/MidiKeys-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleExecutable 8 | MidiKeys 9 | CFBundleGetInfoString 10 | Copyright © 2002-2020 beatimprint LLC 11 | CFBundleHelpBookName 12 | ReadMe.rtf 13 | CFBundleIdentifier 14 | $(PRODUCT_BUNDLE_IDENTIFIER) 15 | CFBundleInfoDictionaryVersion 16 | 6.0 17 | CFBundleName 18 | MidiKeys 19 | CFBundlePackageType 20 | APPL 21 | CFBundleShortVersionString 22 | $(MARKETING_VERSION) 23 | CFBundleSignature 24 | MKéY 25 | CFBundleVersion 26 | $(CURRENT_PROJECT_VERSION) 27 | LSApplicationCategoryType 28 | public.app-category.music 29 | LSMinimumSystemVersion 30 | 10.11.0 31 | NSAppleEventsUsageDescription 32 | MidiKeys 33 | NSMainNibFile 34 | MainMenu 35 | NSPrincipalClass 36 | MidiKeysApplication 37 | SUFeedURL 38 | https://immosw.com/versions/midikeys/appcast.xml 39 | SUPublicDSAKeyFile 40 | dsa_pub.pem 41 | SUPublicEDKey 42 | Q/a/2ZnNlwgamk7BSIjJ2DbOivprx19sMNGFUIzUqrU= 43 | 44 | 45 | -------------------------------------------------------------------------------- /Resources/MidiKeys.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Resources/de.lproj/Credits.html: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 40 | 41 | 42 | 43 |
44 |

Geschrieben von

45 |

Chris Reed flit@ftml.net

46 |

47 | Verfügbar unter der Apache 2.0 Lizenz 48 |

49 |

50 | Veröffentlichungen und Quellcode auf GitHub verfügbar 51 |

52 |
53 | 54 |

55 | 56 |

57 |

Deutsche Lokalisierung

58 |

59 | Richard Zelzer http://www.zmusik.de/
60 | Ralf Welter i_see@macnews.de 61 |

62 |
63 | 64 |

65 | 66 |

67 |

Französisch Lokalisierung

68 |

69 | Frédéric Ballériaux
70 | Thierry Douez https://sunny-tdz.com 71 |

72 |
73 | 74 |

75 | 76 |

77 |

Spezieller Dank

78 |

79 | MonkeybreadSoftware
80 | Airy André
81 | Skye Ashbrook
82 | Frédéric Ballériaux
83 | Damon
84 | Fernando Díaz de la Torre
85 | Alexander Guy
86 | Magnus Helin
87 | Michael Keuter
88 | Norbert Rittel
89 | Ralf Welter
90 | rasda
91 | Adrian Steiger
92 | tdc
93 | Jon Wight
94 | Hiroshi Yamato
95 | xonox
96 | Richard Zelzer
97 | Matthew Kurzeja
98 | Thierry Douez
99 | Frederik Seiffert 100 |

101 |
102 | 103 |

104 | 105 |

106 |

Quelloffene Software

107 |

Sparkle framework 108 | https://sparkle-project.org 109 |

110 |

ShortcutRecorder 111 | https://github.com/Kentzo/ShortcutRecorder 112 |

113 |
114 | 115 | 116 | 117 | -------------------------------------------------------------------------------- /Resources/de.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Resources/de.lproj/InfoPlist.strings -------------------------------------------------------------------------------- /Resources/de.lproj/KeyMapNames.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Resources/de.lproj/KeyMapNames.strings -------------------------------------------------------------------------------- /Resources/de.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Resources/de.lproj/Localizable.strings -------------------------------------------------------------------------------- /Resources/dsa_pub.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN PUBLIC KEY----- 2 | MIIDOzCCAi0GByqGSM44BAEwggIgAoIBAQCK3zwwhog2q01dAXxM+Hgt9K/J28EE 3 | N0MnDtLsFnCwVsds6KHc0jn9FBt4hX9dTHG/PZe9ytzrVjI/r3N3sKu3p6rbqK95 4 | 6RnNx/OylHHRtAOnmfxUDXuyiwTyBA7KPBhR7YSSL1EApSrf7yE1fdjbpSwNVTAw 5 | TewGK10Z6nfH9SjfRCRfUxviEVG8ZiBVlSc2RE6AL3nECRgIq4MJm8A/S6/RCSG6 6 | yZzlv0K/22KtaLFlwgenhDXH3wcEdNpZBlN6mmbHhS9xIQMCK+pLA5q+x0omriCz 7 | iz7rR6wosb6EX/NklTJtbs0QPjrVmrSrZMdQiXa3DXowRy7aluDBPePJAhUAw3yy 8 | 6Wv7PUjW8PxiOUt16kN0JHkCggEAAN7yi3+pHqaA3fRbwkOvQsAFxJL8YHa1m3wy 9 | cZdyfhS3bp5A9NjH9R0R6IsOFWRZGtJDZ6E5sxgQFYnD+T//0rjuQroHvXCN+Eja 10 | EdnSPruMeeTVsg0PEWo/ie7jH9pdbZSRO0Aw2kX5K2WvSNOC1S+lQ0/4RMS1MmpK 11 | OoO0HKWHzmOR7PRDHaaILb0apC/wiutt5eVkLN0+83Ryu2lADDkLSEUCs4dktNzf 12 | 7OzUrBIJInT9s+hmCsjf8N92voBZgVhnvv7pdc1zXZkRIaHAaEYKZVxspN1OWx4J 13 | ZQUMwJ85IEIJrSlzhbLJfz9ZLRyco9l4he2lnlwCC4VHccDP5gOCAQYAAoIBAQCI 14 | 8wiJ4Qr37379d/wdxwRG6IbFxgGPt2/hVjS1dXsN+fm4iBCP8bqZAccM0Ki58NEU 15 | QnYsXQCRD3OFaMt04F/Uj/Lnb72CZcofz0QPZLL/rONoQp+bPKO3icS4SyI+/FI2 16 | uSdYsKDbb6laEHiDyTNiyIeHyvprE8An/Di3BmIKIpxIpvFmm67djoLas2OHXVv6 17 | ftuNCXIZChpQJsiU31Fjo/MbUyTWHreA6+gqblv4SlfhBvs7OM9iuOuRxFISMQc2 18 | eUAsF1e1MgaypFhaMW84b9cnSYaZQqWevTT1Jr0Dwq8qoVAVpWLGnhkY/sI/VCMT 19 | J920TrzqqpNizNAduzfD 20 | -----END PUBLIC KEY----- 21 | -------------------------------------------------------------------------------- /Resources/en.lproj/Credits.html: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 40 | 41 | 42 | 43 |
44 |

Written by

45 |

Chris Reed flit@ftml.net

46 |

47 | Made available under the Apache 2.0 license 48 |

49 |

50 | Releases and source code available on GitHub 51 |

52 |
53 | 54 |

55 | 56 |

57 |

German localisation

58 |

59 | Richard Zelzer http://www.zmusik.de/
60 | Ralf Welter i_see@macnews.de 61 |

62 |
63 | 64 |

65 | 66 |

67 |

French localisation

68 |

69 | Frédéric Ballériaux
70 | Thierry Douez https://sunny-tdz.com 71 |

72 |
73 | 74 |

75 | 76 |

77 |

Special thanks to

78 |

79 | MonkeybreadSoftware
80 | Airy André
81 | Skye Ashbrook
82 | Frédéric Ballériaux
83 | Damon
84 | Fernando Díaz de la Torre
85 | Alexander Guy
86 | Magnus Helin
87 | Michael Keuter
88 | Norbert Rittel
89 | Ralf Welter
90 | rasda
91 | Adrian Steiger
92 | tdc
93 | Jon Wight
94 | Hiroshi Yamato
95 | xonox
96 | Richard Zelzer
97 | Matthew Kurzeja
98 | Thierry Douez
99 | Frederik Seiffert 100 |

101 |
102 | 103 |

104 | 105 |

106 |

Open source software

107 |

Sparkle framework 108 | https://sparkle-project.org 109 |

110 |

ShortcutRecorder 111 | https://github.com/Kentzo/ShortcutRecorder 112 |

113 |
114 | 115 | 116 | 117 | -------------------------------------------------------------------------------- /Resources/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Resources/en.lproj/InfoPlist.strings -------------------------------------------------------------------------------- /Resources/en.lproj/KeyMapNames.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Resources/en.lproj/KeyMapNames.strings -------------------------------------------------------------------------------- /Resources/en.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Resources/en.lproj/Localizable.strings -------------------------------------------------------------------------------- /Resources/fr.lproj/Credits.html: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 40 | 41 | 42 | 43 |
44 |

Ecrit par

45 |

Chris Reed flit@ftml.net

46 |

47 | Disponible sous la license Apache 2.0 48 |

49 |

50 | Versions et codes disponibles sur GitHub 51 |

52 |
53 | 54 |

55 | 56 |

57 |

Localisation allemande

58 |

59 | Richard Zelzer http://www.zmusik.de/
60 | Ralf Welter i_see@macnews.de 61 |

62 |
63 | 64 |

65 | 66 |

67 |

Localisation française

68 |

69 | Frédéric Ballériaux
70 | Thierry Douez https://sunny-tdz.com 71 |

72 |
73 | 74 |

75 | 76 |

77 |

Merci à

78 |

79 | MonkeybreadSoftware
80 | Airy André
81 | Skye Ashbrook
82 | Frédéric Ballériaux
83 | Damon
84 | Fernando Díaz de la Torre
85 | Alexander Guy
86 | Magnus Helin
87 | Michael Keuter
88 | Norbert Rittel
89 | Ralf Welter
90 | rasda
91 | Adrian Steiger
92 | tdc
93 | Jon Wight
94 | Hiroshi Yamato
95 | xonox
96 | Richard Zelzer
97 | Matthew Kurzeja
98 | Thierry Douez
99 | Frederik Seiffert 100 |

101 |
102 | 103 |

104 | 105 |

106 |

Logiciels open source

107 |

Sparkle framework 108 | https://sparkle-project.org 109 |

110 |

ShortcutRecorder 111 | https://github.com/Kentzo/ShortcutRecorder 112 |

113 |
114 | 115 | 116 | 117 | -------------------------------------------------------------------------------- /Resources/fr.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Resources/fr.lproj/InfoPlist.strings -------------------------------------------------------------------------------- /Resources/fr.lproj/KeyMapNames.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Resources/fr.lproj/KeyMapNames.strings -------------------------------------------------------------------------------- /Resources/fr.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Resources/fr.lproj/Localizable.strings -------------------------------------------------------------------------------- /Source/AppController.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppController.h 3 | // MidiKeys 4 | // 5 | // Created by Chris Reed on Tue Oct 15 2002. 6 | // Copyright (c) 2002-2003 Chris Reed. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | #import 12 | #import "MidiKeyView.h" 13 | 14 | @class KeyMapManager; 15 | @class MidiKeyMap; 16 | @class OverlayIndicator; 17 | 18 | //! The name we use for our CoreMIDI client and virtual source 19 | #define kMyClientName CFSTR("MidiKeys") 20 | 21 | //! Name of the overlay image of a section of the keyboard. 22 | #define kKeyboardOverlayImage @"Octave" 23 | 24 | //! Name of the octave up overlay image. 25 | #define kOctaveUpOverlayImage @"OctaveUp" 26 | 27 | //! Name of the octave down overlay image. 28 | #define kOctaveDownOverlayImage @"OctaveDown" 29 | 30 | //! \name Keycodes for arrow keys 31 | //@{ 32 | #define kRightArrowKeycode 124 33 | #define kLeftArrowKeycode 123 34 | #define kUpArrowKeycode 126 35 | #define kDownArrowKeycode 125 36 | //@} 37 | 38 | //! Direction of velocity adjustment. 39 | enum _velocity_up_or_down 40 | { 41 | kVelocityUp, 42 | kVelocityDown 43 | }; 44 | 45 | /*! 46 | * @brief Main controller class for Midi Keys. 47 | * 48 | * Manages the keyboard window, all MIDI events, hot keys, menu items, and pretty much every 49 | * thing else except for preferences. 50 | */ 51 | @interface AppController : NSObject 52 | { 53 | IBOutlet NSPopUpButton *destinationPopup; 54 | IBOutlet NSPopUpButton *sourcePopup; 55 | IBOutlet MidiKeyView *midiKeys; 56 | IBOutlet NSSlider *velocitySlider; 57 | IBOutlet NSPopUpButton * channelPopup; 58 | IBOutlet KeyMapManager *keyMapManager; 59 | IBOutlet NSView *toggleView; 60 | IBOutlet NSView *hiddenItemsView; 61 | IBOutlet NSButton *midiThruCheckbox; 62 | IBOutlet NSMenuItem * _toggleHotKeysMenuItem; 63 | 64 | MIDIClientRef clientRef; 65 | MIDIPortRef outputPort; 66 | MIDIPortRef inputPort; 67 | MIDIEndpointRef virtualSourceEndpoint; 68 | MIDIUniqueID virtualSourceUID; 69 | MIDIEndpointRef selectedSource; 70 | BOOL isSourceConnected; 71 | MIDIEndpointRef selectedDestination; 72 | BOOL isDestinationConnected; // if YES, we're not using the virtual source 73 | BOOL performMidiThru; 74 | float currentVelocity; 75 | float maxVelocity; 76 | int currentChannel; 77 | int octaveOffset; 78 | MidiKeyMap *keyMap; 79 | EventHotKeyRef _toggleHotKeyRef; 80 | EventHotKeyRef octaveUpHotKeyRef; 81 | EventHotKeyRef octaveDownHotKeyRef; 82 | EventHotKeyRef velocityUpHotKeyRef; 83 | EventHotKeyRef velocityDownHotKeyRef; 84 | BOOL hotKeysAreRegistered; 85 | BOOL makeWindowSolidWhenOnTop; 86 | BOOL isWindowToggled; 87 | float toggleDelta; 88 | NSTimer *velocityHotKeyTimer; 89 | OverlayIndicator *_indicator; 90 | // NSStatusItem * _hotKeysStatusItem; 91 | } 92 | 93 | + (AppController *)sharedController; 94 | 95 | - (IBAction)destinationSelected:(id)sender; 96 | - (IBAction)sourceSelected:(id)sender; 97 | - (IBAction)velocitySliderChanged:(id)sender; 98 | - (IBAction)channelDidChange:(id)sender; 99 | - (IBAction)toggleMidiThru:(id)sender; 100 | - (IBAction)toggleMidiControls:(id)sender; 101 | - (IBAction)octaveUp:(id)sender; 102 | - (IBAction)octaveDown:(id)sender; 103 | - (IBAction)clearStuckKeys:(id)sender; 104 | 105 | @end 106 | 107 | @interface AppController (HotKeys) 108 | 109 | - (IBAction)toggleHotKeys:(id)sender; 110 | - (void)enableHotKeys; 111 | - (void)disableHotKeys; 112 | 113 | - (void)registerOctaveHotKeysWithModifiers:(int)modifiers; 114 | - (void)unregisterOctaveHotKeys; 115 | 116 | - (void)handleVelocityKeyPressedUpOrDown:(int)upOrDown; 117 | - (void)velocityHotKeyTimerFired:(NSTimer *)timer; 118 | - (void)handleVelocityKeyReleased; 119 | 120 | - (void)hotKeyPressed:(uintptr_t)identifier; 121 | - (void)hotKeyReleased:(uintptr_t)identifier; 122 | 123 | - (void)registerToggleHotKey; 124 | - (void)unregisterToggleHotKey; 125 | 126 | - (void)registerHotKeys; 127 | - (void)unregisterHotKeys; 128 | 129 | - (void)displayHotKeysOverlay; 130 | 131 | @end 132 | 133 | @interface AppController (MIDI) 134 | 135 | - (NSString *)nameForMidiEndpoint:(MIDIEndpointRef)theEndpoint; 136 | 137 | // use vel=0 for off 138 | - (void)sendMidiPackets:(const MIDIPacketList *)packetList; 139 | - (void)sendMidiBytes:(int)count :(uint8_t)byte0 :(uint8_t)byte1 :(uint8_t)byte2; 140 | - (void)sendMidiBytes:(uint8_t)byte0 :(uint8_t)byte1 :(uint8_t)byte2; 141 | - (void)sendMidiBytes:(uint8_t)byte0 :(uint8_t)byte1; 142 | - (void)sendMidiNote:(int)midiNote channel:(int)channel velocity:(int)velocity; 143 | - (void)handleMidiNotification:(const MIDINotification *)message; 144 | - (void)receiveMidiPacketList:(const MIDIPacketList *)packetList; 145 | 146 | - (void)adjustVelocity:(float)delta; 147 | 148 | - (IBAction)sendAllNotesOff:(id)sender; 149 | 150 | - (NSString *)characterForMidiNote:(int)note; 151 | 152 | @end 153 | 154 | 155 | -------------------------------------------------------------------------------- /Source/CTGradient.h: -------------------------------------------------------------------------------- 1 | // 2 | // CTGradient.h 3 | // 4 | // Created by Chad Weider on 12/3/05. 5 | // Copyright (c) 2005 Cotingent. 6 | // Some rights reserved: 7 | // 8 | 9 | #import 10 | 11 | typedef struct _CTGradientElement 12 | { 13 | CGFloat red, green, blue, alpha; 14 | CGFloat position; 15 | 16 | struct _CTGradientElement *nextElement; 17 | } CTGradientElement; 18 | 19 | 20 | @interface CTGradient : NSObject 21 | { 22 | CTGradientElement* elementList; 23 | 24 | CGFunctionRef gradientFunction; 25 | } 26 | 27 | + (id)gradientWithBeginningColor:(NSColor *)begin endingColor:(NSColor *)end; 28 | 29 | + (id)aquaSelectedGradient; 30 | + (id)aquaNormalGradient; 31 | + (id)aquaPressedGradient; 32 | 33 | + (id)unifiedSelectedGradient; 34 | + (id)unifiedNormalGradient; 35 | + (id)unifiedPressedGradient; 36 | + (id)unifiedDarkGradient; 37 | 38 | - (CTGradient *)gradientWithAlphaComponent:(double)alpha; 39 | 40 | - (CTGradient *)addColorStop:(NSColor *)color atPosition:(double)position; //positions given relative to [0,1] 41 | - (CTGradient *)removeColorStopAtIndex:(unsigned)index; 42 | - (CTGradient *)removeColorStopAtPosition:(double)position; 43 | 44 | 45 | - (NSColor *)colorStopAtIndex:(unsigned)index; 46 | - (NSColor *)colorAtPosition:(double)position; 47 | 48 | 49 | - (void)drawSwatchInRect:(NSRect)rect; 50 | - (void)fillRect:(NSRect)rect angle:(double)angle; //fills rect with axial gradient 51 | // angle in degrees 52 | - (void)radialFillRect:(NSRect)rect; //fills rect with radial gradient 53 | // gradient from center outwards 54 | @end 55 | -------------------------------------------------------------------------------- /Source/ColourDefaults.h: -------------------------------------------------------------------------------- 1 | // 2 | // ColourDefaults.h 3 | // MidiKeys 4 | // 5 | // Created by Chris Reed on Sat Oct 26 2002. 6 | // Copyright (c) 2002 Chris Reed. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | 12 | @interface NSUserDefaults (ColourDefaults) 13 | 14 | - (NSColor *)colorForKey:(NSString *)key; 15 | - (void)setColor:(NSColor *)theColor forKey:(NSString *)key; 16 | 17 | @end 18 | 19 | -------------------------------------------------------------------------------- /Source/ColourDefaults.m: -------------------------------------------------------------------------------- 1 | // 2 | // ColourDefaults.mm 3 | // MidiKeys 4 | // 5 | // Created by Chris Reed on Sat Oct 26 2002. 6 | // Copyright (c) 2002 Chris Reed. All rights reserved. 7 | // 8 | 9 | #import "ColourDefaults.h" 10 | 11 | 12 | @implementation NSUserDefaults (ColourDefaults) 13 | 14 | // save color as a string with the components separated by spaces 15 | - (NSColor *)colorForKey:(NSString *)key 16 | { 17 | NSString *colorString = [self stringForKey:key]; 18 | if (!colorString) 19 | return nil; 20 | 21 | NSArray *componentArray = [colorString componentsSeparatedByString:@" "]; 22 | if ([componentArray count] != 4) 23 | return nil; 24 | 25 | id components[4]; 26 | [componentArray getObjects:(id *)&components]; // we know the length is 4 27 | return [NSColor colorWithCalibratedRed:[components[0] floatValue] green:[components[1] floatValue] blue:[components[2] floatValue] alpha:[components[3] floatValue]]; 28 | } 29 | 30 | - (void)setColor:(NSColor *)theColor forKey:(NSString *)key 31 | { 32 | NSString *colorString = [NSString stringWithFormat:@"%g %g %g %g", [theColor redComponent], [theColor greenComponent], [theColor blueComponent], [theColor alphaComponent]]; 33 | [self setObject:colorString forKey:key]; 34 | } 35 | 36 | @end 37 | 38 | -------------------------------------------------------------------------------- /Source/EndpointDefaults.h: -------------------------------------------------------------------------------- 1 | // 2 | // EndpointDefaults.h 3 | // MidiKeys 4 | // 5 | // Created by Chris Reed on Wed Oct 23 2002. 6 | // Copyright (c) 2002 Chris Reed. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @interface NSUserDefaults (EndpointDefaults) 13 | 14 | - (MIDIEndpointRef)endpointForKey:(NSString *)key; 15 | - (void)setEndpoint:(MIDIEndpointRef)endpoint forKey:(NSString *)key; 16 | 17 | @end 18 | 19 | -------------------------------------------------------------------------------- /Source/EndpointDefaults.m: -------------------------------------------------------------------------------- 1 | // 2 | // EndpointDefaults.m 3 | // MidiKeys 4 | // 5 | // Created by Chris Reed on Wed Oct 23 2002. 6 | // Copyright (c) 2002 Chris Reed. All rights reserved. 7 | // 8 | 9 | #import "EndpointDefaults.h" 10 | 11 | 12 | @implementation NSUserDefaults (EndpointDefaults) 13 | 14 | - (MIDIEndpointRef)endpointForKey:(NSString *)key 15 | { 16 | MIDIUniqueID endpointUID = (MIDIUniqueID) [self integerForKey:key]; 17 | if (endpointUID != 0) 18 | { 19 | MIDIObjectType objType; 20 | MIDIObjectRef obj; 21 | OSStatus err = MIDIObjectFindByUniqueID(endpointUID, &obj, &objType); 22 | if (err == noErr && (objType == kMIDIObjectType_Destination 23 | || objType == kMIDIObjectType_ExternalDestination 24 | || objType == kMIDIObjectType_Source 25 | || objType == kMIDIObjectType_ExternalSource)) 26 | { 27 | return (MIDIEndpointRef)obj; 28 | } 29 | } 30 | return 0; 31 | } 32 | 33 | - (void)setEndpoint:(MIDIEndpointRef)endpoint forKey:(NSString *)key 34 | { 35 | MIDIUniqueID endpointUID; 36 | OSStatus err = MIDIObjectGetIntegerProperty(endpoint, kMIDIPropertyUniqueID, &endpointUID); 37 | if (err == noErr) 38 | { 39 | [self setInteger:endpointUID forKey:key]; 40 | } 41 | } 42 | 43 | @end 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /Source/KeyMapManager.h: -------------------------------------------------------------------------------- 1 | // 2 | // KeyMapManager.h 3 | // MidiKeys 4 | // 5 | // Created by Chris Reed on Sat Oct 26 2002. 6 | // Copyright (c) 2002 Chris Reed. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class MidiKeyMap; 12 | 13 | @interface KeyMapManager : NSObject 14 | { 15 | NSDictionary *mPlist; 16 | } 17 | 18 | + sharedInstance; 19 | - init; 20 | 21 | - (NSArray *)allKeyMapNames; 22 | - (NSArray *)allKeyMapLocalisedNames; 23 | - (id)keyMapDefinitionWithName:(NSString *)name; 24 | - (MidiKeyMap *)keyMapWithName:(NSString *)name; 25 | 26 | - (NSString *)localisedNameForKeyMapWithName:(NSString *)name; 27 | - (NSString *)nameForKeyMapWithLocalisedName:(NSString *)localName; 28 | 29 | @end 30 | -------------------------------------------------------------------------------- /Source/KeyMapManager.m: -------------------------------------------------------------------------------- 1 | // 2 | // KeyMapManager.mm 3 | // MidiKeys 4 | // 5 | // Created by Chris Reed on Sat Oct 26 2002. 6 | // Copyright (c) 2002 Chris Reed. All rights reserved. 7 | // 8 | 9 | #import "KeyMapManager.h" 10 | #import "MidiKeyMap.h" 11 | 12 | 13 | @implementation KeyMapManager 14 | 15 | static KeyMapManager *sharedInstance = nil; 16 | 17 | + sharedInstance 18 | { 19 | return sharedInstance ? sharedInstance : [[self alloc] init]; 20 | } 21 | 22 | // always return the shared instance 23 | - init 24 | { 25 | if (sharedInstance) 26 | { 27 | [self release]; 28 | } 29 | else if (self = [super init]) 30 | { 31 | sharedInstance = self; 32 | } 33 | return sharedInstance; 34 | } 35 | 36 | // disallow disposing of the shared instance 37 | - (void)dealloc 38 | { 39 | if (self == sharedInstance) 40 | return; 41 | [mPlist release]; 42 | [super dealloc]; 43 | } 44 | 45 | // read the plist file and find all the keymaps 46 | - (void)awakeFromNib 47 | { 48 | // read the map from the the definition file 49 | NSString *plistPath = [[NSBundle bundleForClass:[self class]] pathForResource:@"KeyMaps" ofType:@"plist"]; 50 | mPlist = [[NSDictionary dictionaryWithContentsOfFile:plistPath] retain]; 51 | if (!mPlist) 52 | { 53 | mPlist = [[NSDictionary dictionary] retain]; 54 | } 55 | } 56 | 57 | // return the names sorted alphabetically 58 | - (NSArray *)allKeyMapNames 59 | { 60 | return [[mPlist allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; 61 | } 62 | 63 | - (NSArray *)allKeyMapLocalisedNames 64 | { 65 | NSArray *names = [self allKeyMapNames]; 66 | id iterator; 67 | NSMutableArray *localisedNames = [NSMutableArray array]; 68 | for (iterator in names) 69 | { 70 | [localisedNames addObject:[self localisedNameForKeyMapWithName:iterator]]; 71 | } 72 | return [localisedNames sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; 73 | } 74 | 75 | - (id)keyMapDefinitionWithName:(NSString *)name 76 | { 77 | if (!name) 78 | return nil; 79 | return [mPlist objectForKey:name]; 80 | } 81 | 82 | - (MidiKeyMap *)keyMapWithName:(NSString *)name 83 | { 84 | if (!name) 85 | return nil; 86 | NSArray *def = [self keyMapDefinitionWithName:name]; 87 | if (!def) 88 | return nil; 89 | return [[[MidiKeyMap alloc] initWithDefinition:def] autorelease]; 90 | } 91 | 92 | - (NSString *)localisedNameForKeyMapWithName:(NSString *)name 93 | { 94 | return NSLocalizedStringFromTable(name, @"KeyMapNames", nil); 95 | } 96 | 97 | - (NSString *)nameForKeyMapWithLocalisedName:(NSString *)localName 98 | { 99 | NSArray *names = [self allKeyMapNames]; 100 | id iterator; 101 | for (iterator in names) 102 | { 103 | if ([localName isEqualToString:[self localisedNameForKeyMapWithName:iterator]]) 104 | return iterator; 105 | } 106 | // not found 107 | return nil; 108 | } 109 | 110 | @end 111 | -------------------------------------------------------------------------------- /Source/MIDI.h: -------------------------------------------------------------------------------- 1 | // 2 | // MIDI.h 3 | // MidiKeys 4 | // 5 | // Created by Chris Reed on 1/1/19. 6 | // 7 | 8 | #ifndef MIDI_h 9 | #define MIDI_h 10 | 11 | #include 12 | 13 | //! MIDI channel message values. 14 | enum _midi_channel_messages : uint8_t { 15 | kMIDIChannelMessageStatusMask = 0xf0, 16 | kMIDINoteOff = 0x80, //!< Data bytes: 0kkkkkkk 0vvvvvvv 17 | kMIDINoteOn = 0x90, //!< Data bytes: 0kkkkkkk 0vvvvvvv 18 | kMIDIPolyphonicPressure = 0xa0, //!< Data bytes: 0kkkkkkk 0vvvvvvv 19 | kMIDIControlChange = 0xb0, //!< Data bytes: 0ccccccc 0vvvvvvv 20 | kMIDIProgramChange = 0xc0, //!< Data bytes: 0ppppppp 21 | kMIDIChannelPressure = 0xd0, //!< Data bytes: 0vvvvvvv 22 | kMIDIPitchBend = 0xe0, //!< Data bytes: 0lllllll 0mmmmmmm 23 | }; 24 | 25 | //! MIDI channel mode message values. 26 | enum _midi_channel_mode_messages : uint8_t { 27 | kMIDIAllSoundOff = 0x78, //!< v=0 28 | kMIDIResetAllControllers = 0x79, //!< v=0 29 | kMIDILocalControl = 0x7a, //!< v=0 (local control off), v=127 (local control on) 30 | kMIDIAllNotesOff = 0x7b, //!< v=0 31 | kMIDIOmniModeOff = 0x7c, //!< v=0 32 | kMIDIOmniModeOn = 0x7d, //!< v=0 33 | kMIDIMonoModeOn = 0x7e, //!< v=M; M=channel count (Omni off) or 0 (Omni on) 34 | kMIDIPolyModeOn = 0x7f, //!< v=0 35 | }; 36 | 37 | //! MIDI system common message values. 38 | enum _midi_system_common_messages : uint8_t { 39 | kMIDISysExStart = 0xf0, 40 | kMIDITimeCodeQuarterFrame = 0xf1, 41 | kMIDISongPositionPointer = 0xf2, 42 | kMIDISongSelect = 0xf3, 43 | kMIDISystemCommonUndefined1 = 0xf4, 44 | kMIDISystemCommonUndefined2 = 0xf5, 45 | kMIDITuneRequest = 0xf6, 46 | kMIDISysExEnd = 0xf7, 47 | }; 48 | 49 | //! MIDI system real time message values. 50 | enum _midi_system_real_time_messages : uint8_t { 51 | kMIDIRealTimeClock = 0xf8, 52 | kMIDIRealTimeStart = 0xfa, 53 | kMIDIRealTimeContinue = 0xfb, 54 | kMIDIRealTimeStop = 0xfc, 55 | kMIDIRealTimeActiveSensing = 0xfe, 56 | kMIDIRealTimeSystemReset = 0xff, 57 | kMIDIFirstRealTimeMessage = kMIDIRealTimeClock, 58 | }; 59 | 60 | #endif /* MIDI_h */ 61 | -------------------------------------------------------------------------------- /Source/MidiKeyMap.h: -------------------------------------------------------------------------------- 1 | // 2 | // MidiKeyMap.h 3 | // MidiKeys 4 | // 5 | // Created by Chris Reed on Sat Oct 26 2002. 6 | // Copyright (c) 2002 Chris Reed. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Maximum number of key codes. 12 | #define MAX_KEY_CODES (256) 13 | 14 | //! Maximum number of MIDI notes. 15 | #define MAX_MIDI_NOTES (128) 16 | 17 | /*! 18 | * @brief Maps key codes to MIDI notes. 19 | */ 20 | @interface MidiKeyMap : NSObject 21 | { 22 | id mDefinition; 23 | NSArray *mRanges; 24 | int mKeyCodeToNoteMap[MAX_KEY_CODES]; 25 | int mNoteToKeyCodeMap[MAX_MIDI_NOTES]; 26 | BOOL mHotKeysAreRegistered; 27 | NSMutableDictionary *mRegisteredHotKeys; 28 | } 29 | 30 | // Definition is currently an array of range dictionaries 31 | - initWithDefinition:(id)def; 32 | 33 | //! Returns -1 if the key was not found 34 | - (int)midiNoteForKeyCode:(int)keycode; 35 | - (int)midiNoteForHotKeyWithIdentifier:(uintptr_t)identifier; 36 | 37 | //! @brief Returns the key code for a MIDI note. 38 | - (int)keyCodeForMidiNote:(int)note; 39 | 40 | //! @brief Returns the Unicode character for a MIDI note value. 41 | - (NSString *)characterForMidiNote:(int)midiNote; 42 | 43 | //! @brief Registers all keys handled by the key map as system hot keys. 44 | - (void)registerHotKeysWithModifiers:(int)modifiers; 45 | - (void)unregisterHotKeys; 46 | 47 | @end 48 | -------------------------------------------------------------------------------- /Source/MidiKeyMap.m: -------------------------------------------------------------------------------- 1 | // 2 | // MidiKeyMap.mm 3 | // MidiKeys 4 | // 5 | // Created by Chris Reed on Sat Oct 26 2002. 6 | // Copyright (c) 2002 Chris Reed. All rights reserved. 7 | // 8 | 9 | #import "MidiKeyMap.h" 10 | #import 11 | 12 | @interface MidiKeyMap (InternalMethods) 13 | 14 | - (void)constructMaps; 15 | 16 | @end 17 | 18 | @implementation MidiKeyMap 19 | 20 | - initWithDefinition:(id)def 21 | { 22 | self = [super init]; 23 | if (self) 24 | { 25 | mDefinition = [def retain]; 26 | mRanges = [[mDefinition objectForKey:@"Ranges"] retain]; 27 | [self constructMaps]; 28 | } 29 | return self; 30 | } 31 | 32 | - (void)dealloc 33 | { 34 | // can't leave hotkeys sitting around without a way to remove them 35 | if (mHotKeysAreRegistered) 36 | { 37 | [self unregisterHotKeys]; 38 | } 39 | 40 | [mRegisteredHotKeys release]; 41 | [mRanges release]; 42 | [mDefinition release]; 43 | [super dealloc]; 44 | } 45 | 46 | - (void)constructMaps 47 | { 48 | for (int i=0; i < MAX_KEY_CODES; ++i) 49 | { 50 | mKeyCodeToNoteMap[i] = -1; 51 | } 52 | 53 | for (int i=0; i < MAX_MIDI_NOTES; ++i) 54 | { 55 | mNoteToKeyCodeMap[i] = -1; 56 | } 57 | 58 | id range; 59 | for (range in mRanges) 60 | { 61 | @try 62 | { 63 | NSArray *rangeKeys = [range objectForKey:@"KeyCodes"]; 64 | int rangeStartNote = [[range objectForKey:@"FirstMidiNote"] intValue]; 65 | uint32_t numKeyCodes = (uint32_t)[rangeKeys count]; 66 | for (uint32_t i=0; i < numKeyCodes; ++i) 67 | { 68 | id thisKey = [rangeKeys objectAtIndex:i]; 69 | int keycode = [thisKey intValue]; 70 | int note = rangeStartNote + i; 71 | mKeyCodeToNoteMap[keycode] = note; 72 | mNoteToKeyCodeMap[note] = keycode; 73 | } 74 | } 75 | @catch (NSException * e) 76 | { 77 | // a key was missing from the range dictionary (or something) 78 | NSLog(@"invalid range definition"); 79 | // move on to the next range 80 | // @todo remove the offending range from the key map 81 | } 82 | } 83 | } 84 | 85 | //! @return The MIDI note number that corresponds to the given key code. 86 | //! @retval -1 There is no mapping for the given key code. 87 | - (int)midiNoteForKeyCode:(int)keycode 88 | { 89 | if (keycode < 0 || keycode >= MAX_KEY_CODES) 90 | { 91 | return -1; 92 | } 93 | else 94 | { 95 | return mKeyCodeToNoteMap[keycode]; 96 | } 97 | } 98 | 99 | // look up the hot key in our dictionary 100 | - (int)midiNoteForHotKeyWithIdentifier:(uintptr_t)identifier 101 | { 102 | // return -1 if there are no hotkeys installed 103 | if (!mHotKeysAreRegistered || [mRegisteredHotKeys count]==0) 104 | return -1; 105 | 106 | int note = [[mRegisteredHotKeys objectForKey:[NSValue valueWithPointer:(void *)identifier]] intValue]; 107 | return note; 108 | } 109 | 110 | - (int)keyCodeForMidiNote:(int)note 111 | { 112 | if (note < 0 || note >= MAX_MIDI_NOTES) 113 | { 114 | return -1; 115 | } 116 | else 117 | { 118 | return mNoteToKeyCodeMap[note]; 119 | } 120 | } 121 | 122 | //! @return An NSString containing the character value. Will be an empty string if 123 | //! the key map doesn't have an entry for the given note value. 124 | - (NSString *)characterForMidiNote:(int)midiNote 125 | { 126 | int keyCode = [self keyCodeForMidiNote:midiNote]; 127 | 128 | NSString *result = nil; 129 | TISInputSourceRef t = TISCopyCurrentKeyboardLayoutInputSource(); 130 | if (t) 131 | { 132 | void* v = TISGetInputSourceProperty(t, kTISPropertyUnicodeKeyLayoutData); 133 | 134 | if (v) 135 | { 136 | CFDataRef d = (CFDataRef)v; 137 | 138 | UCKeyboardLayout *uchrData = (UCKeyboardLayout*) CFDataGetBytePtr(d); 139 | 140 | // Get Unicode characters for this keycode. 141 | UInt32 deadKeyState = 0; 142 | UniChar keyChars[16] = {0}; 143 | UniCharCount keyCharsCount = 0; 144 | OSStatus status = UCKeyTranslate(uchrData, keyCode, kUCKeyActionDisplay, 0, LMGetKbdType(), kUCKeyTranslateNoDeadKeysMask, &deadKeyState, sizeof(keyChars), &keyCharsCount, keyChars); 145 | if (status) 146 | { 147 | return nil; 148 | } 149 | 150 | // Substitute some control key chars. 151 | switch (keyChars[0]) 152 | { 153 | case 0x08: // backspace 154 | keyChars[0] = 0x232b; 155 | break; 156 | case 0x09: // tab 157 | keyChars[0] = 0x21e5; 158 | break; 159 | case 0x0d: // return 160 | keyChars[0] = 0x21a9; 161 | break; 162 | } 163 | 164 | // Return NSString with the Unicode characters. 165 | result = [NSString stringWithCharacters:(const unichar *)&keyChars length:keyCharsCount]; 166 | } 167 | 168 | CFRelease(t); 169 | } 170 | return result; 171 | } 172 | 173 | - (void)registerHotKeysWithModifiers:(int)modifiers; 174 | { 175 | // must have a modifier set to install hotkeys 176 | if (modifiers == 0) 177 | { 178 | return; 179 | } 180 | 181 | OSStatus err; 182 | EventHotKeyID hotKeyID = { 0, 0 }; 183 | EventHotKeyRef hotKeyRef; 184 | 185 | [mRegisteredHotKeys release]; 186 | mRegisteredHotKeys = [[NSMutableDictionary dictionary] retain]; 187 | 188 | id range; 189 | for (range in mRanges) 190 | { 191 | @try 192 | { 193 | NSArray *rangeKeys = [range objectForKey:@"KeyCodes"]; 194 | int rangeStartNote = [[range objectForKey:@"FirstMidiNote"] intValue]; 195 | NSUInteger numKeyCodes = [rangeKeys count]; 196 | for (NSUInteger i=0; i < numKeyCodes; ++i) 197 | { 198 | id thisKey = [rangeKeys objectAtIndex:i]; 199 | int midiNote = rangeStartNote + (int) i; 200 | err = RegisterEventHotKey([thisKey intValue], modifiers, hotKeyID, GetApplicationEventTarget(), 0, &hotKeyRef); 201 | if (err) 202 | { 203 | NSLog(@"error %ld installing hotkey (keycode = %ld)", (long) err, (long) [thisKey intValue]); 204 | continue; 205 | } 206 | mHotKeysAreRegistered = YES; 207 | 208 | // save the hotKeyRef as the key in a dictionary, with its keycode as the value 209 | [mRegisteredHotKeys setObject:[NSNumber numberWithInt:midiNote] forKey:[NSValue valueWithPointer:hotKeyRef]]; 210 | } 211 | } 212 | @catch (NSException * e) 213 | { 214 | // a key was missing from the range dictionary (or something) 215 | NSLog(@"invalid range definition"); 216 | // move on to the next range 217 | // XXX remove the offending range from the key map 218 | } 219 | } 220 | } 221 | 222 | - (void)unregisterHotKeys 223 | { 224 | if (!mHotKeysAreRegistered || [mRegisteredHotKeys count]==0) 225 | { 226 | return; 227 | } 228 | 229 | id iterator; 230 | for (iterator in mRegisteredHotKeys) 231 | { 232 | EventHotKeyRef hotKeyRef = (EventHotKeyRef)[iterator pointerValue]; 233 | OSStatus err = UnregisterEventHotKey(hotKeyRef); 234 | if (err) 235 | { 236 | NSLog(@"err %ld unregistering hot key %p", (long) err, hotKeyRef); 237 | } 238 | } 239 | 240 | // clear hot keys dictionary 241 | [mRegisteredHotKeys removeAllObjects]; 242 | 243 | mHotKeysAreRegistered = NO; 244 | } 245 | 246 | @end 247 | 248 | -------------------------------------------------------------------------------- /Source/MidiKeyView.h: -------------------------------------------------------------------------------- 1 | // 2 | // MidiKeyView.h 3 | // MidiKeys 4 | // 5 | // Created by Chris Reed on Tue Oct 15 2002. 6 | // Copyright (c) 2002 Chris Reed. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @protocol MidiKeyViewDelegate; 12 | 13 | /*! 14 | * @brief View class that displays a musical keyboard. 15 | */ 16 | @interface MidiKeyView : NSView 17 | 18 | @property (assign, nullable, weak) id delegate; 19 | 20 | @property (retain, nonnull) NSColor * highlightColour; 21 | @property int octaveOffset; 22 | @property BOOL showKeycaps; 23 | @property BOOL showCNotes; 24 | 25 | - (double)maxKeyboardWidthForSize:(NSSize)proposedSize; 26 | 27 | - (void)turnMidiNoteOn:(int)note; 28 | - (void)turnMidiNoteOff:(int)note; 29 | - (void)turnAllNotesOff; 30 | 31 | @end 32 | 33 | @protocol MidiKeyViewDelegate 34 | 35 | - (void)processMidiKeyWithCode:(int)keycode turningOn:(BOOL)isTurningOn; 36 | - (void)processMidiKeyClickWithNote:(int)note turningOn:(BOOL)isTurningOn; 37 | - (void)processMidiChannelAftertouch:(int)pressure; 38 | 39 | - (NSString * _Nonnull)characterForMidiNote:(int)note; 40 | 41 | @end 42 | 43 | 44 | -------------------------------------------------------------------------------- /Source/MidiKeysApplication.h: -------------------------------------------------------------------------------- 1 | // 2 | // MidiKeysApplication.h 3 | // MidiKeys 4 | // 5 | // Created by Chris Reed on Sun Oct 27 2002. 6 | // Copyright (c) 2002 Chris Reed. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | 12 | @interface MidiKeysApplication : NSApplication 13 | 14 | @end 15 | 16 | @interface NSObject (HotKeysDelegateMethods) 17 | 18 | - (void)hotKeyPressed:(UInt32)identifier; 19 | - (void)hotKeyReleased:(UInt32)identifier; 20 | 21 | @end 22 | 23 | -------------------------------------------------------------------------------- /Source/MidiKeysApplication.m: -------------------------------------------------------------------------------- 1 | // 2 | // MidiKeysApplication.m 3 | // MidiKeys 4 | // 5 | // Created by Chris Reed on Sun Oct 27 2002. 6 | // Copyright (c) 2002 Chris Reed. All rights reserved. 7 | // 8 | 9 | #import "MidiKeysApplication.h" 10 | #import "AppController.h" 11 | 12 | 13 | enum { 14 | // NSEvent subtypes for hotkey events (undocumented). 15 | kEventHotKeyPressedSubtype = 6, 16 | kEventHotKeyReleasedSubtype = 9 17 | }; 18 | 19 | static struct { 20 | BOOL valid; 21 | BOOL pressed; 22 | BOOL released; 23 | } cachedDelegateHandles = { NO, NO, NO }; 24 | 25 | @implementation MidiKeysApplication 26 | 27 | - (void)sendEvent:(NSEvent *)theEvent 28 | { 29 | if ([theEvent type] == NSEventTypeSystemDefined) 30 | { 31 | // cache the results of these -respondsToSelector: messages so 32 | // we handle hot keys as fast as possible (even though it's only 33 | // a few method calls, it does affect the note on latency) 34 | if (!cachedDelegateHandles.valid) 35 | { 36 | if ([self delegate]) 37 | { 38 | cachedDelegateHandles.pressed = [[self delegate] respondsToSelector:@selector(hotKeyPressed:)]; 39 | cachedDelegateHandles.released = [[self delegate] respondsToSelector:@selector(hotKeyReleased:)]; 40 | } 41 | else 42 | { 43 | cachedDelegateHandles.pressed = NO; 44 | cachedDelegateHandles.released = NO; 45 | } 46 | cachedDelegateHandles.valid = YES; 47 | } 48 | // pass the hot key event on to the delegate. 49 | switch ([theEvent subtype]) 50 | { 51 | case kEventHotKeyPressedSubtype: 52 | { 53 | if (cachedDelegateHandles.pressed) 54 | { 55 | AppController * c = (AppController *)[self delegate]; 56 | [c hotKeyPressed: (uintptr_t) [theEvent data1]]; 57 | } 58 | break; 59 | } 60 | case kEventHotKeyReleasedSubtype: 61 | { 62 | if (cachedDelegateHandles.released) 63 | { 64 | AppController *c = (AppController *)[self delegate]; 65 | [c hotKeyReleased: (uintptr_t) [theEvent data1]]; 66 | } 67 | break; 68 | } 69 | case NSEventSubtypeWindowMoved: 70 | case NSEventSubtypeWindowExposed: 71 | default: 72 | { 73 | // ignore 74 | } 75 | } 76 | } 77 | 78 | [super sendEvent:theEvent]; 79 | } 80 | 81 | // invalidate the cache 82 | - (void)setDelegate:(id)delegate 83 | { 84 | cachedDelegateHandles.valid = NO; 85 | [super setDelegate:delegate]; 86 | } 87 | 88 | @end 89 | 90 | -------------------------------------------------------------------------------- /Source/MidiKeys_Prefix.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import -------------------------------------------------------------------------------- /Source/MidiParser.h: -------------------------------------------------------------------------------- 1 | // 2 | // MidiParser.h 3 | // MidiKeys 4 | // 5 | // Created by Chris Reed on Thu Oct 31 2002. 6 | // Copyright (c) 2002 Chris Reed. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @interface MidiParser : NSObject 13 | { 14 | const MIDIPacketList *_packetList; 15 | MIDIPacket *_packet; 16 | int _packetCount; 17 | int _byteNum; 18 | int _dataBytesRequired; 19 | MIDIPacket _resultPacket; 20 | MIDIPacket _realtimePacket; 21 | } 22 | 23 | + parserWithMidiPacketList:(const MIDIPacketList *)packetList; 24 | - initWithMidiPacketList:(const MIDIPacketList *)packetList; 25 | 26 | // Returns a pointer to the next complete packet, or NULL. 27 | - (MIDIPacket *)nextMidiPacket; 28 | 29 | @end 30 | -------------------------------------------------------------------------------- /Source/MidiParser.m: -------------------------------------------------------------------------------- 1 | // 2 | // MidiParser.m 3 | // MidiKeys 4 | // 5 | // Created by Chris Reed on Thu Oct 31 2002. 6 | // Copyright (c) 2002 Chris Reed. All rights reserved. 7 | // 8 | 9 | #import "MidiParser.h" 10 | #import "MIDI.h" 11 | 12 | #define kInSysEx -1 13 | 14 | @interface MidiParser (PrivateMethods) 15 | 16 | - (MIDIPacket *)processByte:(Byte)theByte; 17 | 18 | @end 19 | 20 | @implementation MidiParser 21 | 22 | + parserWithMidiPacketList:(const MIDIPacketList *)packetList 23 | { 24 | return [[[self alloc] initWithMidiPacketList:packetList] autorelease]; 25 | } 26 | 27 | // Designated initialiser. 28 | - initWithMidiPacketList:(const MIDIPacketList *)packetList 29 | { 30 | self = [super init]; 31 | if (self) 32 | { 33 | _packetList = packetList; 34 | _packetCount = _packetList->numPackets; 35 | _packet = (MIDIPacket *)_packetList->packet; // remove const (!) 36 | _byteNum = 0; 37 | } 38 | return self; 39 | } 40 | 41 | // Figure out what to do with a single byte. If the byte completes a packet, then the 42 | // packet description is filled in and a pointer to it is returned. Otherwise, this 43 | // method quietly processes the byte and returns NULL. 44 | - (MIDIPacket *)processByte:(Byte)theByte 45 | { 46 | if (theByte & 0x80) 47 | { 48 | // status byte 49 | if (theByte >= kMIDIFirstRealTimeMessage) 50 | { 51 | // realtime message 52 | switch (theByte) 53 | { 54 | case kMIDIRealTimeClock: // clock 55 | case kMIDIRealTimeStart: // start 56 | case kMIDIRealTimeContinue: // continue 57 | case kMIDIRealTimeStop: // stop 58 | case kMIDIRealTimeSystemReset: // system reset 59 | // fill in the realtime packet and return it 60 | _realtimePacket.timeStamp = _packet->timeStamp; 61 | _realtimePacket.length = 1; 62 | _realtimePacket.data[0] = theByte; 63 | ++_byteNum; // start at next byte next time through 64 | return &_realtimePacket; 65 | 66 | case kMIDIRealTimeActiveSensing: // active sensing (ignored) 67 | default: 68 | break; 69 | } 70 | } 71 | else 72 | { 73 | // non realtime message. always begins packet 74 | 75 | // XXX handle status canceling sysex 76 | 77 | // set up resulting packet 78 | _resultPacket.timeStamp = _packet->timeStamp; 79 | _resultPacket.length = 1; 80 | _resultPacket.data[0] = theByte; 81 | 82 | if (theByte < 0xf0) 83 | { 84 | // channel message 85 | uint8_t status = theByte & kMIDIChannelMessageStatusMask; 86 | _dataBytesRequired = (status == kMIDIProgramChange || status == kMIDIChannelPressure) 87 | ? 1 : 2; 88 | } 89 | else 90 | { 91 | // system message 92 | switch (theByte) 93 | { 94 | case kMIDISysExStart: 95 | _dataBytesRequired = kInSysEx; 96 | break; 97 | case kMIDITimeCodeQuarterFrame: // MTC quarter frame 98 | case kMIDISongSelect: // song select 99 | _dataBytesRequired = 1; 100 | break; 101 | case kMIDISongPositionPointer: // song ptr 102 | _dataBytesRequired = 2; 103 | break; 104 | case kMIDITuneRequest: // tune request 105 | _dataBytesRequired = 0; 106 | ++_byteNum; 107 | return &_resultPacket; 108 | case kMIDISystemCommonUndefined1: // undefined 109 | case kMIDISystemCommonUndefined2: // undefined 110 | case kMIDISysExEnd: // EOX handled above 111 | _dataBytesRequired = 0; 112 | break; 113 | } 114 | } 115 | } 116 | } 117 | else 118 | { 119 | // data byte 120 | if (_dataBytesRequired > 0) 121 | { 122 | _resultPacket.data[_resultPacket.length++] = theByte; 123 | if (--_dataBytesRequired == 0) 124 | { 125 | ++_byteNum; // start at next byte the next time through 126 | return &_resultPacket; 127 | } 128 | } 129 | else if (_dataBytesRequired == kInSysEx) 130 | { 131 | // XXX handle sysex 132 | } 133 | } 134 | return NULL; 135 | } 136 | 137 | // This method fills in our standalone packet while parsing the packet list we were initialised 138 | // with. The spec for MIDIPackets as defined in the MIDIServices.h header says that a packet 139 | // may contain more than one event, but it will always contain whole events. Unless it's sysex, 140 | // which may be split across packets. 141 | - (MIDIPacket *)nextMidiPacket 142 | { 143 | // have we parsed all the packets? 144 | if (_packetCount <= 0) 145 | return NULL; 146 | 147 | // check byte num. this the normal way we advance to the next packet in the list. 148 | if (_packet && _byteNum >= _packet->length) 149 | { 150 | _packet = (--_packetCount > 0) ? MIDIPacketNext(_packet) : NULL; 151 | _byteNum = 0; 152 | } 153 | 154 | // bail if there's still not a packet 155 | if (!_packet) 156 | return NULL; 157 | 158 | // process bytes in this packet 159 | do { 160 | _dataBytesRequired = 0; 161 | for (; _byteNum < _packet->length; ++_byteNum) 162 | { 163 | MIDIPacket *result = [self processByte:_packet->data[_byteNum]]; 164 | if (result != NULL) 165 | return result; 166 | } 167 | 168 | // we have exited the loop (process all bytes in the packet) without sending 169 | // a packet out. so advance to the next packet and try again. 170 | _packet = (--_packetCount > 0) ? MIDIPacketNext(_packet) : NULL; 171 | _byteNum = 0; 172 | } while (_packet); 173 | 174 | // there is no next packet 175 | return NULL; 176 | } 177 | 178 | @end 179 | 180 | -------------------------------------------------------------------------------- /Source/OverlayIndicator.h: -------------------------------------------------------------------------------- 1 | // 2 | // OverlayIndicator.h 3 | // MidiKeys 4 | // 5 | // Created by Chris Reed on Tue Jun 17 2003. 6 | // Copyright (c) 2003 Chris Reed. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Margin around the image. 12 | #define kOverlayIndicatorMargin 40.0f 13 | 14 | /*! 15 | * @brief Manages an indicator popup window. 16 | * 17 | * This class manages a one-shot overlay window that displays an arbitrary 18 | * image. It is very similar to the overlay that appears when you adjust 19 | * volume or contrast from the keyboard. 20 | */ 21 | @interface OverlayIndicator : NSObject 22 | { 23 | NSView * _contentView; 24 | NSWindow *_overlayWindow; 25 | NSTimer *_timer; 26 | id _delegate; 27 | NSString * _message; 28 | } 29 | 30 | //! @brief Designated initializer. 31 | - initWithView:(NSView *)theView; 32 | 33 | //! @brief Create an overlay showing an image. 34 | - initWithImage:(NSImage *)theImage; 35 | 36 | - (void)setDelegate:(id)theDelegate; 37 | - (id)delegate; 38 | 39 | - (NSString *)message; 40 | - (void)setMessage:(NSString *)theMessage; 41 | 42 | - (void)showUntilDate:(NSDate *)hideDate; 43 | - (void)close; 44 | 45 | @end 46 | 47 | @interface NSObject (OverlayIndicatorDelegate) 48 | 49 | - (void)overlayIndicatorDidClose:(OverlayIndicator *)theIndicator; 50 | 51 | @end 52 | -------------------------------------------------------------------------------- /Source/OverlayIndicator.m: -------------------------------------------------------------------------------- 1 | // 2 | // OverlayIndicator.m 3 | // MidiKeys 4 | // 5 | // Created by Chris Reed on Tue Jun 17 2003. 6 | // Copyright (c) 2003 Chris Reed. All rights reserved. 7 | // 8 | 9 | #import "OverlayIndicator.h" 10 | #import 11 | #import 12 | 13 | //! Font size of the overlay message. 14 | #define OVERLAY_MESSAGE_FONT_SIZE 32.0 15 | 16 | // Internal methods. 17 | @interface OverlayIndicator () 18 | 19 | - (void)buildOverlayWindow; 20 | - (void)hideOverlay:(NSTimer *)theTimer; 21 | 22 | @end 23 | 24 | @interface OverlayBackgroundView : NSView 25 | 26 | @end 27 | 28 | @implementation OverlayIndicator 29 | 30 | - initWithView:(NSView *)theView 31 | { 32 | self = [super init]; 33 | if (self) 34 | { 35 | _contentView = [theView retain]; 36 | } 37 | 38 | return self; 39 | } 40 | 41 | - initWithImage:(NSImage *)theImage 42 | { 43 | NSRect viewFrame; 44 | viewFrame.origin.x = 0.0f; 45 | viewFrame.origin.y = 0.0f; 46 | viewFrame.size = [theImage size]; 47 | 48 | // Create an image view to hold the given image. 49 | NSImageView *imageView = [[[NSImageView alloc] initWithFrame:viewFrame] autorelease]; 50 | [imageView setImage:theImage]; 51 | [imageView setImageAlignment:NSImageAlignCenter]; 52 | [imageView setImageFrameStyle:NSImageFrameNone]; 53 | [imageView setEditable:NO]; 54 | [imageView setWantsLayer:YES]; 55 | 56 | // Apply a shadow to the image. 57 | NSShadow * shadow = [[[NSShadow alloc] init] autorelease]; 58 | [shadow setShadowColor:[NSColor colorWithCalibratedWhite:0.0 alpha:0.85]]; 59 | [shadow setShadowOffset:NSMakeSize(1.0, -1.0)]; 60 | [shadow setShadowBlurRadius:2.0]; 61 | [imageView setShadow:shadow]; 62 | 63 | return [self initWithView:imageView]; 64 | } 65 | 66 | - (void)dealloc 67 | { 68 | [self close]; 69 | [_overlayWindow release]; 70 | [_contentView release]; 71 | 72 | [super dealloc]; 73 | } 74 | 75 | - (void)setDelegate:(id)theDelegate 76 | { 77 | _delegate = theDelegate; 78 | } 79 | 80 | - (id)delegate 81 | { 82 | return _delegate; 83 | } 84 | 85 | - (NSString *)message 86 | { 87 | return _message; 88 | } 89 | 90 | - (void)setMessage:(NSString *)theMessage 91 | { 92 | [_message autorelease]; 93 | _message = [theMessage copy]; 94 | } 95 | 96 | - (void)buildOverlayWindow 97 | { 98 | NSTextField * messageView = nil; 99 | NSSize messageSize= {0}; 100 | if (_message) 101 | { 102 | NSShadow * shadow = [[[NSShadow alloc] init] autorelease]; 103 | [shadow setShadowOffset:NSMakeSize(2.0, -2.0)]; 104 | [shadow setShadowBlurRadius:1.0]; 105 | 106 | // Build the attributes dictionary. 107 | NSDictionary * attrs = [NSDictionary dictionaryWithObjectsAndKeys: 108 | [NSFont boldSystemFontOfSize:OVERLAY_MESSAGE_FONT_SIZE], NSFontAttributeName, 109 | shadow, NSShadowAttributeName, 110 | [NSColor whiteColor], NSForegroundColorAttributeName, 111 | [NSColor blackColor], NSStrokeColorAttributeName, 112 | [NSNumber numberWithFloat:-1.0], NSStrokeWidthAttributeName, 113 | // [NSNumber numberWithFloat:0.12], NSExpansionAttributeName, 114 | nil, nil]; 115 | 116 | NSAttributedString * attributedMessage = [[[NSAttributedString alloc] initWithString:_message attributes:attrs] autorelease]; 117 | 118 | // Compute the bounding rect of the message. 119 | NSRect messageFrame; 120 | messageSize = [attributedMessage size]; 121 | messageFrame.size = messageSize; 122 | messageFrame.size.width += 5; 123 | messageFrame.origin.x = 0; 124 | messageFrame.origin.y = 0; 125 | 126 | messageView = [[[NSTextField alloc] initWithFrame:messageFrame] autorelease]; 127 | [messageView setAttributedStringValue:attributedMessage]; 128 | [messageView setBordered:NO]; 129 | [messageView setBezeled:NO]; 130 | [messageView setEditable:NO]; 131 | [messageView setSelectable:NO]; 132 | [messageView setDrawsBackground:NO]; 133 | } 134 | 135 | // Calculate window rect. 136 | NSScreen *mainScreen = [NSScreen mainScreen]; 137 | NSRect screenFrame = [mainScreen visibleFrame]; 138 | NSRect viewFrame = [_contentView frame]; 139 | 140 | float width = NSWidth(viewFrame) + kOverlayIndicatorMargin * 2.0f; 141 | float height = NSHeight(viewFrame) + kOverlayIndicatorMargin * 2.0f; 142 | 143 | if (messageView) 144 | { 145 | if (width < messageSize.width + kOverlayIndicatorMargin * 2.0f) 146 | { 147 | width = messageSize.width + kOverlayIndicatorMargin * 2.0f; 148 | } 149 | 150 | height += messageSize.height + kOverlayIndicatorMargin / 2.0; 151 | } 152 | 153 | NSRect contentRect = NSMakeRect((NSWidth(screenFrame) - width) / 2.0f, (NSHeight(screenFrame) - height) / 2.0f, width, height); 154 | 155 | // create overlay window 156 | _overlayWindow = [[NSWindow alloc] initWithContentRect:contentRect styleMask:NSWindowStyleMaskBorderless backing:NSBackingStoreBuffered defer:YES screen:mainScreen]; 157 | [_overlayWindow setOpaque:NO]; 158 | [_overlayWindow setHasShadow:NO]; 159 | // [_overlayWindow setAlphaValue:0.75f]; 160 | [_overlayWindow setLevel:NSStatusWindowLevel]; 161 | [_overlayWindow setIgnoresMouseEvents:YES]; 162 | [_overlayWindow setBackgroundColor:[NSColor clearColor]]; 163 | 164 | // add background view to window 165 | NSRect backFrame = NSMakeRect(0.0f, 0.0f, width, height); 166 | OverlayBackgroundView *backView = [[[OverlayBackgroundView alloc] initWithFrame:backFrame] autorelease]; 167 | [backView setWantsLayer:YES]; 168 | [_overlayWindow setContentView: backView]; 169 | 170 | // Add subviews to background view and reposition it. 171 | [backView addSubview:_contentView]; 172 | 173 | NSPoint newOrigin; 174 | newOrigin.x = (width - NSWidth(viewFrame)) / 2.0; 175 | newOrigin.y = height - NSHeight(viewFrame) - kOverlayIndicatorMargin; 176 | [_contentView setFrameOrigin:newOrigin]; 177 | 178 | if (messageView) 179 | { 180 | [backView addSubview:messageView]; 181 | 182 | newOrigin.x = (width - messageSize.width) / 2.0; 183 | newOrigin.y = kOverlayIndicatorMargin / 2.0; 184 | [messageView setFrameOrigin:newOrigin]; 185 | } 186 | } 187 | 188 | - (void)showUntilDate:(NSDate *)hideDate 189 | { 190 | [self buildOverlayWindow]; 191 | [_overlayWindow makeKeyAndOrderFront:nil]; 192 | 193 | // schedule timer 194 | _timer = [NSTimer scheduledTimerWithTimeInterval:[hideDate timeIntervalSinceNow] target:self selector:@selector(hideOverlay:) userInfo:nil repeats:NO]; 195 | } 196 | 197 | - (void)hideOverlay:(NSTimer *)theTimer 198 | { 199 | // Fade window out 200 | CALayer * theLayer = [[_overlayWindow contentView] layer]; 201 | 202 | // Create an explicit transaction to animate the opacity change. 203 | [CATransaction begin]; 204 | [CATransaction setValue:@0.5f forKey:kCATransactionAnimationDuration]; 205 | theLayer.opacity=0.0; 206 | [CATransaction commit]; 207 | 208 | _timer = nil; 209 | 210 | // inform delegate 211 | if (_delegate && [_delegate respondsToSelector:@selector(overlayIndicatorDidClose:)]) 212 | { 213 | [_delegate overlayIndicatorDidClose:self]; 214 | } 215 | } 216 | 217 | - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag 218 | { 219 | // NSLog(@"anim did stop: %@ flag:%d", anim, (int)flag); 220 | [_overlayWindow close]; 221 | // [self close]; 222 | } 223 | 224 | - (void)close 225 | { 226 | if (_timer) 227 | { 228 | [_timer invalidate]; 229 | _timer = nil; 230 | } 231 | 232 | [[[_overlayWindow contentView] layer] removeAllAnimations]; 233 | [_overlayWindow close]; 234 | 235 | // inform delegate 236 | if (_delegate && [_delegate respondsToSelector:@selector(overlayIndicatorDidClose:)]) 237 | { 238 | [_delegate overlayIndicatorDidClose:self]; 239 | } 240 | } 241 | 242 | @end 243 | 244 | // These values produce a background that exactly matches Apple's bezel overlays. 245 | #define OVERLAY_BACKGROUND_GRAYSCALE 0.2f 246 | #define OVERLAY_BACKGROUND_RADIUS 20.0f 247 | #define OVERLAY_BACKGROUND_ALPHA 0.2f 248 | 249 | @implementation OverlayBackgroundView 250 | 251 | - (BOOL)isOpaque 252 | { 253 | return NO; 254 | } 255 | 256 | - (void)drawRect:(NSRect)rect 257 | { 258 | [[NSColor colorWithCalibratedWhite:OVERLAY_BACKGROUND_GRAYSCALE alpha:OVERLAY_BACKGROUND_ALPHA] set]; 259 | [[NSBezierPath bezierPathWithRoundedRect:[self bounds] xRadius:OVERLAY_BACKGROUND_RADIUS yRadius:OVERLAY_BACKGROUND_RADIUS] fill]; 260 | } 261 | 262 | @end 263 | 264 | -------------------------------------------------------------------------------- /Source/Preferences.h: -------------------------------------------------------------------------------- 1 | // 2 | // Preferences.h 3 | // MidiKeys 4 | // 5 | // Created by Chris Reed on Thu Jan 09 2003. 6 | // Copyright (c) 2002-2003 Chris Reed. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! @name Preference Keys 12 | //@{ 13 | 14 | // Preferences without direct user control 15 | #define kVelocityPrefKey @"Velocity" 16 | #define kChannelPrefKey @"Channel" 17 | #define kOctaveOffsetPrefKey @"OctaveOffset" 18 | #define kDestinationPrefKey @"DestinationUID" 19 | #define kSourcePrefKey @"SourceUID" 20 | #define kIsWindowToggledPrefKey @"IsWindowToggled" 21 | #define kMidiThruPrefKey @"MidiThru" 22 | #define kOverlayTimeoutPrefKey @"OverlayTimeout" 23 | 24 | // Preferences set in the Preferences panel 25 | #define kKeyMapPrefKey @"KeyMap" 26 | #define kHighlightColourPrefKey @"HighlightColour" 27 | #define kUseHotKeysPrefKey @"UseHotKeys" 28 | #define kFloatWindowPrefKey @"Floating" 29 | #define kWindowTransparencyPrefKey @"WindowTransparency" 30 | #define kHotKeysModifiersPrefKey @"HotKeysModifiers" 31 | #define kSolidOnTopPrefKey @"SolidOnTop" 32 | #define kClickThroughPrefKey @"ClickThrough" 33 | #define SHOW_HOT_KEYS_OVERLAYS_PREF_KEY @"ShowHotKeysTogglingOverlays" 34 | #define SHOW_OCTAVE_SHIFT_OVERLAYS_PREF_KEY @"ShowOctaveShiftOverlays" 35 | #define SHOW_VELOCITY_OVERLAYS_PREF_KEY @"ShowVelocityOverlays" 36 | #define kShowKeyCapsPrefKey @"ShowKeyCaps" 37 | #define kShowCNotesPrefKey @"ShowCNotes" 38 | #define kForceLightKeyboardPrefKey @"ForceLightKeys" 39 | 40 | #define kToggleHotKeysShortcutPrefKey @"ToggleHotKeysShortcut" 41 | 42 | // Dictionary keys for shortcut preferences. 43 | #define SHORTCUT_FLAGS_KEY @"flags" 44 | #define SHORTCUT_KEYCODE_KEY @"keycode" 45 | 46 | // Hidden preferences 47 | #define kVelocityRepeatIntervalPrefKey @"VelocityRepeatInterval" 48 | #define kVelocityHotKeyDeltaPrefKey @"VelocityHotKeyDelta" 49 | 50 | //@} 51 | 52 | //! @name Preference Defaults 53 | //@{ 54 | 55 | // Default values for preferences 56 | #define kDefaultHighlightRed 0.0 57 | #define kDefaultHighlightGreen 1.0 58 | #define kDefaultHighlightBlue 0.0 59 | 60 | #define kDefaultHighlightTransparency 0.75 61 | #define kDefaultWindowTransparency 1.0 62 | 63 | #define kDefaultHotKeysModifiers 0 64 | 65 | #define kDefaultVelocityRepeatInterval 0.25 66 | #define kDefaultVelocityHotKeyDelta 10.0 67 | 68 | //@} 69 | 70 | -------------------------------------------------------------------------------- /Source/PreferencesController.h: -------------------------------------------------------------------------------- 1 | // 2 | // PreferencesController.h 3 | // MidiKeys 4 | // 5 | // Created by Chris Reed on Sat Oct 26 2002. 6 | // Copyright (c) 2002 Chris Reed. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "Preferences.h" 11 | #import 12 | 13 | /*! 14 | * @brief Manages the preferences panel. 15 | */ 16 | @interface PreferencesController : NSWindowController 17 | { 18 | IBOutlet NSWindow * _prefsWindow; 19 | IBOutlet NSPopUpButton *keymapPopup; 20 | IBOutlet NSColorWell *highlightColourWell; 21 | IBOutlet NSButton *useHotKeysCheckbox; 22 | IBOutlet NSButton *floatWindowCheckbox; 23 | IBOutlet NSSlider *windowTransparencySlider; 24 | IBOutlet NSButton *controlModifierCheckbox; 25 | IBOutlet NSButton *shiftModifierCheckbox; 26 | IBOutlet NSButton *optionModifierCheckbox; 27 | IBOutlet NSButton *commandModifierCheckbox; 28 | IBOutlet NSButton *solidOnTopCheckbox; 29 | IBOutlet NSButton * showKeyCapsCheckbox; 30 | IBOutlet NSButton * _showCNotesCheckbox; 31 | IBOutlet NSButton * _forceLightModeCheckbox; 32 | IBOutlet NSButton * _clickThroughCheckbox; 33 | IBOutlet SRRecorderControl * _toggleHotKeysShortcut; 34 | IBOutlet NSButton * _hotKeysOverlaysCheckbox; 35 | IBOutlet NSButton * _octaveShiftOverlaysCheckbox; 36 | IBOutlet NSButton * _velocityOverlaysCheckbox; 37 | IBOutlet id delegate; //!< Preferences controller delegate. 38 | } 39 | 40 | @property(nonatomic, assign) id delegate; //!< Preferences controller delegate. 41 | 42 | + sharedInstance; 43 | 44 | - init; 45 | 46 | - (void)showPanel:(id)sender; 47 | - (void)updateWindow; 48 | - (BOOL)commitChanges; 49 | 50 | - (IBAction)ok:(id)sender; 51 | - (IBAction)cancel:(id)sender; 52 | 53 | - (IBAction)keyboardFloatsDidChange:(id)sender; 54 | 55 | @end 56 | 57 | @protocol PreferencesControllerDelegate 58 | 59 | - (void)preferencesDidChange:(id)sender; 60 | 61 | @end 62 | 63 | // Notification 64 | extern NSString *kPreferencesChangedNotification; 65 | 66 | -------------------------------------------------------------------------------- /Source/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // MidiKeys 4 | // 5 | // Created by Chris Reed on Tue Oct 15 2002. 6 | // Copyright (c) 2002 Chris Reed. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | int main(int argc, const char *argv[]) 12 | { 13 | return NSApplicationMain(argc, argv); 14 | } 15 | -------------------------------------------------------------------------------- /Sparkle.framework.dSYM/Contents/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleIdentifier 8 | com.apple.xcode.dsym.org.sparkle-project.Sparkle 9 | CFBundleInfoDictionaryVersion 10 | 6.0 11 | CFBundlePackageType 12 | dSYM 13 | CFBundleSignature 14 | ???? 15 | CFBundleShortVersionString 16 | 1.24.0 17 | CFBundleVersion 18 | 1.24.0 19 | 20 | 21 | -------------------------------------------------------------------------------- /Sparkle.framework.dSYM/Contents/Resources/DWARF/Sparkle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework.dSYM/Contents/Resources/DWARF/Sparkle -------------------------------------------------------------------------------- /Sparkle.framework/Headers: -------------------------------------------------------------------------------- 1 | Versions/Current/Headers -------------------------------------------------------------------------------- /Sparkle.framework/Modules: -------------------------------------------------------------------------------- 1 | Versions/Current/Modules -------------------------------------------------------------------------------- /Sparkle.framework/PrivateHeaders: -------------------------------------------------------------------------------- 1 | Versions/Current/PrivateHeaders -------------------------------------------------------------------------------- /Sparkle.framework/Resources: -------------------------------------------------------------------------------- 1 | Versions/Current/Resources -------------------------------------------------------------------------------- /Sparkle.framework/Sparkle: -------------------------------------------------------------------------------- 1 | Versions/Current/Sparkle -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Headers/SPUDownloadData.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUDownloadData.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 8/10/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #if __has_feature(modules) 10 | @import Foundation; 11 | #else 12 | #import 13 | #endif 14 | 15 | #import "SUExport.h" 16 | 17 | NS_ASSUME_NONNULL_BEGIN 18 | 19 | /*! 20 | * A class for containing downloaded data along with some information about it. 21 | */ 22 | SU_EXPORT @interface SPUDownloadData : NSObject 23 | 24 | - (instancetype)initWithData:(NSData *)data textEncodingName:(NSString * _Nullable)textEncodingName MIMEType:(NSString * _Nullable)MIMEType; 25 | 26 | /*! 27 | * The raw data that was downloaded. 28 | */ 29 | @property (nonatomic, readonly) NSData *data; 30 | 31 | /*! 32 | * The IANA charset encoding name if available. Eg: "utf-8" 33 | */ 34 | @property (nonatomic, readonly, nullable, copy) NSString *textEncodingName; 35 | 36 | /*! 37 | * The MIME type if available. Eg: "text/plain" 38 | */ 39 | @property (nonatomic, readonly, nullable, copy) NSString *MIMEType; 40 | 41 | @end 42 | 43 | NS_ASSUME_NONNULL_END 44 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Headers/SPUDownloader.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUDownloader.h 3 | // Downloader 4 | // 5 | // Created by Mayur Pawashe on 4/1/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #if __has_feature(modules) 10 | @import Foundation; 11 | #else 12 | #import 13 | #endif 14 | #import "SPUDownloaderProtocol.h" 15 | 16 | @protocol SPUDownloaderDelegate; 17 | 18 | // This object implements the protocol which we have defined. It provides the actual behavior for the service. It is 'exported' by the service to make it available to the process hosting the service over an NSXPCConnection. 19 | @interface SPUDownloader : NSObject 20 | 21 | // Due to XPC remote object reasons, this delegate is strongly referenced 22 | // Invoke cleanup when done with this instance 23 | - (instancetype)initWithDelegate:(id )delegate; 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Headers/SPUDownloaderDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUDownloaderDelegate.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 4/1/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #if __has_feature(modules) 10 | @import Foundation; 11 | #else 12 | #import 13 | #endif 14 | 15 | NS_ASSUME_NONNULL_BEGIN 16 | 17 | @class SPUDownloadData; 18 | 19 | @protocol SPUDownloaderDelegate 20 | 21 | // This is only invoked for persistent downloads 22 | - (void)downloaderDidSetDestinationName:(NSString *)destinationName temporaryDirectory:(NSString *)temporaryDirectory; 23 | 24 | // Under rare cases, this may be called more than once, in which case the current progress should be reset back to 0 25 | // This is only invoked for persistent downloads 26 | - (void)downloaderDidReceiveExpectedContentLength:(int64_t)expectedContentLength; 27 | 28 | // This is only invoked for persistent downloads 29 | - (void)downloaderDidReceiveDataOfLength:(uint64_t)length; 30 | 31 | // downloadData is nil if this is a persisent download, otherwise it's non-nil if it's a temporary download 32 | - (void)downloaderDidFinishWithTemporaryDownloadData:(SPUDownloadData * _Nullable)downloadData; 33 | 34 | - (void)downloaderDidFailWithError:(NSError *)error; 35 | 36 | @end 37 | 38 | NS_ASSUME_NONNULL_END 39 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Headers/SPUDownloaderDeprecated.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUDownloaderDeprecated.h 3 | // Sparkle 4 | // 5 | // Created by Deadpikle on 12/20/17. 6 | // Copyright © 2017 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import "SPUDownloader.h" 10 | 11 | @interface SPUDownloaderDeprecated : SPUDownloader 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Headers/SPUDownloaderProtocol.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUDownloaderProtocol.h 3 | // PersistentDownloader 4 | // 5 | // Created by Mayur Pawashe on 4/1/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #if __has_feature(modules) 10 | @import Foundation; 11 | #else 12 | #import 13 | #endif 14 | 15 | NS_ASSUME_NONNULL_BEGIN 16 | 17 | @class SPUURLRequest; 18 | 19 | // The protocol that this service will vend as its API. This header file will also need to be visible to the process hosting the service. 20 | @protocol SPUDownloaderProtocol 21 | 22 | - (void)startPersistentDownloadWithRequest:(SPUURLRequest *)request bundleIdentifier:(NSString *)bundleIdentifier desiredFilename:(NSString *)desiredFilename; 23 | 24 | - (void)startTemporaryDownloadWithRequest:(SPUURLRequest *)request; 25 | 26 | - (void)downloadDidFinish; 27 | 28 | - (void)cleanup; 29 | 30 | - (void)cancel; 31 | 32 | @end 33 | 34 | NS_ASSUME_NONNULL_END 35 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Headers/SPUDownloaderSession.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUDownloaderSession.h 3 | // Sparkle 4 | // 5 | // Created by Deadpikle on 12/20/17. 6 | // Copyright © 2017 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #if __has_feature(modules) 10 | @import Foundation; 11 | #else 12 | #import 13 | #endif 14 | #import "SPUDownloader.h" 15 | #import "SPUDownloaderProtocol.h" 16 | 17 | NS_CLASS_AVAILABLE(NSURLSESSION_AVAILABLE, 7_0) 18 | @interface SPUDownloaderSession : SPUDownloader 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Headers/SPUURLRequest.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUURLRequest.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 5/19/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #if __has_feature(modules) 10 | @import Foundation; 11 | #else 12 | #import 13 | #endif 14 | 15 | NS_ASSUME_NONNULL_BEGIN 16 | 17 | // A class that wraps NSURLRequest and implements NSSecureCoding 18 | // This class exists because NSURLRequest did not support NSSecureCoding in macOS 10.8 19 | // I have not verified if NSURLRequest in 10.9 implements NSSecureCoding or not 20 | @interface SPUURLRequest : NSObject 21 | 22 | // Creates a new URL request 23 | // Only these properties are currently tracked: 24 | // * URL 25 | // * Cache policy 26 | // * Timeout interval 27 | // * HTTP header fields 28 | // * networkServiceType 29 | + (instancetype)URLRequestWithRequest:(NSURLRequest *)request; 30 | 31 | @property (nonatomic, readonly) NSURLRequest *request; 32 | 33 | @end 34 | 35 | NS_ASSUME_NONNULL_END 36 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Headers/SUAppcast.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUAppcast.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 3/12/06. 6 | // Copyright 2006 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #ifndef SUAPPCAST_H 10 | #define SUAPPCAST_H 11 | 12 | #if __has_feature(modules) 13 | @import Foundation; 14 | #else 15 | #import 16 | #endif 17 | #import "SUExport.h" 18 | 19 | NS_ASSUME_NONNULL_BEGIN 20 | 21 | @class SUAppcastItem; 22 | SU_EXPORT @interface SUAppcast : NSObject 23 | 24 | @property (copy, nullable) NSString *userAgentString; 25 | @property (copy, nullable) NSDictionary *httpHeaders; 26 | 27 | - (void)fetchAppcastFromURL:(NSURL *)url inBackground:(BOOL)bg completionBlock:(void (^)(NSError *_Nullable))err; 28 | - (SUAppcast *)copyWithoutDeltaUpdates; 29 | 30 | @property (readonly, copy, nullable) NSArray *items; 31 | @end 32 | 33 | NS_ASSUME_NONNULL_END 34 | 35 | #endif 36 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Headers/SUAppcastItem.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUAppcastItem.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 3/12/06. 6 | // Copyright 2006 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #ifndef SUAPPCASTITEM_H 10 | #define SUAPPCASTITEM_H 11 | 12 | #if __has_feature(modules) 13 | @import Foundation; 14 | #else 15 | #import 16 | #endif 17 | #import "SUExport.h" 18 | @class SUSignatures; 19 | 20 | SU_EXPORT @interface SUAppcastItem : NSObject 21 | @property (copy, readonly) NSString *title; 22 | @property (copy, readonly) NSString *dateString; 23 | @property (copy, readonly) NSDate *date; 24 | @property (copy, readonly) NSString *itemDescription; 25 | @property (strong, readonly) NSURL *releaseNotesURL; 26 | @property (strong, readonly) SUSignatures *signatures; 27 | @property (copy, readonly) NSString *minimumSystemVersion; 28 | @property (copy, readonly) NSString *maximumSystemVersion; 29 | @property (strong, readonly) NSURL *fileURL; 30 | @property (nonatomic, readonly) uint64_t contentLength; 31 | @property (copy, readonly) NSString *versionString; 32 | @property (copy, readonly) NSString *osString; 33 | @property (copy, readonly) NSString *displayVersionString; 34 | @property (copy, readonly) NSDictionary *deltaUpdates; 35 | @property (strong, readonly) NSURL *infoURL; 36 | @property (copy, readonly) NSNumber* phasedRolloutInterval; 37 | 38 | // Initializes with data from a dictionary provided by the RSS class. 39 | - (instancetype)initWithDictionary:(NSDictionary *)dict; 40 | - (instancetype)initWithDictionary:(NSDictionary *)dict failureReason:(NSString **)error; 41 | 42 | @property (getter=isDeltaUpdate, readonly) BOOL deltaUpdate; 43 | @property (getter=isCriticalUpdate, readonly) BOOL criticalUpdate; 44 | @property (getter=isMacOsUpdate, readonly) BOOL macOsUpdate; 45 | @property (getter=isInformationOnlyUpdate, readonly) BOOL informationOnlyUpdate; 46 | 47 | // Returns the dictionary provided in initWithDictionary; this might be useful later for extensions. 48 | @property (readonly, copy) NSDictionary *propertiesDictionary; 49 | 50 | - (NSURL *)infoURL; 51 | 52 | @end 53 | 54 | #endif 55 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Headers/SUCodeSigningVerifier.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUCodeSigningVerifier.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 7/5/12. 6 | // 7 | // 8 | 9 | #ifndef SUCODESIGNINGVERIFIER_H 10 | #define SUCODESIGNINGVERIFIER_H 11 | 12 | #if __has_feature(modules) 13 | @import Foundation; 14 | #else 15 | #import 16 | #endif 17 | #import "SUExport.h" 18 | 19 | SU_EXPORT @interface SUCodeSigningVerifier : NSObject 20 | + (BOOL)codeSignatureAtBundleURL:(NSURL *)oldBundlePath matchesSignatureAtBundleURL:(NSURL *)newBundlePath error:(NSError **)error; 21 | + (BOOL)codeSignatureIsValidAtBundleURL:(NSURL *)bundlePath error:(NSError **)error; 22 | + (BOOL)bundleAtURLIsCodeSigned:(NSURL *)bundlePath; 23 | + (NSDictionary *)codeSignatureInfoAtBundleURL:(NSURL *)bundlePath; 24 | @end 25 | 26 | #endif 27 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Headers/SUErrors.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUErrors.h 3 | // Sparkle 4 | // 5 | // Created by C.W. Betts on 10/13/14. 6 | // Copyright (c) 2014 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #ifndef SUERRORS_H 10 | #define SUERRORS_H 11 | 12 | #if __has_feature(modules) 13 | @import Foundation; 14 | #else 15 | #import 16 | #endif 17 | #import "SUExport.h" 18 | 19 | /** 20 | * Error domain used by Sparkle 21 | */ 22 | SU_EXPORT extern NSString *const SUSparkleErrorDomain; 23 | 24 | #pragma clang diagnostic push 25 | #pragma clang diagnostic ignored "-Wc++98-compat" 26 | typedef NS_ENUM(OSStatus, SUError) { 27 | // Appcast phase errors. 28 | SUAppcastParseError = 1000, 29 | SUNoUpdateError = 1001, 30 | SUAppcastError = 1002, 31 | SURunningFromDiskImageError = 1003, 32 | SURunningTranslocated = 1004, 33 | 34 | // Download phase errors. 35 | SUTemporaryDirectoryError = 2000, 36 | SUDownloadError = 2001, 37 | 38 | // Extraction phase errors. 39 | SUUnarchivingError = 3000, 40 | SUSignatureError = 3001, 41 | 42 | // Installation phase errors. 43 | SUFileCopyFailure = 4000, 44 | SUAuthenticationFailure = 4001, 45 | SUMissingUpdateError = 4002, 46 | SUMissingInstallerToolError = 4003, 47 | SURelaunchError = 4004, 48 | SUInstallationError = 4005, 49 | SUDowngradeError = 4006, 50 | SUInstallationCancelledError = 4007, 51 | 52 | // System phase errors 53 | SUSystemPowerOffError = 5000 54 | }; 55 | #pragma clang diagnostic pop 56 | 57 | #endif 58 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Headers/SUExport.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUExport.h 3 | // Sparkle 4 | // 5 | // Created by Jake Petroules on 2014-08-23. 6 | // Copyright (c) 2014 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #ifndef SUEXPORT_H 10 | #define SUEXPORT_H 11 | 12 | #ifdef BUILDING_SPARKLE 13 | #define SU_EXPORT __attribute__((visibility("default"))) 14 | #else 15 | #define SU_EXPORT 16 | #endif 17 | 18 | #endif 19 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Headers/SUStandardVersionComparator.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUStandardVersionComparator.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 12/21/07. 6 | // Copyright 2007 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #ifndef SUSTANDARDVERSIONCOMPARATOR_H 10 | #define SUSTANDARDVERSIONCOMPARATOR_H 11 | 12 | #if __has_feature(modules) 13 | @import Foundation; 14 | #else 15 | #import 16 | #endif 17 | #import "SUExport.h" 18 | #import "SUVersionComparisonProtocol.h" 19 | 20 | NS_ASSUME_NONNULL_BEGIN 21 | 22 | /*! 23 | Sparkle's default version comparator. 24 | 25 | This comparator is adapted from MacPAD, by Kevin Ballard. 26 | It's "dumb" in that it does essentially string comparison, 27 | in components split by character type. 28 | */ 29 | SU_EXPORT @interface SUStandardVersionComparator : NSObject 30 | 31 | /*! 32 | Initializes a new instance of the standard version comparator. 33 | */ 34 | - (instancetype)init; 35 | 36 | /*! 37 | Returns a singleton instance of the comparator. 38 | 39 | It is usually preferred to alloc/init new a comparator instead. 40 | */ 41 | + (SUStandardVersionComparator *)defaultComparator; 42 | 43 | /*! 44 | Compares version strings through textual analysis. 45 | 46 | See the implementation for more details. 47 | */ 48 | - (NSComparisonResult)compareVersion:(NSString *)versionA toVersion:(NSString *)versionB; 49 | @end 50 | 51 | NS_ASSUME_NONNULL_END 52 | #endif 53 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Headers/SUUpdater.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUUpdater.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 1/4/06. 6 | // Copyright 2006 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #ifndef SUUPDATER_H 10 | #define SUUPDATER_H 11 | 12 | #if __has_feature(modules) 13 | @import Cocoa; 14 | #else 15 | #import 16 | #endif 17 | #import "SUExport.h" 18 | #import "SUVersionComparisonProtocol.h" 19 | #import "SUVersionDisplayProtocol.h" 20 | 21 | @class SUAppcastItem, SUAppcast; 22 | 23 | @protocol SUUpdaterDelegate; 24 | 25 | /*! 26 | The main API in Sparkle for controlling the update mechanism. 27 | 28 | This class is used to configure the update paramters as well as manually 29 | and automatically schedule and control checks for updates. 30 | */ 31 | SU_EXPORT @interface SUUpdater : NSObject 32 | 33 | @property (unsafe_unretained) IBOutlet id delegate; 34 | 35 | /*! 36 | The shared updater for the main bundle. 37 | 38 | This is equivalent to passing [NSBundle mainBundle] to SUUpdater::updaterForBundle: 39 | */ 40 | + (SUUpdater *)sharedUpdater; 41 | 42 | /*! 43 | The shared updater for a specified bundle. 44 | 45 | If an updater has already been initialized for the provided bundle, that shared instance will be returned. 46 | */ 47 | + (SUUpdater *)updaterForBundle:(NSBundle *)bundle; 48 | 49 | /*! 50 | Designated initializer for SUUpdater. 51 | 52 | If an updater has already been initialized for the provided bundle, that shared instance will be returned. 53 | */ 54 | - (instancetype)initForBundle:(NSBundle *)bundle; 55 | 56 | /*! 57 | Explicitly checks for updates and displays a progress dialog while doing so. 58 | 59 | This method is meant for a main menu item. 60 | Connect any menu item to this action in Interface Builder, 61 | and Sparkle will check for updates and report back its findings verbosely 62 | when it is invoked. 63 | 64 | This will find updates that the user has opted into skipping. 65 | */ 66 | - (IBAction)checkForUpdates:(id)sender; 67 | 68 | /*! 69 | The menu item validation used for the -checkForUpdates: action 70 | */ 71 | - (BOOL)validateMenuItem:(NSMenuItem *)menuItem; 72 | 73 | /*! 74 | Checks for updates, but does not display any UI unless an update is found. 75 | 76 | This is meant for programmatically initating a check for updates. That is, 77 | it will display no UI unless it actually finds an update, in which case it 78 | proceeds as usual. 79 | 80 | If automatic downloading of updates it turned on and allowed, however, 81 | this will invoke that behavior, and if an update is found, it will be downloaded 82 | in the background silently and will be prepped for installation. 83 | 84 | This will not find updates that the user has opted into skipping. 85 | */ 86 | - (void)checkForUpdatesInBackground; 87 | 88 | /*! 89 | A property indicating whether or not to check for updates automatically. 90 | 91 | Setting this property will persist in the host bundle's user defaults. 92 | The update schedule cycle will be reset in a short delay after the property's new value is set. 93 | This is to allow reverting this property without kicking off a schedule change immediately 94 | */ 95 | @property BOOL automaticallyChecksForUpdates; 96 | 97 | /*! 98 | A property indicating whether or not updates can be automatically downloaded in the background. 99 | 100 | Note that automatic downloading of updates can be disallowed by the developer 101 | or by the user's system if silent updates cannot be done (eg: if they require authentication). 102 | In this case, -automaticallyDownloadsUpdates will return NO regardless of how this property is set. 103 | 104 | Setting this property will persist in the host bundle's user defaults. 105 | */ 106 | @property BOOL automaticallyDownloadsUpdates; 107 | 108 | /*! 109 | A property indicating the current automatic update check interval. 110 | 111 | Setting this property will persist in the host bundle's user defaults. 112 | The update schedule cycle will be reset in a short delay after the property's new value is set. 113 | This is to allow reverting this property without kicking off a schedule change immediately 114 | */ 115 | @property NSTimeInterval updateCheckInterval; 116 | 117 | /*! 118 | Begins a "probing" check for updates which will not actually offer to 119 | update to that version. 120 | 121 | However, the delegate methods 122 | SUUpdaterDelegate::updater:didFindValidUpdate: and 123 | SUUpdaterDelegate::updaterDidNotFindUpdate: will be called, 124 | so you can use that information in your UI. 125 | 126 | Updates that have been skipped by the user will not be found. 127 | */ 128 | - (void)checkForUpdateInformation; 129 | 130 | /*! 131 | The URL of the appcast used to download update information. 132 | 133 | Setting this property will persist in the host bundle's user defaults. 134 | If you don't want persistence, you may want to consider instead implementing 135 | SUUpdaterDelegate::feedURLStringForUpdater: or SUUpdaterDelegate::feedParametersForUpdater:sendingSystemProfile: 136 | 137 | This property must be called on the main thread. 138 | */ 139 | @property (copy) NSURL *feedURL; 140 | 141 | /*! 142 | The host bundle that is being updated. 143 | */ 144 | @property (readonly, strong) NSBundle *hostBundle; 145 | 146 | /*! 147 | The bundle this class (SUUpdater) is loaded into. 148 | */ 149 | @property (strong, readonly) NSBundle *sparkleBundle; 150 | 151 | /*! 152 | The user agent used when checking for updates. 153 | 154 | The default implementation can be overrided. 155 | */ 156 | @property (nonatomic, copy) NSString *userAgentString; 157 | 158 | /*! 159 | The HTTP headers used when checking for updates. 160 | 161 | The keys of this dictionary are HTTP header fields (NSString) and values are corresponding values (NSString) 162 | */ 163 | @property (copy) NSDictionary *httpHeaders; 164 | 165 | /*! 166 | A property indicating whether or not the user's system profile information is sent when checking for updates. 167 | 168 | Setting this property will persist in the host bundle's user defaults. 169 | */ 170 | @property BOOL sendsSystemProfile; 171 | 172 | /*! 173 | A property indicating the decryption password used for extracting updates shipped as Apple Disk Images (dmg) 174 | */ 175 | @property (nonatomic, copy) NSString *decryptionPassword; 176 | 177 | /*! 178 | This function ignores normal update schedule, ignores user preferences, 179 | and interrupts users with an unwanted immediate app update. 180 | 181 | WARNING: this function should not be used in regular apps. This function 182 | is a user-unfriendly hack only for very special cases, like unstable 183 | rapidly-changing beta builds that would not run correctly if they were 184 | even one day out of date. 185 | 186 | Instead of this function you should set `SUAutomaticallyUpdate` to `YES`, 187 | which will gracefully install updates when the app quits. 188 | 189 | For UI-less/daemon apps that aren't usually quit, instead of this function, 190 | you can use the delegate method 191 | SUUpdaterDelegate::updater:willInstallUpdateOnQuit:immediateInstallationInvocation: 192 | or 193 | SUUpdaterDelegate::updater:willInstallUpdateOnQuit:immediateInstallationBlock: 194 | to immediately start installation when an update was found. 195 | 196 | A progress dialog is shown but the user will never be prompted to read the 197 | release notes. 198 | 199 | This function will cause update to be downloaded twice if automatic updates are 200 | enabled. 201 | 202 | You may want to respond to the userDidCancelDownload delegate method in case 203 | the user clicks the "Cancel" button while the update is downloading. 204 | */ 205 | - (void)installUpdatesIfAvailable; 206 | 207 | /*! 208 | Returns the date of last update check. 209 | 210 | \returns \c nil if no check has been performed. 211 | */ 212 | @property (readonly, copy) NSDate *lastUpdateCheckDate; 213 | 214 | /*! 215 | Appropriately schedules or cancels the update checking timer according to 216 | the preferences for time interval and automatic checks. 217 | 218 | This call does not change the date of the next check, 219 | but only the internal NSTimer. 220 | */ 221 | - (void)resetUpdateCycle; 222 | 223 | /*! 224 | A property indicating whether or not an update is in progress. 225 | 226 | Note this property is not indicative of whether or not user initiated updates can be performed. 227 | Use SUUpdater::validateMenuItem: for that instead. 228 | */ 229 | @property (readonly) BOOL updateInProgress; 230 | 231 | @end 232 | 233 | #endif 234 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Headers/SUVersionComparisonProtocol.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUVersionComparisonProtocol.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 12/21/07. 6 | // Copyright 2007 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #ifndef SUVERSIONCOMPARISONPROTOCOL_H 10 | #define SUVERSIONCOMPARISONPROTOCOL_H 11 | 12 | #if __has_feature(modules) 13 | @import Foundation; 14 | #else 15 | #import 16 | #endif 17 | #import "SUExport.h" 18 | 19 | NS_ASSUME_NONNULL_BEGIN 20 | 21 | /*! 22 | Provides version comparison facilities for Sparkle. 23 | */ 24 | @protocol SUVersionComparison 25 | 26 | /*! 27 | An abstract method to compare two version strings. 28 | 29 | Should return NSOrderedAscending if b > a, NSOrderedDescending if b < a, 30 | and NSOrderedSame if they are equivalent. 31 | */ 32 | - (NSComparisonResult)compareVersion:(NSString *)versionA toVersion:(NSString *)versionB; // *** MAY BE CALLED ON NON-MAIN THREAD! 33 | 34 | @end 35 | 36 | NS_ASSUME_NONNULL_END 37 | #endif 38 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Headers/SUVersionDisplayProtocol.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUVersionDisplayProtocol.h 3 | // EyeTV 4 | // 5 | // Created by Uli Kusterer on 08.12.09. 6 | // Copyright 2009 Elgato Systems GmbH. All rights reserved. 7 | // 8 | 9 | #if __has_feature(modules) 10 | @import Foundation; 11 | #else 12 | #import 13 | #endif 14 | #import "SUExport.h" 15 | 16 | /*! 17 | Applies special display formatting to version numbers. 18 | */ 19 | @protocol SUVersionDisplay 20 | 21 | /*! 22 | Formats two version strings. 23 | 24 | Both versions are provided so that important distinguishing information 25 | can be displayed while also leaving out unnecessary/confusing parts. 26 | */ 27 | - (void)formatVersion:(NSString *_Nonnull*_Nonnull)inOutVersionA andVersion:(NSString *_Nonnull*_Nonnull)inOutVersionB; 28 | 29 | @end 30 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Headers/Sparkle.h: -------------------------------------------------------------------------------- 1 | // 2 | // Sparkle.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 3/16/06. (Modified by CDHW on 23/12/07) 6 | // Copyright 2006 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #ifndef SPARKLE_H 10 | #define SPARKLE_H 11 | 12 | // This list should include the shared headers. It doesn't matter if some of them aren't shared (unless 13 | // there are name-space collisions) so we can list all of them to start with: 14 | 15 | #pragma clang diagnostic push 16 | // Do not use <> style includes since 2.x has two frameworks that need to work: Sparkle and SparkleCore 17 | #pragma clang diagnostic ignored "-Wquoted-include-in-framework-header" 18 | 19 | #import "SUAppcast.h" 20 | #import "SUAppcastItem.h" 21 | #import "SUStandardVersionComparator.h" 22 | #import "SUUpdater.h" 23 | #import "SUUpdaterDelegate.h" 24 | #import "SUVersionComparisonProtocol.h" 25 | #import "SUVersionDisplayProtocol.h" 26 | #import "SUErrors.h" 27 | 28 | #import "SPUDownloader.h" 29 | #import "SPUDownloaderDelegate.h" 30 | #import "SPUDownloaderDeprecated.h" 31 | #import "SPUDownloadData.h" 32 | #import "SPUDownloaderProtocol.h" 33 | #import "SPUDownloaderSession.h" 34 | #import "SPUURLRequest.h" 35 | #import "SUCodeSigningVerifier.h" 36 | 37 | #pragma clang diagnostic pop 38 | 39 | #endif 40 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module Sparkle { 2 | umbrella header "Sparkle.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/PrivateHeaders/SUUnarchiver.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUUnarchiver.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 3/16/06. 6 | // Copyright 2006 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @protocol SUUnarchiverProtocol; 14 | 15 | @interface SUUnarchiver : NSObject 16 | 17 | + (nullable id )unarchiverForPath:(NSString *)path updatingHostBundlePath:(nullable NSString *)hostPath decryptionPassword:(nullable NSString *)decryptionPassword; 18 | 19 | @end 20 | 21 | NS_ASSUME_NONNULL_END 22 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildMachineOSBuild 6 | 20B28 7 | CFBundleDevelopmentRegion 8 | English 9 | CFBundleExecutable 10 | Autoupdate 11 | CFBundleIconFile 12 | AppIcon.icns 13 | CFBundleIdentifier 14 | org.sparkle-project.Sparkle.Autoupdate 15 | CFBundleInfoDictionaryVersion 16 | 6.0 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.24.0 a-67-g0e162c98 21 | CFBundleSignature 22 | ???? 23 | CFBundleSupportedPlatforms 24 | 25 | MacOSX 26 | 27 | CFBundleVersion 28 | 1.24.0 29 | DTCompiler 30 | com.apple.compilers.llvm.clang.1_0 31 | DTPlatformBuild 32 | 12C5020f 33 | DTPlatformName 34 | macosx 35 | DTPlatformVersion 36 | 11.1 37 | DTSDKBuild 38 | 20C5048g 39 | DTSDKName 40 | macosx11.1 41 | DTXcode 42 | 1230 43 | DTXcodeBuild 44 | 12C5020f 45 | LSBackgroundOnly 46 | 1 47 | LSMinimumSystemVersion 48 | 10.7 49 | LSUIElement 50 | 1 51 | NSMainNibFile 52 | MainMenu 53 | NSPrincipalClass 54 | NSApplication 55 | 56 | 57 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/MacOS/Autoupdate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/MacOS/Autoupdate -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/MacOS/fileop: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/MacOS/fileop -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/PkgInfo: -------------------------------------------------------------------------------- 1 | APPL???? -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/AppIcon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/AppIcon.icns -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/SUStatus.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/SUStatus.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/ar.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/ar.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/ca.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/ca.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/cs.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/cs.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/da.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/da.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/de.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/de.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/el.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/el.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/en.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/en.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/es.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/es.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/fi.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/fi.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/fr.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/fr.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/he.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/he.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/hr.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/hr.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/hu.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/hu.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/is.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/is.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/it.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/it.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/ja.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/ja.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/ko.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/ko.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/nb.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/nb.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/nl.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/nl.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/pl.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/pl.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/pt_BR.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/pt_BR.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/pt_PT.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/pt_PT.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/ro.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/ro.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/ru.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/ru.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/sk.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/sk.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/sl.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/sl.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/sv.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/sv.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/th.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/th.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/tr.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/tr.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/uk.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/uk.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/zh_CN.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/zh_CN.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/zh_TW.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/zh_TW.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/DarkAqua.css: -------------------------------------------------------------------------------- 1 | html { 2 | color: #FFFFFFD8; 3 | } 4 | :link { 5 | color: #419CFF; 6 | } 7 | :link:active { 8 | color: #FF1919; 9 | } 10 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildMachineOSBuild 6 | 20B28 7 | CFBundleDevelopmentRegion 8 | en 9 | CFBundleExecutable 10 | Sparkle 11 | CFBundleIdentifier 12 | org.sparkle-project.Sparkle 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | Sparkle 17 | CFBundlePackageType 18 | FMWK 19 | CFBundleShortVersionString 20 | 1.24.0 a-67-g0e162c98 21 | CFBundleSignature 22 | ???? 23 | CFBundleSupportedPlatforms 24 | 25 | MacOSX 26 | 27 | CFBundleVersion 28 | 1.24.0 29 | DTCompiler 30 | com.apple.compilers.llvm.clang.1_0 31 | DTPlatformBuild 32 | 12C5020f 33 | DTPlatformName 34 | macosx 35 | DTPlatformVersion 36 | 11.1 37 | DTSDKBuild 38 | 20C5048g 39 | DTSDKName 40 | macosx11.1 41 | DTXcode 42 | 1230 43 | DTXcodeBuild 44 | 12C5020f 45 | LSMinimumSystemVersion 46 | 10.7 47 | 48 | 49 | -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/SUStatus.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/SUStatus.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/ar.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/ar.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/ar.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/ar.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/ar.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/ar.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/ar.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/ar.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/ca.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/ca.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/cs.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/cs.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/cs.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/cs.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/da.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/da.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/da.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/da.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/de.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/de.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/el.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/el.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/el.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/el.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/el.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/el.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/el.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/el.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/en.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/en.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/es.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/es.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/fi.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/fi.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/fi.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/fi.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/fi.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/fi.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/fi.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/fi.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/fr.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/fr.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/fr_CA.lproj: -------------------------------------------------------------------------------- 1 | fr.lproj -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/he.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/he.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/hr.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/hr.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/hr.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/hr.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/hr.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/hr.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/hr.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/hr.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/hu.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/hu.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/hu.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/hu.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/hu.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/hu.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/hu.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/hu.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/is.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/is.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/is.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/is.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/it.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/it.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/ja.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/ja.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/ja.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/ja.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/ja.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/ja.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/ja.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/ja.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/ko.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/ko.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/ko.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/ko.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/ko.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/ko.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/ko.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/ko.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/nb.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/nb.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/nb.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/nb.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/nb.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/nb.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/nb.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/nb.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/nl.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/nl.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/pl.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/pl.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/pl.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/pl.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/pl.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/pl.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/pl.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/pl.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/pt.lproj: -------------------------------------------------------------------------------- 1 | pt_BR.lproj -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/pt_BR.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/pt_PT.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/ro.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/ro.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/ro.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/ro.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/ro.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/ro.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/ro.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/ro.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/ru.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/ru.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/sk.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/sk.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/sk.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/sk.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/sk.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/sk.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/sk.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/sk.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/sl.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/sl.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/sl.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/sl.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/sl.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/sl.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/sl.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/sl.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/sv.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/sv.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/th.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/th.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/th.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/th.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/th.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/th.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/th.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/th.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/tr.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/tr.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/tr.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/tr.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/tr.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/tr.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/tr.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/tr.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/uk.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/uk.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/uk.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/uk.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/uk.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/uk.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/uk.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/uk.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/zh_CN.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Resources/zh_TW.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Sparkle.framework/Versions/A/Sparkle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/Sparkle.framework/Versions/A/Sparkle -------------------------------------------------------------------------------- /Sparkle.framework/Versions/Current: -------------------------------------------------------------------------------- 1 | A -------------------------------------------------------------------------------- /ci.xcconfig: -------------------------------------------------------------------------------- 1 | // 2 | // ci.xcconfig 3 | // MidiKeys 4 | // 5 | // Created by Chris Reed on 11/22/20. 6 | // Copyright © 2020 beatimprint LLC. 7 | // 8 | 9 | // Change code signing identity so we don't have to deal with certificates in CI. 10 | //CODE_SIGN_IDENTITY = Apple Development 11 | 12 | 13 | CODE_SIGN_STYLE = Manual 14 | CODE_SIGN_IDENTITY = 15 | DEVELOPMENT_TEAM = 16 | PROVISIONING_PROFILE_SPECIFIER = 17 | -------------------------------------------------------------------------------- /docs/LiesMich.rtf: -------------------------------------------------------------------------------- 1 | {\rtf1\mac\ansicpg10000\cocoartf102 2 | {\fonttbl\f0\fswiss\fcharset77 Helvetica-Bold;\f1\fswiss\fcharset77 Helvetica;\f2\fswiss\fcharset77 Helvetica-Oblique; 3 | } 4 | {\colortbl;\red255\green255\blue255;} 5 | \vieww12000\viewh16200\viewkind0 6 | \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural 7 | 8 | \f0\b\fs32 \cf0 MidiKeys 1.6 9 | \f1\b0\fs24 \ 10 | 11 | \fs20 Copyright \'a9 2002-2003 Chris Reed. Alle Rechte vorbehalten. 12 | \fs24 \ 13 | \ 14 | \ 15 | 16 | \f0\b\fs26 Einleitung 17 | \f1\b0\fs24 \ 18 | MidiKeys ist ein Programm, das ein kleines Bild eines MIDI-keyboards auf dem Bildschirm anzeigt. Klickt man die Tasten oder tippt auf der Tastatur werden Noten an das ausgew\'8ahlte Ziel gesendet. Sie k\'9annen es verwenden um mit Ihrem Lieblingssequencer unterwegs zu komponieren, oder um einen neuen Soft-Synth auszuprobieren. Im Wesentlichen ist es einfach ein praktisches Hilfsmittel. \ 19 | \ 20 | Beachten Sie, dass MidiKeys selbst keinen Klang produziert sondern nur Signale sendet. Sie m\'9fssen es mit einem MIDI-Ziel verbinden, um etwas zu h\'9aren. Ein solches Ziel kann z.B. ein Software Synthesizer oder externe Hardware sein, die \'9fber einen USB-MIDI Adapter angeschlossen ist.\ 21 | \ 22 | 23 | \f0\b\fs26 Voraussetzungen 24 | \f1\b0\fs24 \ 25 | \'a5 Mac OS X 10.2 oder neuer\ 26 | \'a5 Software synthesizer, MIDI sequencer Programm, oder externes MIDI-Ger\'8at und MIDI Schnittstelle. Ich empfehle entweder SimpleSynth von Pete Yandell oder Rax von Robert Grant. Beide Programme sind bei versiontracker.com und macupdate.com erh\'8altlich.\ 27 | \ 28 | 29 | \f0\b\fs26 Installation 30 | \f1\b0\fs24 \ 31 | Kopieren Sie MidiKeys in den Programmordner Ihrer Wahl.\ 32 | \ 33 | 34 | \f0\b\fs26 MidiKeys verwenden 35 | \f1\b0\fs24 \ 36 | Es gibt zwei Arten, MidiKeys zu verwenden. Zum einen k\'9annen Sie als Ziel \'e3Virtuelle Quelle\'d2 einstellen. Dies ist die Standardeinstellung. Bei dieser Einstellung muss MidiKeys als Eingabeanschluss in der anderen Software, die Sie benutzen eingestellt werden. (Zum Beispiel kann in Ableton Live kann in den Voreinstellungen [Men\'9f \'e3Optionen\'d2] der \'e3Midi / Sync\'d2 Tab angeklickt und im Pop-Up Men\'9f f\'9fr den Midi-Eingang MidiKeys ausgew\'8ahlt werden.)\ 37 | \ 38 | Die andere Methode besteht darin, unter \'e3Ziel\'d3 ein anderes Ziel auszuw\'8ahlen. In diesem Aufklappmen\'9f erscheinen sowohl Hardwareger\'8ate, wie auch Ziele, die von anderen laufenden Programmen angeboten werden. Damit ein Programm hier erscheint muss es ein virtuelles Ziel anbieten.\ 39 | \ 40 | Wenn Sie MidiKeys als virtuelle Quelle einsetzen, ist es bei manchen Programmen erforderlich, MidiKeys zuerst zu starten, damit es in deren Liste der Quellen erscheint. Wahrscheinlich werden Sie meist diese Methode verwenden. Und wenn das Pragramm nicht auf Apples CoreMIDI zur\'9fckgreift (sondern stattdessen z.B. Quicktime verwendet) kann man nichts machen\'c9es wird einfach nicht funktionieren.\ 41 | \ 42 | MidiKeys kann die Note, die auf einem anderen Keyboard oder Sequencer gespielt werden, auf der eigenen Tastatur anzeigen. Dazu muss die entsprechende MIDI-Quelle mit dem Aufklappmen\'9f ausgew\'8ahlt werden. Wenn eine Quelle ausgew\'8ahlt ist, werden die Tasten entsprechend eintreffender Noten hervorgehoben. Daf\'9fr spielt es keine Rolle, auf welchem MIDI-Kanal diese Noten gesendet werden. Wenn 43 | \f2\i \'e3Weiterleiten\'d3 aktiviert ist, werden die empfangenen Noten an das eingestellte Ziel weitergeleitet.\ 44 | \ 45 | Sind Ziel, Quelle und Weiterleitung eingestellt, kann diese Einstellung mit dem Knopf rechts oben eingeklappt werden, damit die Tastatur nicht unn\'9atig viel Platz auf dem Bildschirm einnimmt. Mit dem gleichen Knopf kann der Bereich auch wieder eingeblendet werden. 46 | \f1\i0 \ 47 | \ 48 | Um h\'9ahere oder tiefere T\'9ane zu spielen, k\'9annen die Befehle \'e3Oktave hoch\'d2 und \'e3Oktave runter\'d2 aus dem Men\'9f \'e3Keys\'d2 oder die Pfeiltasten rechts und links verwendet werden, eine Verschiebung wird auf der Tastatur transparent dargestellt. Der Tonbereich kann auf diese Weise um vier Oktaven noch oben oder unten verschoben werden. 49 | \f2\i Es gibt auch einen Befehl \'e3Alle Noten aus\'d3 senden in diesem Men\'9f, der f\'9fr alle Tasten ein Tonende-Signal erzeugt. Dies ist n\'9ftzlich falls T\'9ane \'e3klemmen\'d2 (also weiterklingen). 50 | \f1\i0 \ 51 | \ 52 | Die H\'8arte des Anschlags kann mit dem Schieberegler \'9fber der Tastatur oder den Pfeiltasten f\'9fr oben und unten in Kombination mit der \'e3Taste f\'9fr den systemweiten Zugriff\'d2 (s.u.) eingestellt werden.\ 53 | \ 54 | 55 | \f0\b\fs26 Einstellungen 56 | \f1\b0\fs24 \ 57 | Der Einstellungsdialog kann durch Auswahl von \'e3Einstellungen\'d2 aus dem Programmmen\'9f ge\'9affnet werden. Die \'80nderungen werden erst wirksam, wenn sie mit \'e3OK\'d2 best\'8atigt wurden; entsprechend werden keine \'80nderungen durchgef\'9fhrt, wenn \'e3Abbrechen\'d3 gedr\'9fckt wird.\ 58 | \ 59 | Die Farbe der aktiven Taste kann mit dem Farbw\'8ahler \'e3Farbe der aktiven Taste\'d2 ausgew\'8ahlt werden. Weiter kann hier noch die Transparenz dieser Farbe angepasst werden.\ 60 | \ 61 | Midikeys enth\'8alt mehrere Tastaturbelegungen: \'e3Gesamt\'d2 stellt etwas mehr als zwei Oktaven auf der Tastatur zur Verf\'9fgung. Dabei entsprechen die Tasten in den Reihen YXCV\'c9 und QWERTZ\'c9 (deutsche Belegung) den wei\'a7en und die Reihen ASDF\'c9 und 1234\'c9 den schwarzen. Die Belegung \'e3Einfach\'d3 verwendet nur die unteren beiden Reihen, hier steht entsprechend nur eine Oktave zur Verf\'9fgung. 62 | \f2\i Entsprechend werden bei \'e3Einfach (oben)\'d2 nur die oberen Tasten und bei \'e3Gesamt (vertauscht)\'d2 alle Tasten mit vertauschten Oktaven verwendet. 63 | \f1\i0 \ 64 | \ 65 | Die \'e3Taste f\'9fr systemweiten Zugriff\'d2 macht das Keyboard auch dann benutzbar, wenn andere Programme im Vordergrund sind. Daf\'9fr sind nicht immer alle Tasten benutzbar \'d0 dies h\'8angt von der benutzten Systemversion und anderer installierter Software ab.\ 66 | \ 67 | Die Auswahlfelder f\'9fr die Sondertasten geben die Tasten an, die gehalten werden m\'9fssen, um MidiKeys aus anderen Programmen zu benutzen. Hier muss mindestens ein Feld ausgew\'8ahlt werden. Und um dieser Frage zuvorzukommen, die Feststelltaste (CapsLock) wird vom System f\'9fr diesen Zweck leider nicht unterst\'9ftzt. (Aus dem gleichen Grund muss mindestens eine Taste ausgew\'8ahlt werden.)\ 68 | \ 69 | Weil z.B. Sequenzer auf dem Bildschirm fast allen Platz einnehmen, hat MidiKeys eine Option, \'9fber allen anderen Programmen zu schweben. Dies kann mit der Einstellung \'e3Tastatur immer im Vordergrund\'d2 erreicht werden. Das Tastaturfenster kann auch transparent dargestellt werden (damit man sehen kann, was dahinter passiert), optional auch nur dann, wenn MidiKeys im Hintergrund ist. Daf\'9fr gibt es einen Schieberegler und die Option \'e3Nur im Hintergrund\'d2.\ 70 | \ 71 | \ 72 | 73 | \f0\b\fs26 Bekannte Probleme\ 74 | \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural 75 | 76 | \f1\b0\fs24 \cf0 \'a5 Bei einigen Rechnern/Tastaturen scheint es ein Limit von 6 gleichzeitigen Tastendr\'9fcken zu geben. Bei meinem PowerBook kann ich mindestens 8 Tasten gleichzeitig dr\'9fcken. 77 | \f2\i (Anm. des \'86bersetzers: Leider nicht mein PowerBook, auf meinem ProKeyboard tritt das Problem auch auf)\ 78 | 79 | \f1\i0 \'a5 Abgesehen von diesem Hardwareproblem dauert es ca. 25-30 Millisekunden, bis ein Tastendruck verarbeitet wird. Werden also 6 Tasten gleichzeitig gedr\'9fckt, gibt es eine Gesamtverz\'9agerung von 25*6 = 150 ms. Ich werde versuchen, die Situation in zuk\'9fnftigen Versionen zu verbessern. Externe Signale leiden nicht unter dieser Verz\'9agerung.\ 80 | \'a5 Manche Tastenkombinationen k\'9annen nicht f\'9fr den systemweiten Zugriff verwendet werden. Vermutlich kann ich daran nichts \'8andern.\ 81 | \'a5 Manche Sequencer-Programme verarbeiten im Hintergrund keine MIDI-Signale (z.B. Intuem). Um dieses Problem zu umgehen, muss auf die obengenannten Optionen zur\'9fckgegriffen werden.\ 82 | \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural 83 | 84 | \f0\b\fs26 \cf0 \ 85 | Sonstige Anmerkungen\ 86 | 87 | \f1\b0 Sie verwenden MidiKeys auf eigenes Risiko. Ich bin nicht verantwortlich f\'9fr Dinge die als Folge der Benutzung von MidiKeys mit Ihnen oder Ihrem Computer passieren oder nicht passieren. Wenn Sie eine Sehnenscheidenentz\'9fndung belommen, w\'8ahrend Sie versuchen, auf Ihrem Laptop Bach zu spielen, ist das Ihr Problem.\ 88 | \ 89 | MidiKeys ist Freeware (Gratissoftware), aber nicht Public Domain (\'9affentliches Eigentum). Im Augenblich erw\'8age ich nicht, den Quellcode zu ver\'9affentlichen. Dies kann sich in Zukunft \'8andern, aber fragen sie bitte nicht nach.\ 90 | \ 91 | Besonderer Dank geht an Richard Zelzer und Ralf Welter f\'9fr die deutsche, Fr\'8ederic Ball\'8eriaux f\'9fr die franz\'9asische, sowie Hiroshi Yamato f\'9fr die japanische Lokalisierung.\ 92 | \ 93 | Ich kann per e-mail unter 94 | \fs24 flit@ftml.net erreicht werden (Anmerkung des \'86bersetzers: Bitte auf Englisch anschreiben, wenn Sie eine Antwort erwarten. Wenn Sie damit Probleme haben, k\'9annen Sie sich an mich unter i_see@macnews.de wenden.)} -------------------------------------------------------------------------------- /docs/Lisez-Moi.rtf: -------------------------------------------------------------------------------- 1 | {\rtf1\mac\ansicpg10000\cocoartf102 2 | {\fonttbl\f0\fswiss\fcharset77 Helvetica-Bold;\f1\fswiss\fcharset77 Helvetica;} 3 | {\colortbl;\red255\green255\blue255;} 4 | \paperw11900\paperh16840\margl1440\margr1440\vieww11720\viewh16200\viewkind0 5 | \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural 6 | 7 | \f0\b\fs32 \cf0 MidiKeys 1.6 8 | \f1\b0\fs24 \ 9 | 10 | \fs20 Copyright \'a9 2002-2003 Chris Reed. All rights reserved. 11 | \fs24 \ 12 | \ 13 | \ 14 | 15 | \f0\b\fs26 Introduction 16 | \f1\b0\fs24 \ 17 | MidiKeys est une application repr\'8esentant un petit clavier MIDI \'88 l'\'8ecran. Cliquer sur les touches ou taper sur le clavier de l'ordinateur enverra les notes MIDI \'88 la destination d\'8esir\'8ee. Vous pouvez l'utiliser pour composer avec votre s\'8equenceur pr\'8ef\'8er\'8e loin de votre clavier ma\'94tre, ou simplement pour essayer un nouveau clavier virtuel. C'est plus g\'8en\'8eralement un outil pratique \'88 avoir.\ 18 | \ 19 | Gardez \'88 l'esprit que MidiKeys ne produit pas de son mais envoie juste des notes MIDI. Vous devez le connecter \'88 une source sonore MIDI pour entendre quelque chose. Par exemple un synth\'8etiseur virtuel ou un synth\'8etiseur externe connect\'8e avec une interface MIDI USB.\ 20 | \ 21 | \ 22 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural 23 | 24 | \f0\b\fs26 \cf0 Configuration requise\ 25 | \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural 26 | 27 | \f1\b0\fs24 \cf0 \'a5 Mac OS X 10.2 ou sup\'8erieur\ 28 | \'a5 Un clavier virtuel, un s\'8equenceur MIDI, ou n'importe quel synth\'8etiseur, module, sampleur MIDI externe avec une interface MIDI.\ 29 | \ 30 | 31 | \f0\b\fs26 Installation\ 32 | 33 | \f1\b0\fs24 Copiez l'application MidiKeys dans le dossier Applications de votre cho 34 | \fs26 ix.\ 35 | \ 36 | 37 | \f0\b Utilisation de MidiKeys\ 38 | 39 | \f1\b0\fs24 Il y a deux fa\'8dons d'utiliser MidiKeys. Premi\'8frement, vous pouvez s\'8electionner "Source Virtuelle" dans le menu "Destination". C'est le r\'8eglage par d\'8efaut. Avec "Source Virtuelle" comme destination, vous devez s\'8electionner "MidiKeys" comme port d'entr\'8ee dans les autres programmes MIDI que vous utilisez. (Par exemple, dans Ableton Live, ouvrez les pr\'8ef\'8erences, s\'8electionnez "Midi/Sync" et choisissez "MidiKeys" dans le menu d\'8eroulant "input source").\ 40 | \ 41 | La seconde m\'8ethode est de choisir une destination diff\'8erente dans le menu "Destination". Les appareils MIDI externes y seront list\'8es, ainsi que les destinations virtuelles cr\'8e\'8ees par d'autres applications. Une application doit pouvoir cr\'8eer une destination virtuelle pour \'90tre list\'8ee ici.\ 42 | \ 43 | Si vous utilisez la m\'8ethode "Source Virtuelle", certains programmes n\'8ecessiteront que MidiKeys soit d\'8emarr\'8e en premier pour l'afficher dans la liste des sources possibles. C'est probablement la fa\'8don la plus courante d'utiliser MidiKeys. Bien s\'9er, si une application n'utilise pas CoreMIDI (par exemple si elle utilise Quicktime) il n'y a rien \'88 faire... \'82a ne marchera pas.\ 44 | \ 45 | MidiKeys peut afficher les notes jou\'8ees sur un autre clavier, ou la sortie d'un s\'8equenceur. S\'8electionnez la source MIDI d\'8esir\'8ee dans le menu "Port \'88 \'8ecouter" de la fen\'90tre principale. Une fois une source s\'8electionn\'8ee, les notes entrantes s'afficheront sur le clavier. Les notes de tous les canaux sont affich\'8ees. Quand "Thru" est s\'8electionn\'8e (\'88 c\'99t\'8e de "Port \'88 \'8ecouter"), toutes les notes apparaissant sur le clavier sont transmises au port de destination.\ 46 | \ 47 | Pour acc\'8eder \'88 des notes plus hautes ou plus basses, utilisez les commandes "Octave Sup\'8erieure" ou "Octave Inf\'8erieure" dans le menu "Clavier". Quatre octaves vers le haut et vers le bas sont permises. Vous trouverez aussi une commande "Stopper toutes les notes" dans le menu "Clavier" qui enverra une commande "note off" pour toutes les notes. Pratique si une note reste "coinc\'8ee".\ 48 | \ 49 | 50 | \f0\b\fs26 Pr\'8ef\'8erences 51 | \f1\b0\fs24 \ 52 | Ouvrez le panneau des pr\'8ef\'8erences en choisissant "Pr\'8ef\'8erences" dans le menu de l'application. Les changements ne seront appliqu\'8es qu'apr\'8fs avoir cliqu\'8e sur "OK", et bien s\'9er aucun changement n'est appliqu\'8e si vous cliquez sur "Annuler".\ 53 | \ 54 | Vous pouvez d\'8efinir la couleur des touches actives ainsi que leur transparence. \ 55 | \ 56 | Il y a quatre configurations de clavier possibles. "Compl\'8fte" r\'8epartit deux octaves sur le clavier de l'ordinateur. Le rang commen\'8dant par WXCV et celui commen\'8dant par AZER pour les blanches et les rangs commen\'8dant par QSDF et 1234 pour les noires. "Simple" n'utilise que les rangs W... et Q... pour une seule octave. "Simple Invers\'8ee" fait la m\'90me chose mais avec le rang du haut (A... et 1...). "Compl\'8fte Invers\'8ee" inverse simplement les deux octaves jou\'8ees par la configuration "Compl\'8fte".\ 57 | \ 58 | S\'8electionner "Clavier actif \'88 l'arri\'8fre-plan" permet d'utiliser le clavier lorsqu'une autre application est au premier plan. La "configuration clavier" rentre en jeu ici. Certaines touches ne peuvent pas \'90tre utilis\'8ees comme "hotkeys"\'d1Cela varie d'une version du syst\'8fme \'88 l'autre et suivant les programmes que vous avez install\'8es. \ 59 | \ 60 | En dessous vous pouvez cocher les touches de combinaisons d\'8esir\'8ees pour activer MidiKeys lorsqu'il est \'88 l'arri\'8fre-plan. Vous devez cocher au moins une touche de combinaison. Et, avant que vous le demandiez, la fonction majuscule (Caps Lock) n'est pas support\'8ee comme touche de combinaison par le syst\'8fme, d\'8esol\'8e. \ 61 | \ 62 | Les programmes comme les s\'8equenceurs utilisant souvent la plus grosse partie de l'\'8ecran, MidiKeys a une option pour maintenir la fen\'90tre du clavier au-dessus des autres applications. Pour ce faire, cochez l'option "Clavier toujours au-dessus". Vous pouvez d\'8efinir la transparence du clavier afin de voir ce sur quoi vous travaillez tout en jouant. L'option "Opaque quand MidiKeys est \'88 l'avant-plan" supprimera la transparence chaque fois que MidiKeys sera ramen\'8e au premier plan.\ 63 | \ 64 | 65 | \f0\b\fs26 Probl\'8fmes connus\ 66 | 67 | \f1\b0\fs24 \'a5 Il semble qu'il y ait un maximum de 6 touches press\'8ees en m\'90me temps sur certains syst\'8fmes et/ou claviers, mais mon PowerBook en accepte 8.\ 68 | \'a5 Ind\'8ependamment du nombre maximum de touches simultan\'8ees, il faut environ 25 \'88 30 ms pour traiter l'envoi d'une pression de touche. Donc, si vous pressez 6 touches simultan\'8ement, il y aura une diff\'8erence d'au moins 25*6 = 150 ms entre la premi\'8fre et la derni\'8fre touche trait\'8ee. J'essayerai d'am\'8eliorer cela dans les futures versions. Le traitement des sources MIDI externes ne souffre pas de ce probl\'8fme.\ 69 | \'a5 Certaines combinaisons de touches ne peuvent pas \'90tre utilis\'8ees comme "hotkeys". Je doute que je puisse y changer quoi que ce soit.\ 70 | \'a5 Certains s\'8equenceurs ne fonctionnent pas quand ils sont \'88 l'arri\'8fre-plan. Par exemple, Intuem est apparemment dans le cas. Le seul moyen de contourner le probl\'8fme est d'utiliser les options "Midikeys toujours au-dessus" et "Clavier actif \'88 l'arri\'8fre-plan".\ 71 | \ 72 | 73 | \f0\b\fs26 Remarques diverses\ 74 | 75 | \f1\b0\fs24 Vous utilisez Midikeys \'88 vos risques et p\'8erils. Je ne suis responsable de rien de ce qui pourrait arriver \'88 vous ou \'88 votre ordinateur suite \'88 l'utilisation de MidiKeys. Si vous attrapez le syndrome du canal carpien en jouant Bach sur votre portable, c'est votre probl\'8fme.\ 76 | \ 77 | Midikeys est un gratuiciel (freeware), mais n'est pas dans le domaine public. Pour le moment, je ne pense pas rendre le code source accessible. Cela peut changer dans le futur, mais il est inutile de me le demander.\ 78 | \ 79 | Remerciements tout particuliers \'88 Richard Zelzer et Ralf Welter pour la traduction en allemand et \'88 Fr\'8ed\'8eric Ball\'8eriaux pour la localisation fran\'8daise. Si vous souhaitez voir MidiKeys dans votre langue, je serai content de le faire si vous me fournissez les traductions.\ 80 | \ 81 | Vous pouvez me contacter par mail \'88 l'adresse suivante: flit@ftml.net \ 82 | \ 83 | } -------------------------------------------------------------------------------- /docs/ReadMe.rtf: -------------------------------------------------------------------------------- 1 | {\rtf1\ansi\ansicpg1252\cocoartf1671\cocoasubrtf600 2 | \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica-Bold;\f1\fswiss\fcharset0 Helvetica;} 3 | {\colortbl;\red255\green255\blue255;} 4 | {\*\expandedcolortbl;;} 5 | \vieww12000\viewh16200\viewkind0 6 | \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\partightenfactor0 7 | 8 | \f0\b\fs32 \cf0 MidiKeys 1.9 9 | \f1\b0\fs24 \ 10 | 11 | \fs20 Copyright \'a9 2002-2019 Immo Software. 12 | \fs24 \ 13 | \ 14 | \ 15 | 16 | \f0\b\fs26 Introduction 17 | \f1\b0\fs24 \ 18 | MidiKeys is an application that presents a small graphic representation of a MIDI keyboard on screen. Clicking the keys or typing on the computer keyboard will send notes to the selected destination. You can use it to compose music with your favourite sequencer while on the road, or simply to try out a new softsynth. It's generally just a handy tool to have around.\ 19 | \ 20 | Keep in mind that MidiKeys does not itself produce any sound, it just sends note events. You have to connect it to a MIDI sound source to hear something. This can be anything from a software synthesizer to an external hardware synth connected through a USB MIDI interface.\ 21 | \ 22 | 23 | \f0\b\fs26 Requirements 24 | \f1\b0\fs24 \ 25 | \'95 Mac OS X 10.11 or greater\ 26 | \'95 64-bit Intel\ 27 | \'95 Software synthesizer, MIDI sequencer application, or external MIDI device with MIDI interface. Apple\'92s AU Lab is excellent.\ 28 | \ 29 | 30 | \f0\b\fs26 Installation 31 | \f1\b0\fs24 \ 32 | Drag MidiKeys.app to the Applications folder.\ 33 | \ 34 | 35 | \f0\b\fs26 Using MidiKeys 36 | \f1\b0\fs24 \ 37 | There are two ways use MidiKeys. First, you can set the Destination menu to "Virtual source". This is the default destination. With "Virtual source" selected, you must select "MidiKeys" as the input port in whatever other software you're using. (For example, in Ableton Live, open the preferences, select the Midi/Sync tab, and select MidiKeys in the "input source" popup menu.)\ 38 | \ 39 | The second method is to select a different destination in the "Destination" menu. Real hardware MIDI devices will be listed here, as well as virtual destinations created by other running applications. The application you are interested in using must create a virtual destination for it to be listed here.\ 40 | \ 41 | If you are using the virtual source method, some programs will require that you launch MidiKeys first in order to it to show up in their list of sources. This is likely the most common way you'll use MidiKeys. And of course, if the application does not use Apple's CoreMIDI (for example, if it uses QuickTime) then there's nothing to be done about it\'85it just won't work.\ 42 | \ 43 | MidiKeys can show the notes being played on another keyboard, or the output of a sequencer, on its keyboard. Select the desired MIDI source using the "Listen to port" popup menu in the main window. Once a source is selected, any incoming note events will highlight the keys. Notes from all channels are displayed. When the "Thru" checkbox next to the Listen to port popup is checked, any notes that are displayed on the keyboard are also output to the destination.\ 44 | \ 45 | To access lower or higher notes, use the Octave Up and Octave Down commands in the Keys menu. Up to four octaves up or down are allowed, and the current octave displacement is shown in the keyboard window by arrow symbols placed on the keyboard. There is also a "Send All Notes Off" command in the Keys menu that will send a note off command for every key. This is useful if a note gets stuck.\ 46 | \ 47 | If you want to adjust the octave from the keyboard, use the left and right arrows. The velocity is also adjustable from the keyboard, using the up and down arrows. When hot keys are enabled, the arrow keys, in combination with any modifier keys you have set in the preferences (see below), also work from other applications.\ 48 | \ 49 | 50 | \f0\b\fs26 Preferences 51 | \f1\b0\fs24 \ 52 | Open the preferences panel by selecting Preferences from the application menu. Changes are not applied until you click OK, and of course no changes are made if you click Cancel.\ 53 | \ 54 | The colour used to highlight keys when played is selected using the colour well titled "Active key highlighting". In addition to the colour, you can adjust the transparency.\ 55 | \ 56 | Several key maps comes with MidiKeys. Turn on the \'93Show Key Caps\'94 preference to have the corresponding character for each note drawn on the on-screen MIDI keyboard keys.\ 57 | \ 58 | Turning on the hot keys option will make it the MidiKeys keyboard accessible even when other applications are in front. The key map setting comes into play here. You may find that not all keys are able to be used as hot keys\'97it varies with the OS version and other software you have installed, or you may simply want to reduce the number of hot keys.\ 59 | \ 60 | The checkboxes below the hot keys checkbox allow you to select which modifier keys must be held down to access the keyboard. You may choose to use no modifiers, if you like. In this case, you will not be able to type normal text while the hot keys are enabled, though it makes playing keys much easier. Unfortunately, the alpha lock (caps lock) is not supported by the OS, sorry.\ 61 | \ 62 | In the Keys menu there is a \'93Global Hot Keys\'94 menu item that lets you easily control the state of the hot keys without having to open the preferences panel. When hot keys are enabled, this menu item will have a check mark next to it. Selecting the item will toggle the hot key state.\ 63 | \ 64 | In addition, you can set a hot key shortcut that will allow you to toggle the state of the global hot keys from any application. This toggle hot key is configured in the preferences panel, under the Keys tab. Click the area next to \'93Toggle hot keys:\'94, where it says \'93Click to record shortcut\'94. Then press the a key combination you would like to use to toggle hot keys from any application.\ 65 | \ 66 | Because programs like sequencers often take up most of the screen real estate, MidiKeys has an option to float the keyboard window above all other applications. Turn floating on by checking the "Keyboard window is always on top" checkbox. You can set the transparency of the keyboard window with the slider below so you can see what you're working on while playing. The "Opaque when MidiKeys is in front" option will bring the window back to solid when you make MidiKeys the active application. Bringing another application to the front with this option set will restore the window's transparency.\ 67 | \ 68 | Another related option is \'93Click through when not in front\'94. This option will make the keyboard window transparent to mouse clicks when MidiKeys is not the foreground application, so you can click on items and windows beneath the on-screen keyboard. This works best when the keyboard is made transparent and floating.\ 69 | \ 70 | 71 | \f0\b\fs26 Known Issues 72 | \f1\b0\fs24 \ 73 | \'95 On some laptops prior to the multi-touch trackpad, you may want to disable the \'93ignore accidental input\'94 option in the trackpad preference panel so you can use the trackpad while holding keys down. Otherwise, you won\'92t be able to twiddle knobs while playing notes.\ 74 | \'95 There seems to be a limit of 6 concurrent key presses on some desktop systems and/or keyboards. But my laptop can handle at least 8 key presses simultaneously.\ 75 | \'95 Even ignoring the hardware limit on concurrent key presses, it takes approximately 25-30 ms to process each key down event. So if you press 6 keys at once, there will be a difference of at least 25*6 = 150 ms between the first and last key processed. I will be attempting to improve this in future versions. Processing of external MIDI sources does not suffer from this problem.\ 76 | \'95 Some key combinations cannot be used as hot keys due to OS limitations or other applications having registered those hot keys.\ 77 | \'95 Some sequencer applications apparently do not process MIDI while in the background. For example, Intuem apparently does not. You must use the window floating and hot keys options to work around this.\ 78 | \ 79 | 80 | \f0\b\fs26 Source Code 81 | \f1\b0\fs24 \ 82 | MidiKeys is an open source project. Code and releases are available on GitHub at {\field{\*\fldinst{HYPERLINK "https://github.com/flit/MidiKeys"}}{\fldrslt https://github.com/flit/MidiKeys}}. Contributions are welcome. To contribute, please create a pull request on GitHub.\ 83 | \ 84 | \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\partightenfactor0 85 | 86 | \f0\b\fs26 \cf0 License 87 | \f1\b0\fs24 \ 88 | \pard\pardeftab720\partightenfactor0 89 | \cf0 Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.\ 90 | You may obtain a copy of the License at\ 91 | \ 92 | {\field{\*\fldinst{HYPERLINK "http://www.apache.org/licenses/LICENSE-2.0"}}{\fldrslt http://www.apache.org/licenses/LICENSE-2.0}}\ 93 | \ 94 | Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\ 95 | See the License for the specific language governing permissions and limitations under the License.\ 96 | \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\partightenfactor0 97 | \cf0 \ 98 | \ 99 | } -------------------------------------------------------------------------------- /img/midikeys_screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flit/MidiKeys/19374d8a294653211d4f5037c41fae94d84781ba/img/midikeys_screen.png -------------------------------------------------------------------------------- /version_history.md: -------------------------------------------------------------------------------- 1 | ### Version 1.9.1 2 | - Support for macOS 11.0 Big Sur. 3 | - Universal binary with support for Apple Silicon (AArch64). 4 | - Fixed issue #8 by displaying C4 for MIDI note 60. 5 | 6 | ### Version 1.9 7 | - MidiKeys is now 64-bit compliant. (And no longer a universal binary.) 8 | - Minimum system version is 10.11. 9 | - Keys window is resizable (probably the most asked-for feature request). 10 | - Support for system dark mode, including a dark mode keyboard. A "force light keyboard" preference is visible to allow you to revert the keyboard to a traditional appearance. 11 | - Added Clear Stuck Keys command. 12 | - On systems with a trackpad or mouse that reports pressure, MidiKeys will send channel aftertouch when keys are clicked and held. 13 | - New "show C notes" feature that draws "Cn" where "n" is the octave (i.e., C3, C4, etc) on the keyboard. 14 | - Fixed an issue with key caps where certain keys like tab and delete were not shown; they will now appear as the standard key icons. 15 | - Restored and updated German and French localisations. 16 | - Changed version update feed URL to https. 17 | - Updated Sparkle and ShortcutRecorder frameworks to modern versions. 18 | 19 | ### Version 1.8 20 | - MidiKeys is now a universal binary. 21 | - Minimum system is now 10.5. 22 | - Changed ownership to Immo Software. 23 | - New configurable hot key to toggle global hot keys. 24 | - Support for automatic software updates using the Sparkle framework. 25 | - New option to show the key caps on the on-screen keyboard. 26 | - The MIDI channel field has been changed to a pop-up menu. 27 | - The disclosure button to show the destination and listen menus is now a normal button instead of being a repurposed toolbar toggle button. 28 | - Pressed key highlights are drawn with a slight gradient. 29 | - New Global Hot Keys menu item. 30 | - New preferences to control the visibility of overlay notifications. 31 | - It is now possible to have no modifier key for global hot keys, so you only have to press the key corresponding to the note. 32 | - Key maps were extended to use more keys on the keyboard. 33 | - Non-English localisations have been disabled for this release due to the number of UI changes. 34 | - Added a preference to make the keyboard window transparent to mouse clicks when MidiKeys is in the background. 35 | - Made the keyboard window minimizable. 36 | - Reorganized the preferences window with several tabs. 37 | - Added preferences to control software updates. 38 | 39 | ### Version 1.7b1 40 | - Support for 10.4. 41 | 42 | ### Version 1.6b3 43 | - Increased the octave offset range to -4 through +4 to encompass more MIDI notes 44 | - Added Spanish localisation 45 | - MIDI through should work now (it works on my system) 46 | 47 | ### Version 1.6b2 48 | - The previous beta accidentally had all but the Japanese localisations included but turned off. 49 | - Fixed a bug where the velocity hotkey could get stuck. 50 | - Updated the LiesMich and Lisez-Moi. 51 | 52 | ### Version 1.6b1 53 | - Added a button to the keyboard window's title bar that will hide and show the MIDI options (destination and source). 54 | - The octave offset is shown visually through up and down arrow icons. 55 | - Added a MIDI through option for the source. (May be broken in this release.) 56 | - New icon! This one is much better. To see it, you have to log out and log back in. 57 | - French and Japanese localisations. 58 | - A preference to make the keyboard window opaque when MidiKeys is the frontmost application. 59 | - The keyboard window will not float above other windows while the Preferences panel is open. 60 | - Added Full Reversed and Upper Single keymaps. 61 | - Added Send All Notes Off command to Keys menu. 62 | - The left and right arrow keys in combination with the modifier keys set in the preferences now work as hot keys for octave up and octave down. 63 | - Similiarly, the up and down arrow keys are hot keys for increasing and decreasing the velocity. 64 | - Added a "None" option to the Listen to port popup menu. 65 | - Fixed the black keys, the number keys on the computer keyboard, for the upper octave of the Full keymap. 66 | 67 | ### Version 1.5 68 | - Added preferences panel. 69 | - Global hot keys option. 70 | - Option to float window above all applications. 71 | - Changed how keypresses are detected, so it works with non-US keyboards. 72 | - Added German localisation. 73 | - Supports clicking on the keyboard! 74 | - Many more new features and changes... 75 | 76 | ### Version 1.1.1 77 | - Fixed a problem with the name of the first destination in the destination popup. 78 | 79 | ### Version 1.1 80 | - Changed to textured window style. 81 | - Added destination menu. 82 | - Saves source and destination in prefs. 83 | - Saves window position in prefs. 84 | - Fixed many bugs. 85 | 86 | ### Version 1.0.1 87 | - Oops! I forgot to support NoteOff events, since the controller I was testing with, an Oxygen8, sends NoteOn with velocity instead. 88 | --------------------------------------------------------------------------------