├── .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 | 
2 |
3 | MidiKeys
4 | ==========
5 |
6 | macOS application that presents an on-screen MIDI keyboard.
7 |
8 | 
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 |
53 |
54 |
55 |
56 |
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 |
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 |
53 |
54 |
55 |
56 |
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 |
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 |
53 |
54 |
55 |
56 |
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 |
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 |
--------------------------------------------------------------------------------