From 68a3cf417e4c89c90abaaafd4b734a6887262b34 Mon Sep 17 00:00:00 2001 From: Chris Reed Date: Fri, 5 Dec 2014 20:41:34 -0600 Subject: [PATCH] Initial commit of version 1.8. --- .gitignore | 87 + AppController.h | 146 + AppController.m | 1297 +++++++ CTGradient.h | 54 + CTGradient.m | 773 ++++ ColourDefaults.h | 18 + ColourDefaults.m | 37 + EndpointDefaults.h | 18 + EndpointDefaults.m | 46 + English.lproj/Credits.html | 56 + English.lproj/InfoPlist.strings | Bin 0 -> 532 bytes English.lproj/KeyMapNames.strings | Bin 0 -> 218 bytes English.lproj/Localizable.strings | Bin 0 -> 3436 bytes English.lproj/MainMenu.xib | 3109 +++++++++++++++++ English.lproj/Preferences.xib | 2137 +++++++++++ English.lproj/ReadMe.rtf | 78 + French.lproj/Credits.html | 40 + French.lproj/InfoPlist.strings | Bin 0 -> 540 bytes French.lproj/KeyMapNames.strings | Bin 0 -> 240 bytes French.lproj/Lisez-Moi.rtf | 83 + French.lproj/Localizable.strings | Bin 0 -> 1474 bytes French.lproj/MainMenu.xib | 2806 +++++++++++++++ French.lproj/Preferences.xib | 1271 +++++++ German.lproj/Credits.html | 40 + German.lproj/InfoPlist.strings | Bin 0 -> 548 bytes German.lproj/KeyMapNames.strings | Bin 0 -> 240 bytes German.lproj/Localizable.strings | Bin 0 -> 4010 bytes German.lproj/MainMenu.xib | 2794 +++++++++++++++ German.lproj/Preferences.xib | 1230 +++++++ Japanese.lproj/Credits.html | 40 + Japanese.lproj/InfoPlist.strings | Bin 0 -> 540 bytes Japanese.lproj/KeyMapNames.strings | Bin 0 -> 198 bytes Japanese.lproj/Localizable.strings | Bin 0 -> 1184 bytes Japanese.lproj/MainMenu.xib | 2804 +++++++++++++++ Japanese.lproj/Preferences.xib | 1275 +++++++ KeyMapManager.h | 29 + KeyMapManager.m | 110 + KeyMaps.plist | 195 ++ LICENSE | 26 + LiesMich.rtf | 94 + Lisez-Moi.rtf | 83 + MidiKeyMap.h | 47 + MidiKeyMap.m | 280 ++ MidiKeyView.h | 76 + MidiKeyView.m | 550 +++ MidiKeys-Info.plist | 42 + MidiKeys.icns | Bin 0 -> 45925 bytes MidiKeys.xcodeproj/creed.mode1 | 1476 ++++++++ MidiKeys.xcodeproj/creed.mode1v3 | 1528 ++++++++ MidiKeys.xcodeproj/creed.pbxuser | 1592 +++++++++ MidiKeys.xcodeproj/creed.perspective | 1449 ++++++++ MidiKeys.xcodeproj/project.pbxproj | 570 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/MidiKeys.xccheckout | 46 + .../WorkspaceSettings.xcsettings | 10 + .../xcschemes/MidiKeys.xcscheme | 80 + .../xcschemes/xcschememanagement.plist | 22 + MidiKeysApplication.h | 22 + MidiKeysApplication.m | 76 + MidiKeys_Prefix.h | 2 + MidiParser.h | 29 + MidiParser.m | 176 + Octave.png | Bin 0 -> 1364 bytes OctaveDown.png | Bin 0 -> 1771 bytes OctaveUp.png | Bin 0 -> 1803 bytes OverlayIndicator.h | 51 + OverlayIndicator.m | 273 ++ Preferences.h | 65 + PreferencesController.h | 57 + PreferencesController.m | 245 ++ README.md | 4 + ReadMe (Japanese).rtf | 245 ++ ReadMe.rtf | 86 + ShortcutRecorder/SRCommon.h | 185 + ShortcutRecorder/SRCommon.m | 419 +++ ShortcutRecorder/SRKeyCodeTransformer.h | 16 + ShortcutRecorder/SRKeyCodeTransformer.m | 241 ++ ShortcutRecorder/SRRecorderCell.h | 137 + ShortcutRecorder/SRRecorderCell.m | 1340 +++++++ ShortcutRecorder/SRRecorderControl.h | 79 + ShortcutRecorder/SRRecorderControl.m | 386 ++ ShortcutRecorder/SRValidator.h | 34 + ShortcutRecorder/SRValidator.m | 258 ++ .../ShortcutRecorder.framework/Headers | 1 + .../ShortcutRecorder.framework/Resources | 1 + .../ShortcutRecorder | 1 + .../Versions/A/Headers/SRCommon.h | 185 + .../Versions/A/Headers/SRKeyCodeTransformer.h | 16 + .../Versions/A/Headers/SRRecorderCell.h | 137 + .../Versions/A/Headers/SRRecorderControl.h | 79 + .../Versions/A/Headers/SRValidator.h | 34 + .../Versions/A/Headers/SR_LeopardView.h | 15 + .../Versions/A/Headers/ShortcutRecorder.h | 17 + .../Versions/A/Resources/Info.plist | 36 + .../Versions/A/ShortcutRecorder | Bin 0 -> 254644 bytes .../Versions/Current | 1 + .../Contents/Info.plist | 42 + .../Contents/MacOS/ShortcutRecorder | Bin 0 -> 54484 bytes .../Resources/English.lproj/InfoPlist.strings | Bin 0 -> 270 bytes .../English.lproj/SR_LeopardInspector.nib | Bin 0 -> 10173 bytes .../English.lproj/SR_LeopardLibrary.nib | Bin 0 -> 4904 bytes .../SRRecorderControl.classdescription | 9 + Spanish.lproj/Credits.html | 1 + Spanish.lproj/InfoPlist.strings | Bin 0 -> 560 bytes Spanish.lproj/KeyMapNames.strings | Bin 0 -> 242 bytes Spanish.lproj/Localizable.strings | Bin 0 -> 1350 bytes Spanish.lproj/MainMenu.xib | 2802 +++++++++++++++ Spanish.lproj/Preferences.xib | 1267 +++++++ Sparkle.framework/Headers | 1 + Sparkle.framework/Resources | 1 + Sparkle.framework/Sparkle | 1 + .../Versions/A/Headers/SUAppcast.h | 33 + .../Versions/A/Headers/SUAppcastItem.h | 47 + .../Versions/A/Headers/SUUpdater.h | 118 + .../A/Headers/SUVersionComparisonProtocol.h | 27 + .../Versions/A/Headers/Sparkle.h | 21 + .../Versions/A/Resources/Info.plist | 24 + .../Versions/A/Resources/License.txt | 7 + .../A/Resources/SUModelTranslation.plist | 174 + .../A/Resources/SUStatus.nib/classes.nib | 56 + .../A/Resources/SUStatus.nib/info.nib | 20 + .../A/Resources/SUStatus.nib/keyedobjects.nib | Bin 0 -> 7344 bytes .../SUAutomaticUpdateAlert.nib/classes.nib | 50 + .../SUAutomaticUpdateAlert.nib/info.nib | 20 + .../keyedobjects.nib | Bin 0 -> 7278 bytes .../de.lproj/SUUpdateAlert.nib/classes.nib | 67 + .../de.lproj/SUUpdateAlert.nib/info.nib | 20 + .../SUUpdateAlert.nib/keyedobjects.nib | Bin 0 -> 10493 bytes .../SUUpdatePermissionPrompt.nib/classes.nib | 59 + .../SUUpdatePermissionPrompt.nib/info.nib | 20 + .../keyedobjects.nib | Bin 0 -> 13189 bytes .../A/Resources/de.lproj/Sparkle.strings | Bin 0 -> 9806 bytes .../SUAutomaticUpdateAlert.nib/classes.nib | 50 + .../SUAutomaticUpdateAlert.nib/info.nib | 20 + .../keyedobjects.nib | Bin 0 -> 7148 bytes .../en.lproj/SUUpdateAlert.nib/classes.nib | 67 + .../en.lproj/SUUpdateAlert.nib/info.nib | 20 + .../SUUpdateAlert.nib/keyedobjects.nib | Bin 0 -> 10623 bytes .../SUUpdatePermissionPrompt.nib/classes.nib | 59 + .../SUUpdatePermissionPrompt.nib/info.nib | 21 + .../keyedobjects.nib | Bin 0 -> 13263 bytes .../A/Resources/en.lproj/Sparkle.strings | Bin 0 -> 8216 bytes .../SUAutomaticUpdateAlert.nib/classes.nib | 50 + .../SUAutomaticUpdateAlert.nib/info.nib | 20 + .../keyedobjects.nib | Bin 0 -> 7273 bytes .../es.lproj/SUUpdateAlert.nib/classes.nib | 67 + .../es.lproj/SUUpdateAlert.nib/info.nib | 20 + .../SUUpdateAlert.nib/keyedobjects.nib | Bin 0 -> 10668 bytes .../SUUpdatePermissionPrompt.nib/classes.nib | 59 + .../SUUpdatePermissionPrompt.nib/info.nib | 20 + .../keyedobjects.nib | Bin 0 -> 13404 bytes .../A/Resources/es.lproj/Sparkle.strings | Bin 0 -> 8020 bytes .../SUAutomaticUpdateAlert.nib/classes.nib | 50 + .../SUAutomaticUpdateAlert.nib/info.nib | 16 + .../keyedobjects.nib | Bin 0 -> 7245 bytes .../fr.lproj/SUUpdateAlert.nib/classes.nib | 67 + .../fr.lproj/SUUpdateAlert.nib/info.nib | 16 + .../SUUpdateAlert.nib/keyedobjects.nib | Bin 0 -> 10338 bytes .../SUUpdatePermissionPrompt.nib/classes.nib | 59 + .../SUUpdatePermissionPrompt.nib/info.nib | 16 + .../keyedobjects.nib | Bin 0 -> 13156 bytes .../A/Resources/fr.lproj/Sparkle.strings | Bin 0 -> 8554 bytes .../SUAutomaticUpdateAlert.nib/classes.nib | 50 + .../SUAutomaticUpdateAlert.nib/info.nib | 20 + .../keyedobjects.nib | Bin 0 -> 7161 bytes .../it.lproj/SUUpdateAlert.nib/classes.nib | 67 + .../it.lproj/SUUpdateAlert.nib/info.nib | 20 + .../SUUpdateAlert.nib/keyedobjects.nib | Bin 0 -> 10360 bytes .../SUUpdatePermissionPrompt.nib/classes.nib | 59 + .../SUUpdatePermissionPrompt.nib/info.nib | 20 + .../keyedobjects.nib | Bin 0 -> 12659 bytes .../A/Resources/it.lproj/Sparkle.strings | Bin 0 -> 8914 bytes .../SUAutomaticUpdateAlert.nib/classes.nib | 50 + .../SUAutomaticUpdateAlert.nib/info.nib | 18 + .../keyedobjects.nib | Bin 0 -> 7234 bytes .../nl.lproj/SUUpdateAlert.nib/classes.nib | 67 + .../nl.lproj/SUUpdateAlert.nib/info.nib | 16 + .../SUUpdateAlert.nib/keyedobjects.nib | Bin 0 -> 10220 bytes .../SUUpdatePermissionPrompt.nib/classes.nib | 59 + .../SUUpdatePermissionPrompt.nib/info.nib | 16 + .../keyedobjects.nib | Bin 0 -> 12535 bytes .../A/Resources/nl.lproj/Sparkle.strings | Bin 0 -> 8514 bytes .../Versions/A/Resources/relaunch | Bin 0 -> 58924 bytes .../SUAutomaticUpdateAlert.nib/classes.nib | 50 + .../SUAutomaticUpdateAlert.nib/info.nib | 20 + .../keyedobjects.nib | Bin 0 -> 7675 bytes .../ru.lproj/SUUpdateAlert.nib/classes.nib | 67 + .../ru.lproj/SUUpdateAlert.nib/info.nib | 20 + .../SUUpdateAlert.nib/keyedobjects.nib | Bin 0 -> 10895 bytes .../SUUpdatePermissionPrompt.nib/classes.nib | 59 + .../SUUpdatePermissionPrompt.nib/info.nib | 18 + .../keyedobjects.nib | Bin 0 -> 12898 bytes .../A/Resources/ru.lproj/Sparkle.strings | Bin 0 -> 8364 bytes .../SUAutomaticUpdateAlert.nib/classes.nib | 50 + .../SUAutomaticUpdateAlert.nib/info.nib | 20 + .../keyedobjects.nib | Bin 0 -> 7474 bytes .../sv.lproj/SUUpdateAlert.nib/classes.nib | 39 + .../sv.lproj/SUUpdateAlert.nib/info.nib | 18 + .../SUUpdateAlert.nib/keyedobjects.nib | Bin 0 -> 10180 bytes .../SUUpdatePermissionPrompt.nib/classes.nib | 59 + .../SUUpdatePermissionPrompt.nib/info.nib | 20 + .../keyedobjects.nib | Bin 0 -> 13483 bytes .../A/Resources/sv.lproj/Sparkle.strings | Bin 0 -> 8142 bytes Sparkle.framework/Versions/A/Sparkle | Bin 0 -> 463540 bytes Sparkle.framework/Versions/Current | 1 + ToDo.ooutline | 1108 ++++++ Version history.rtf | 119 + dsa_pub.pem | 20 + main.m | 14 + sv.lproj/Localizable.strings | Bin 0 -> 2502 bytes 210 files changed, 41248 insertions(+) create mode 100644 .gitignore create mode 100644 AppController.h create mode 100644 AppController.m create mode 100644 CTGradient.h create mode 100644 CTGradient.m create mode 100644 ColourDefaults.h create mode 100644 ColourDefaults.m create mode 100644 EndpointDefaults.h create mode 100644 EndpointDefaults.m create mode 100644 English.lproj/Credits.html create mode 100644 English.lproj/InfoPlist.strings create mode 100644 English.lproj/KeyMapNames.strings create mode 100644 English.lproj/Localizable.strings create mode 100644 English.lproj/MainMenu.xib create mode 100644 English.lproj/Preferences.xib create mode 100644 English.lproj/ReadMe.rtf create mode 100644 French.lproj/Credits.html create mode 100644 French.lproj/InfoPlist.strings create mode 100644 French.lproj/KeyMapNames.strings create mode 100644 French.lproj/Lisez-Moi.rtf create mode 100644 French.lproj/Localizable.strings create mode 100644 French.lproj/MainMenu.xib create mode 100644 French.lproj/Preferences.xib create mode 100644 German.lproj/Credits.html create mode 100644 German.lproj/InfoPlist.strings create mode 100644 German.lproj/KeyMapNames.strings create mode 100644 German.lproj/Localizable.strings create mode 100644 German.lproj/MainMenu.xib create mode 100644 German.lproj/Preferences.xib create mode 100644 Japanese.lproj/Credits.html create mode 100644 Japanese.lproj/InfoPlist.strings create mode 100644 Japanese.lproj/KeyMapNames.strings create mode 100644 Japanese.lproj/Localizable.strings create mode 100644 Japanese.lproj/MainMenu.xib create mode 100644 Japanese.lproj/Preferences.xib create mode 100644 KeyMapManager.h create mode 100644 KeyMapManager.m create mode 100644 KeyMaps.plist create mode 100644 LICENSE create mode 100644 LiesMich.rtf create mode 100644 Lisez-Moi.rtf create mode 100644 MidiKeyMap.h create mode 100644 MidiKeyMap.m create mode 100644 MidiKeyView.h create mode 100644 MidiKeyView.m create mode 100644 MidiKeys-Info.plist create mode 100644 MidiKeys.icns create mode 100644 MidiKeys.xcodeproj/creed.mode1 create mode 100644 MidiKeys.xcodeproj/creed.mode1v3 create mode 100644 MidiKeys.xcodeproj/creed.pbxuser create mode 100644 MidiKeys.xcodeproj/creed.perspective create mode 100644 MidiKeys.xcodeproj/project.pbxproj create mode 100644 MidiKeys.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 MidiKeys.xcodeproj/project.xcworkspace/xcshareddata/MidiKeys.xccheckout create mode 100644 MidiKeys.xcodeproj/project.xcworkspace/xcuserdata/creed.xcuserdatad/WorkspaceSettings.xcsettings create mode 100644 MidiKeys.xcodeproj/xcuserdata/creed.xcuserdatad/xcschemes/MidiKeys.xcscheme create mode 100644 MidiKeys.xcodeproj/xcuserdata/creed.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 MidiKeysApplication.h create mode 100644 MidiKeysApplication.m create mode 100644 MidiKeys_Prefix.h create mode 100644 MidiParser.h create mode 100644 MidiParser.m create mode 100644 Octave.png create mode 100644 OctaveDown.png create mode 100644 OctaveUp.png create mode 100644 OverlayIndicator.h create mode 100644 OverlayIndicator.m create mode 100644 Preferences.h create mode 100644 PreferencesController.h create mode 100644 PreferencesController.m create mode 100644 README.md create mode 100644 ReadMe (Japanese).rtf create mode 100644 ReadMe.rtf create mode 100644 ShortcutRecorder/SRCommon.h create mode 100644 ShortcutRecorder/SRCommon.m create mode 100644 ShortcutRecorder/SRKeyCodeTransformer.h create mode 100644 ShortcutRecorder/SRKeyCodeTransformer.m create mode 100644 ShortcutRecorder/SRRecorderCell.h create mode 100644 ShortcutRecorder/SRRecorderCell.m create mode 100644 ShortcutRecorder/SRRecorderControl.h create mode 100644 ShortcutRecorder/SRRecorderControl.m create mode 100644 ShortcutRecorder/SRValidator.h create mode 100644 ShortcutRecorder/SRValidator.m create mode 120000 ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Headers create mode 120000 ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Resources create mode 120000 ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/ShortcutRecorder create mode 100644 ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Versions/A/Headers/SRCommon.h create mode 100644 ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Versions/A/Headers/SRKeyCodeTransformer.h create mode 100644 ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Versions/A/Headers/SRRecorderCell.h create mode 100644 ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Versions/A/Headers/SRRecorderControl.h create mode 100644 ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Versions/A/Headers/SRValidator.h create mode 100644 ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Versions/A/Headers/SR_LeopardView.h create mode 100644 ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Versions/A/Headers/ShortcutRecorder.h create mode 100644 ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Versions/A/Resources/Info.plist create mode 100755 ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Versions/A/ShortcutRecorder create mode 120000 ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Versions/Current create mode 100644 ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Info.plist create mode 100755 ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/MacOS/ShortcutRecorder create mode 100644 ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Resources/English.lproj/InfoPlist.strings create mode 100644 ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Resources/English.lproj/SR_LeopardInspector.nib create mode 100644 ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Resources/English.lproj/SR_LeopardLibrary.nib create mode 100755 ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Resources/SRRecorderControl.classdescription create mode 100755 Spanish.lproj/Credits.html create mode 100755 Spanish.lproj/InfoPlist.strings create mode 100755 Spanish.lproj/KeyMapNames.strings create mode 100755 Spanish.lproj/Localizable.strings create mode 100644 Spanish.lproj/MainMenu.xib create mode 100644 Spanish.lproj/Preferences.xib create mode 120000 Sparkle.framework/Headers create mode 120000 Sparkle.framework/Resources create mode 120000 Sparkle.framework/Sparkle create mode 100644 Sparkle.framework/Versions/A/Headers/SUAppcast.h create mode 100644 Sparkle.framework/Versions/A/Headers/SUAppcastItem.h create mode 100644 Sparkle.framework/Versions/A/Headers/SUUpdater.h create mode 100644 Sparkle.framework/Versions/A/Headers/SUVersionComparisonProtocol.h create mode 100644 Sparkle.framework/Versions/A/Headers/Sparkle.h create mode 100644 Sparkle.framework/Versions/A/Resources/Info.plist create mode 100644 Sparkle.framework/Versions/A/Resources/License.txt create mode 100644 Sparkle.framework/Versions/A/Resources/SUModelTranslation.plist create mode 100644 Sparkle.framework/Versions/A/Resources/SUStatus.nib/classes.nib create mode 100644 Sparkle.framework/Versions/A/Resources/SUStatus.nib/info.nib create mode 100644 Sparkle.framework/Versions/A/Resources/SUStatus.nib/keyedobjects.nib create mode 100644 Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/classes.nib create mode 100644 Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/info.nib create mode 100644 Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib create mode 100644 Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib/classes.nib create mode 100644 Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib/info.nib create mode 100644 Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib/keyedobjects.nib create mode 100644 Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib/classes.nib create mode 100644 Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib/info.nib create mode 100644 Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib create mode 100644 Sparkle.framework/Versions/A/Resources/de.lproj/Sparkle.strings create mode 100644 Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/classes.nib create mode 100644 Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/info.nib create mode 100644 Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib create mode 100644 Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/classes.nib create mode 100644 Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/info.nib create mode 100644 Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/keyedobjects.nib create mode 100644 Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib/classes.nib create mode 100644 Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib/info.nib create mode 100644 Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib create mode 100644 Sparkle.framework/Versions/A/Resources/en.lproj/Sparkle.strings create mode 100644 Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/classes.nib create mode 100644 Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/info.nib create mode 100644 Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib create mode 100644 Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib/classes.nib create mode 100644 Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib/info.nib create mode 100644 Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib/keyedobjects.nib create mode 100644 Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib/classes.nib create mode 100644 Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib/info.nib create mode 100644 Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib create mode 100644 Sparkle.framework/Versions/A/Resources/es.lproj/Sparkle.strings create mode 100644 Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/classes.nib create mode 100644 Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/info.nib create mode 100644 Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib create mode 100644 Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib/classes.nib create mode 100644 Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib/info.nib create mode 100644 Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib/keyedobjects.nib create mode 100644 Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/classes.nib create mode 100644 Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/info.nib create mode 100644 Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib create mode 100644 Sparkle.framework/Versions/A/Resources/fr.lproj/Sparkle.strings create mode 100644 Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/classes.nib create mode 100644 Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/info.nib create mode 100644 Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib create mode 100644 Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib/classes.nib create mode 100644 Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib/info.nib create mode 100644 Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib/keyedobjects.nib create mode 100644 Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib/classes.nib create mode 100644 Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib/info.nib create mode 100644 Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib create mode 100644 Sparkle.framework/Versions/A/Resources/it.lproj/Sparkle.strings create mode 100644 Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/classes.nib create mode 100644 Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/info.nib create mode 100644 Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib create mode 100644 Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/classes.nib create mode 100644 Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/info.nib create mode 100644 Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/keyedobjects.nib create mode 100644 Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/classes.nib create mode 100644 Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/info.nib create mode 100644 Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib create mode 100644 Sparkle.framework/Versions/A/Resources/nl.lproj/Sparkle.strings create mode 100755 Sparkle.framework/Versions/A/Resources/relaunch create mode 100644 Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/classes.nib create mode 100644 Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/info.nib create mode 100644 Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib create mode 100644 Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib/classes.nib create mode 100644 Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib/info.nib create mode 100644 Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib/keyedobjects.nib create mode 100644 Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/classes.nib create mode 100644 Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/info.nib create mode 100644 Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib create mode 100644 Sparkle.framework/Versions/A/Resources/ru.lproj/Sparkle.strings create mode 100644 Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/classes.nib create mode 100644 Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/info.nib create mode 100644 Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib create mode 100644 Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/classes.nib create mode 100644 Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/info.nib create mode 100644 Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/keyedobjects.nib create mode 100644 Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/classes.nib create mode 100644 Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/info.nib create mode 100644 Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib create mode 100644 Sparkle.framework/Versions/A/Resources/sv.lproj/Sparkle.strings create mode 100755 Sparkle.framework/Versions/A/Sparkle create mode 120000 Sparkle.framework/Versions/Current create mode 100644 ToDo.ooutline create mode 100644 Version history.rtf create mode 100644 dsa_pub.pem create mode 100644 main.m create mode 100644 sv.lproj/Localizable.strings diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..702e885 --- /dev/null +++ b/.gitignore @@ -0,0 +1,87 @@ +# +# NOTE! Don't add files that are generated in specific +# subdirectories here. Add them in the ".gitignore" file +# in that subdirectory instead. +# +# NOTE! Please use 'git-ls-files -i --exclude-standard' +# command after changing this file, to see if there are +# any tracked files which get ignored after the change. +# +# Normal rules +# +*.o +*.o.* +*.a +*.ko +*.so +*.so.dbg +*.mod.c +*.i +*.lst +*.symtypes +*.order +*.elf +*.bin +*.gz +._* +.DS_Store + +# +# Top-level generic files +# +release +*_release +tags +TAGS +vmlinux +System.map +Module.markers +Module.symvers +!.gitignore +!.mailmap + +# +# Generated include files +# + +# stgit generated dirs +patches-* + +# quilt's files +patches +series +*.patch + +# cscope files +cscope.* +ncscope.* + +*.orig +*~ +\#*# +workspace +.BUILD* +~* + +# Windows project stuff +*.suo +*.sdf +*.opensdf + +# Xcode user state +*.xcbkptlist +*.xcuserstate + +# Python bytecode +*.pyc +__pycache__ + +# IAR temp files +EW*.tmp + + +.svn +Build +build + + diff --git a/AppController.h b/AppController.h new file mode 100644 index 0000000..c5af6c5 --- /dev/null +++ b/AppController.h @@ -0,0 +1,146 @@ +// +// AppController.h +// MidiKeys +// +// Created by Chris Reed on Tue Oct 15 2002. +// Copyright (c) 2002-2003 Chris Reed. All rights reserved. +// + +#import +#import +#import + +@class MidiKeyView; +@class KeyMapManager; +@class MidiKeyMap; +@class OverlayIndicator; + +//! The name we use for our CoreMIDI client and virtual source +#define kMyClientName CFSTR("MidiKeys") + +//! Name of the octave up overlay image. +#define kOctaveUpOverlayImage @"OctaveUp" + +//! Name of the octave down overlay image. +#define kOctaveDownOverlayImage @"OctaveDown" + +//! \name Keycodes for arrow keys +//@{ +#define kRightArrowKeycode 124 +#define kLeftArrowKeycode 123 +#define kUpArrowKeycode 126 +#define kDownArrowKeycode 125 +//@} + +//! Direction of velocity adjustment. +enum _velocity_up_or_down +{ + kVelocityUp, + kVelocityDown +}; + +/*! + * @brief Main controller class for Midi Keys. + * + * Manages the keyboard window, all MIDI events, hot keys, menu items, and pretty much every + * thing else except for preferences. + */ +@interface AppController : NSObject +{ + IBOutlet NSPopUpButton *destinationPopup; + IBOutlet NSPopUpButton *sourcePopup; + IBOutlet MidiKeyView *midiKeys; + IBOutlet NSSlider *velocitySlider; + IBOutlet NSPopUpButton * channelPopup; + IBOutlet KeyMapManager *keyMapManager; + IBOutlet NSView *toggleView; + IBOutlet NSView *hiddenItemsView; + IBOutlet NSButton *midiThruCheckbox; + IBOutlet NSMenuItem * _toggleHotKeysMenuItem; + + MIDIClientRef clientRef; + MIDIPortRef outputPort; + MIDIPortRef inputPort; + MIDIEndpointRef virtualSourceEndpoint; + MIDIUniqueID virtualSourceUID; + MIDIEndpointRef selectedSource; + BOOL isSourceConnected; + MIDIEndpointRef selectedDestination; + BOOL isDestinationConnected; // if YES, we're not using the virtual source + BOOL performMidiThru; + float currentVelocity; + float maxVelocity; + int currentChannel; + int octaveOffset; + MidiKeyMap *keyMap; + EventHotKeyRef _toggleHotKeyRef; + EventHotKeyRef octaveUpHotKeyRef; + EventHotKeyRef octaveDownHotKeyRef; + EventHotKeyRef velocityUpHotKeyRef; + EventHotKeyRef velocityDownHotKeyRef; + BOOL hotKeysAreRegistered; + BOOL makeWindowSolidWhenOnTop; + BOOL isWindowToggled; + float toggleDelta; + NSTimer *velocityHotKeyTimer; + OverlayIndicator *_indicator; +// NSStatusItem * _hotKeysStatusItem; +} + +- (IBAction)destinationSelected:(id)sender; +- (IBAction)sourceSelected:(id)sender; +- (IBAction)velocitySliderChanged:(id)sender; +- (IBAction)channelDidChange:(id)sender; +- (IBAction)toggleMidiThru:(id)sender; +- (IBAction)toggleMidiControls:(id)sender; +- (IBAction)octaveUp:(id)sender; +- (IBAction)octaveDown:(id)sender; + +@end + +@interface AppController (HotKeys) + +- (IBAction)toggleHotKeys:(id)sender; +- (void)enableHotKeys; +- (void)disableHotKeys; + +- (void)registerOctaveHotKeysWithModifiers:(int)modifiers; +- (void)unregisterOctaveHotKeys; + +- (void)handleVelocityKeyPressedUpOrDown:(int)upOrDown; +- (void)velocityHotKeyTimerFired:(NSTimer *)timer; +- (void)handleVelocityKeyReleased; + +- (void)hotKeyPressed:(UInt32)identifier; +- (void)hotKeyReleased:(UInt32)identifier; + +- (void)registerToggleHotKey; +- (void)unregisterToggleHotKey; + +- (void)registerHotKeys; +- (void)unregisterHotKeys; + +- (void)displayHotKeysOverlay; + +@end + +@interface AppController (MIDI) + +- (NSString *)nameForMidiEndpoint:(MIDIEndpointRef)theEndpoint; + +// use vel=0 for off +- (void)sendMidiNote:(int)midiNote channel:(int)channel velocity:(int)velocity; +- (void)handleMidiNotification:(const MIDINotification *)message; +- (void)receiveMidiPacketList:(const MIDIPacketList *)packetList; + +- (void)adjustVelocity:(float)delta; + +- (IBAction)sendAllNotesOff:(id)sender; + +- (NSString *)characterForMidiNote:(int)note; + +@end + +void MyNotifyProc(const MIDINotification *message, void *refCon); +void MyMidiReadProc(const MIDIPacketList *pktlist, void *refCon, void *connRefCon); + diff --git a/AppController.m b/AppController.m new file mode 100644 index 0000000..34ea228 --- /dev/null +++ b/AppController.m @@ -0,0 +1,1297 @@ +// +// AppController.m +// MidiKeys +// +// Created by Chris Reed on Tue Oct 15 2002. +// Copyright (c) 2002-2003 Chris Reed. All rights reserved. +// + +#import "AppController.h" +#import "MidiKeyView.h" +#import "EndpointDefaults.h" +#import "ColourDefaults.h" +#import "KeyMapManager.h" +#import "MidiKeyMap.h" +#import "PreferencesController.h" +#import "MidiParser.h" +#import "OverlayIndicator.h" +#import + +#define MAX_OCTAVE_OFFSET (4) +#define MIN_OCTAVE_OFFSET (-4) + +@interface AppController () + +- (void)setupRegisteredDefaults; + +- (void)applicationWillFinishLaunching:(NSNotification *)notification; +- (void)applicationDidFinishLaunching:(NSNotification *)notification; +- (void)applicationWillTerminate:(NSNotification *)notification; +- (void)applicationDidBecomeActive:(NSNotification *)notification; +- (void)applicationDidResignActive:(NSNotification *)notification; + +- (void)windowWillClose:(NSNotification *)notification; + +- (BOOL)validateMenuItem:(NSMenuItem *)menuItem; + +- (NSString *)uniqueTitle:(NSString *)title forMenu:(NSMenu *)menu; +- (void)updateDestinationMenu; +- (void)updateSourceMenu; + +- (void)setWindowLevelFromPreferences; +- (void)preferencesDidChange:(NSNotification *)notification; + +- (void)setClickThrough:(BOOL)clickThrough; + +- (void)toggleMidiControls:(id)sender; + +- (float)overlayTimeout; +- (void)overlayIndicatorDidClose:(OverlayIndicator *)theIndicator; + +@end + +@implementation AppController + +- (void)dealloc +{ + [_indicator close]; + [keyMap release]; + MIDIPortDispose(outputPort); + MIDIPortDispose(inputPort); + MIDIEndpointDispose(virtualSourceEndpoint); + MIDIClientDispose(clientRef); + [midiKeys setDelegate:nil]; // we're no longer valid + [super dealloc]; +} + +- (NSString *)uniqueTitle:(NSString *)title forMenu:(NSMenu *)menu +{ + if ([menu itemWithTitle:title] == nil) + return title; + + int n; + for (n=0;; ++n) + { + NSString *possibleTitle = [title stringByAppendingFormat:@" %d", n]; + if ([menu itemWithTitle:possibleTitle] == nil) + return possibleTitle; + } + return nil; +} + +- (void)updateDestinationMenu +{ + // get our endpoint's uid + MIDIUniqueID selectedEndpointUID; + BOOL foundSelectedDestination = NO; + if (isDestinationConnected) + { + MIDIObjectGetIntegerProperty(selectedDestination, kMIDIPropertyUniqueID, &selectedEndpointUID); + } + + // clean menu + [destinationPopup removeAllItems]; + + // insert the virtual source item + [destinationPopup addItemWithTitle:NSLocalizedString(@"Virtual source", @"Virtual source")]; + + if (!isDestinationConnected) + { + [destinationPopup selectItemAtIndex:0]; + foundSelectedDestination = YES; + } + + // now insert all available midi destinations + int i, numDevices = MIDIGetNumberOfDestinations(); + + // add a separator if there are any destinations + if (numDevices > 0) + [[destinationPopup menu] addItem:[NSMenuItem separatorItem]]; + + int iOffset = [destinationPopup numberOfItems]; + for (i=iOffset; i MIN_OCTAVE_OFFSET; + } + + return YES; +} + +- (IBAction)destinationSelected:(id)sender +{ + // handle virtual source being selected + if ([destinationPopup indexOfSelectedItem] == 0) + { + isDestinationConnected = NO; + [[NSUserDefaults standardUserDefaults] setInteger:0 forKey:kDestinationPrefKey]; + return; + } + + // other endpoint was selected + const MIDIEndpointRef *sourcePtr = (const MIDIEndpointRef *)[[[destinationPopup selectedItem] representedObject] bytes]; + if (sourcePtr == NULL) + return; + selectedDestination = *sourcePtr; + isDestinationConnected = YES; + + // save destination in prefs + [[NSUserDefaults standardUserDefaults] setEndpoint:selectedDestination forKey:kDestinationPrefKey]; +} + +- (IBAction)sourceSelected:(id)sender +{ + // disconnect previous source + OSStatus err; + if (isSourceConnected) + { + err = MIDIPortDisconnectSource(inputPort, selectedSource); + if (err) + NSLog(@"error disconnecting previous source from input port: %d", err); + } + + id sourceObject = [[sourcePopup selectedItem] representedObject]; + if (sourceObject == nil) + { + // the None item + [midiThruCheckbox setEnabled:NO]; + isSourceConnected = NO; + selectedSource = 0; + + // get rid of the source preference + [[NSUserDefaults standardUserDefaults] removeObjectForKey:kSourcePrefKey]; + return; + } + + const MIDIEndpointRef *sourcePtr = (const MIDIEndpointRef *)[sourceObject bytes]; + if (sourcePtr == NULL) + return; + selectedSource = *sourcePtr; + + err = MIDIPortConnectSource(inputPort, selectedSource, 0); + if (err) + return; + isSourceConnected = YES; + + // make sure the thru checkbox is enabled + [midiThruCheckbox setEnabled:YES]; + + // save destination in prefs + [[NSUserDefaults standardUserDefaults] setEndpoint:selectedSource forKey:kSourcePrefKey]; +} + +- (IBAction)velocitySliderChanged:(id)sender +{ + currentVelocity = [velocitySlider floatValue]; + // we don't want to ever actually play a velocity of 0 + if (currentVelocity == 0.0) + currentVelocity = 1.0; + // and setting the velocity in prefs to 0 will reset it to 3/4 on restart + [[NSUserDefaults standardUserDefaults] setFloat:currentVelocity forKey:kVelocityPrefKey]; +} + +- (IBAction)channelDidChange:(id)sender +{ + currentChannel = [channelPopup selectedTag] + 1; + [[NSUserDefaults standardUserDefaults] setInteger:currentChannel forKey:kChannelPrefKey]; +} + +- (IBAction)toggleMidiThru:(id)sender +{ + performMidiThru = !performMidiThru; + [midiThruCheckbox setIntValue:performMidiThru]; + + // save preference + [[NSUserDefaults standardUserDefaults] setBool:performMidiThru forKey:kMidiThruPrefKey]; +} + +- (float)overlayTimeout +{ + return [[NSUserDefaults standardUserDefaults] floatForKey:kOverlayTimeoutPrefKey]; +} + +- (void)overlayIndicatorDidClose:(OverlayIndicator *)theIndicator +{ + if (_indicator == theIndicator) + { + _indicator = nil; + } +} + +- (IBAction)octaveUp:(id)sender +{ + if (octaveOffset < MAX_OCTAVE_OFFSET) + { + NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults]; + + octaveOffset++; + [defaults setInteger:octaveOffset forKey:kOctaveOffsetPrefKey]; + + [midiKeys setOctaveOffset:octaveOffset]; + + if ([defaults boolForKey:SHOW_OCTAVE_SHIFT_OVERLAYS_PREF_KEY]) + { + [_indicator close]; + _indicator = [[OverlayIndicator alloc] initWithImage:[NSImage imageNamed:kOctaveUpOverlayImage]]; + [_indicator setMessage:NSLocalizedString(@"Octave Up", nil)]; + [_indicator setDelegate:self]; + [_indicator showUntilDate:[NSDate dateWithTimeIntervalSinceNow:[self overlayTimeout]]]; + } + } +} + +- (IBAction)octaveDown:(id)sender +{ + if (octaveOffset > MIN_OCTAVE_OFFSET) + { + NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults]; + + octaveOffset--; + [defaults setInteger:octaveOffset forKey:kOctaveOffsetPrefKey]; + + [midiKeys setOctaveOffset:octaveOffset]; + + if ([defaults boolForKey:SHOW_OCTAVE_SHIFT_OVERLAYS_PREF_KEY]) + { + [_indicator close]; + _indicator = [[OverlayIndicator alloc] initWithImage:[NSImage imageNamed:kOctaveDownOverlayImage]]; + [_indicator setMessage:NSLocalizedString(@"Octave Down", nil)]; + [_indicator setDelegate:self]; + [_indicator showUntilDate:[NSDate dateWithTimeIntervalSinceNow:[self overlayTimeout]]]; + } + } +} + +- (void)setWindowLevelFromPreferences +{ + int level; + if ([[NSUserDefaults standardUserDefaults] boolForKey:kFloatWindowPrefKey]) + { + level = NSModalPanelWindowLevel; + } + else + { + level = NSNormalWindowLevel; + } + [[midiKeys window] setLevel:level]; +} + +//! The prefs controller sends this when the prefs panel is closed. +//! +- (void)preferencesDidChange:(NSNotification *)notification +{ + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + + // change window preferences + makeWindowSolidWhenOnTop = [defaults boolForKey:kSolidOnTopPrefKey]; + + [self setWindowLevelFromPreferences]; + if (!(makeWindowSolidWhenOnTop && [NSApp isActive])) + { + [[midiKeys window] setAlphaValue:[defaults floatForKey:kWindowTransparencyPrefKey]]; + } + else if (makeWindowSolidWhenOnTop && [NSApp isActive]) + { + [[midiKeys window] setAlphaValue:1.0f]; + } + + // update key caps + [midiKeys setShowKeycaps:[defaults boolForKey:kShowKeyCapsPrefKey]]; + + // reload key map + [keyMap release]; // will unregister this keymaps hotkeys + keyMap = [[keyMapManager keyMapWithName:[defaults stringForKey:kKeyMapPrefKey]] retain]; + [midiKeys setNeedsDisplay:YES]; // redraw midi keys + + // Re-register hotkeys. + [self unregisterToggleHotKey]; + [self registerToggleHotKey]; + + if (hotKeysAreRegistered) + { + [self unregisterOctaveHotKeys]; + } + + if ([defaults boolForKey:kUseHotKeysPrefKey]) + { + [self enableHotKeys]; + } + + // highlight colour + NSColor *highlightColour = [defaults colorForKey:kHighlightColourPrefKey]; + [midiKeys setHighlightColour:highlightColour]; +} + +- (void)setClickThrough:(BOOL)clickThrough +{ + NSWindow *mainWindow = [midiKeys window]; + + // carbon + void *ref = [mainWindow windowRef]; + if (clickThrough) + { + ChangeWindowAttributes(ref, kWindowIgnoreClicksAttribute, kWindowNoAttributes); + } + else + { + ChangeWindowAttributes(ref, kWindowNoAttributes, kWindowIgnoreClicksAttribute); + } + + // cocoa + [mainWindow setIgnoresMouseEvents:clickThrough]; +} + +- (IBAction)toggleMidiControls:(id)sender +{ + // resize window + NSWindow *window = [toggleView window]; + NSRect newFrame = [window frame]; + NSPoint newOrigin = [hiddenItemsView frame].origin; + if (isWindowToggled) + { + // move items back into place first, so they appear as the window + // is animated + newOrigin.x = 0; + [hiddenItemsView setFrameOrigin:newOrigin]; + + // increase window size + newFrame.size.height += toggleDelta; + [window setFrame:newFrame display:YES animate:YES]; + + isWindowToggled = NO; + } + else + { + // shrink window size + toggleDelta = NSHeight([[window contentView] frame]) - NSHeight([toggleView frame]); + + newFrame.size.height -= toggleDelta; + [window setFrame:newFrame display:YES animate:YES]; + + // move items out of the way so they don't interfere with the title + // bar when used for dragging (they will trap clicks in the title) + newOrigin.x = NSWidth([window frame]); + [hiddenItemsView setFrameOrigin:newOrigin]; + + isWindowToggled = YES; + } + + // save toggle preference + [[NSUserDefaults standardUserDefaults] setBool:isWindowToggled forKey:kIsWindowToggledPrefKey]; +} + +@end + +@implementation AppController (HotKeys) + +- (IBAction)toggleHotKeys:(id)sender +{ + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + + // Enable or disable hot keys. + BOOL isActive = [defaults boolForKey:kUseHotKeysPrefKey]; + if (isActive) + { + [self disableHotKeys]; + } + else + { + [self enableHotKeys]; + } + + // Toggle defaults setting. + [defaults setBool:!isActive forKey:kUseHotKeysPrefKey]; +} + +//! @brief Enables hot keys and updates UI to match. +- (void)enableHotKeys +{ + [self registerHotKeys]; + + // Put a check mark on the hot keys menu item. + [_toggleHotKeysMenuItem setState:NSOnState]; + + // Add a status item indicating that hot keys are currently enabled. +// NSStatusBar * bar = [NSStatusBar systemStatusBar]; +// NSImage * statusImage = [NSImage imageNamed:@"RemoveShortcutPressed.tif"]; +// _hotKeysStatusItem = [[bar statusItemWithLength:[statusImage size].width + 10.0] retain]; +// [_hotKeysStatusItem setImage:statusImage]; +// [_hotKeysStatusItem setToolTip:@"MidiKeys hot keys are enabled."]; +// [_hotKeysStatusItem setTarget:self]; +// [_hotKeysStatusItem setAction:@selector(toggleHotKeys:)]; + + // Set a badge on the app icon in the dock. + [[NSApp dockTile] setBadgeLabel:NSLocalizedString(@"HotKeyDockBadge", nil)]; +} + +//! @brief Disables hot keys are updates the UI to match. +- (void)disableHotKeys +{ + // Unregister hot keys. + [self unregisterHotKeys]; + + // Remove the check mark from the hot keys menu item. + [_toggleHotKeysMenuItem setState:NSOffState]; + + // Remove the status item. +// if (_hotKeysStatusItem) +// { +// [[NSStatusBar systemStatusBar] removeStatusItem:_hotKeysStatusItem]; +// [_hotKeysStatusItem release]; +// _hotKeysStatusItem = nil; +// } + + // Clear the app icon badge. + [[NSApp dockTile] setBadgeLabel:nil]; +} + +- (void)registerToggleHotKey +{ + // Read the toggle hot key info from preferences. + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + NSDictionary * toggleDict = [defaults dictionaryForKey:kToggleHotKeysShortcutPrefKey]; + if (!toggleDict) + { + return; + } + + int modifiers = [[toggleDict objectForKey:SHORTCUT_FLAGS_KEY] intValue]; + int keycode = [[toggleDict objectForKey:SHORTCUT_KEYCODE_KEY] intValue]; + + EventHotKeyID hotKeyID = { 0, 0 }; + OSStatus err = RegisterEventHotKey(keycode, modifiers, hotKeyID, GetApplicationEventTarget(), 0, &_toggleHotKeyRef); + if (err) + { + NSLog(@"unable to register toggle hot key shortcut (err=%d)", err); + } +} + +- (void)unregisterToggleHotKey +{ + if (_toggleHotKeyRef) + { + UnregisterEventHotKey(_toggleHotKeyRef); + _toggleHotKeyRef = NULL; + } +} + +- (void)registerHotKeys +{ + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + + // Get the modifier key. + int modifiers = [defaults integerForKey:kHotKeysModifiersPrefKey]; + + // Register both note keys and control keys. + [keyMap registerHotKeysWithModifiers:modifiers]; + [self registerOctaveHotKeysWithModifiers:modifiers]; +} + +- (void)unregisterHotKeys +{ + [self unregisterOctaveHotKeys]; + [keyMap unregisterHotKeys]; +} + +- (void)registerOctaveHotKeysWithModifiers:(int)modifiers +{ + OSStatus err1, err2, err3, err4; + EventHotKeyID hotKeyID = { 0, 0 }; + + // unregister previous hot keys if present, otherwise registering will fail + [self unregisterOctaveHotKeys]; + + err1 = RegisterEventHotKey(kRightArrowKeycode, modifiers, hotKeyID, GetApplicationEventTarget(), 0, &octaveUpHotKeyRef); + if (err1) + NSLog(@"octave up hot key could not be registered (err = %d)", err1); + + err2 = RegisterEventHotKey(kLeftArrowKeycode, modifiers, hotKeyID, GetApplicationEventTarget(), 0, &octaveDownHotKeyRef); + if (err2) + NSLog(@"octave down hot key could not be registered (err = %d)", err2); + + err3 = RegisterEventHotKey(kUpArrowKeycode, modifiers, hotKeyID, GetApplicationEventTarget(), 0, &velocityUpHotKeyRef); + if (err3) + NSLog(@"velocity up hot key could not be registered (err = %d)", err3); + + err4 = RegisterEventHotKey(kDownArrowKeycode, modifiers, hotKeyID, GetApplicationEventTarget(), 0, &velocityDownHotKeyRef); + if (err4) + NSLog(@"velocity down hot key could not be registered (err = %d)", err4); + + // only mark hot keys as registered if one of the keys was actually registered + if (err1 == noErr || err2 == noErr || err3 == noErr || err4 == noErr) + hotKeysAreRegistered = YES; +} + +- (void)unregisterOctaveHotKeys +{ + if (octaveUpHotKeyRef) + { + UnregisterEventHotKey(octaveUpHotKeyRef); + octaveUpHotKeyRef = NULL; + } + if (octaveDownHotKeyRef) + { + UnregisterEventHotKey(octaveDownHotKeyRef); + octaveDownHotKeyRef = NULL; + } + if (velocityUpHotKeyRef) + { + UnregisterEventHotKey(velocityUpHotKeyRef); + velocityUpHotKeyRef = NULL; + } + if (velocityDownHotKeyRef) + { + UnregisterEventHotKey(velocityDownHotKeyRef); + velocityDownHotKeyRef = NULL; + } + + hotKeysAreRegistered = NO; +} + +- (void)handleVelocityKeyPressedUpOrDown:(int)upOrDown +{ + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + + float delta = [defaults floatForKey:kVelocityHotKeyDeltaPrefKey]; + + // invert delta for down + if (upOrDown == kVelocityDown) + { + delta *= -1.0; + } + + [self adjustVelocity:delta]; + + float interval = [defaults floatForKey:kVelocityRepeatIntervalPrefKey]; + + // If we receive another velocity hot key down message before the + // key up message, kill any previous timer. + if (velocityHotKeyTimer) + { + [velocityHotKeyTimer invalidate]; + } + velocityHotKeyTimer = [NSTimer scheduledTimerWithTimeInterval:interval target:self selector:@selector(velocityHotKeyTimerFired:) userInfo:[NSMutableDictionary dictionaryWithObject:[NSNumber numberWithFloat:delta] forKey:@"Delta"] repeats:YES]; +} + +- (void)velocityHotKeyTimerFired:(NSTimer *)timer +{ + float delta = [[[timer userInfo] objectForKey:@"Delta"] floatValue]; + [self adjustVelocity:delta]; + + // Increment delta every time the timer fires + delta *= 1.3f; + [[timer userInfo] setObject:[NSNumber numberWithFloat:delta] forKey:@"Delta"]; +} + +- (void)handleVelocityKeyReleased +{ + [velocityHotKeyTimer invalidate]; + velocityHotKeyTimer = nil; +} + +//! @brief Present the hot keys enabled/disabled notification overlay. +//! +//! Whether the message says "Enabled" or "Disabled" depends on the current state of the @a +//! #hotKeysAreRegistered member variable, with true causing the message to say "Enabled". +//! This means that this method should be called after changing the hot keys state. +- (void)displayHotKeysOverlay +{ + if ([[NSUserDefaults standardUserDefaults] boolForKey:SHOW_HOT_KEYS_OVERLAYS_PREF_KEY]) + { + [_indicator close]; + _indicator = [[OverlayIndicator alloc] initWithImage:[NSImage imageNamed:@"Octave.png"]]; + [_indicator setMessage:hotKeysAreRegistered ? NSLocalizedString(@"Hot Keys Enabled", nil) : NSLocalizedString(@"Hot Keys Disabled", nil)]; + [_indicator setDelegate:self]; + [_indicator showUntilDate:[NSDate dateWithTimeIntervalSinceNow:[self overlayTimeout]]]; + } +} + +//! @brief Handle a hot key event. +- (void)hotKeyPressed:(UInt32)identifier +{ + if (identifier == (UInt32)_toggleHotKeyRef) + { + [self toggleHotKeys:self]; + + // Show an overlay indicator to tell the user that hot keys were toggled. + // This isn't done in toggleHotKeys because we only want to show the overlay + // in response to the toggle hot key itself, not the hot keys menu item. + [self displayHotKeysOverlay]; + } + else if (identifier == (UInt32)octaveUpHotKeyRef) + { + [self octaveUp:nil]; + } + else if (identifier == (UInt32)octaveDownHotKeyRef) + { + [self octaveDown:nil]; + } + else if (identifier == (UInt32)velocityUpHotKeyRef) + { + [self handleVelocityKeyPressedUpOrDown:kVelocityUp]; + } + else if (identifier == (UInt32)velocityDownHotKeyRef) + { + [self handleVelocityKeyPressedUpOrDown:kVelocityDown]; + } + else + { + // look up note number + int midiNote = [keyMap midiNoteForHotKeyWithIdentifier:identifier] + octaveOffset * 12; + + // send the note + int channel = currentChannel - 1; + int velocity = (unsigned char)(0x7f * currentVelocity / maxVelocity); + [self sendMidiNote:midiNote channel:channel velocity:velocity]; + + // update the key view + [midiKeys turnMidiNoteOn:midiNote]; + } +} + +- (void)hotKeyReleased:(UInt32)identifier +{ + if (identifier == (UInt32)octaveUpHotKeyRef || identifier == (UInt32)octaveDownHotKeyRef) + { + // do nothing + } + else if (identifier == (UInt32)velocityUpHotKeyRef) + { + [self handleVelocityKeyReleased]; + } + else if (identifier == (UInt32)velocityDownHotKeyRef) + { + [self handleVelocityKeyReleased]; + } + else + { + // look up note number + int midiNote = [keyMap midiNoteForHotKeyWithIdentifier:identifier] + octaveOffset * 12; + + // send the note + int channel = currentChannel - 1; + [self sendMidiNote:midiNote channel:channel velocity:0]; + + // update the key view + [midiKeys turnMidiNoteOff:midiNote]; + } +} + +@end + +@implementation AppController (MIDI) + +- (NSString *)nameForMidiEndpoint:(MIDIEndpointRef)theEndpoint +{ + MIDIEntityRef theEntity = 0; + MIDIDeviceRef theDevice = 0; + NSString *endpointName = nil; + NSString *deviceName = nil; + NSString *entityName = nil; + + if (theEndpoint) + { + MIDIObjectGetStringProperty(theEndpoint, kMIDIPropertyName, (CFStringRef *)&endpointName); + MIDIEndpointGetEntity(theEndpoint, &theEntity); + if (theEntity) + { + MIDIObjectGetStringProperty(theEntity, kMIDIPropertyName, (CFStringRef *)&entityName); + MIDIEntityGetDevice(theEntity, &theDevice); + if (theDevice) + MIDIObjectGetStringProperty(theDevice, kMIDIPropertyName, (CFStringRef *)&deviceName); + } + } + + NSString *name = nil; + if (endpointName) + { + if (deviceName) + name = [NSString stringWithFormat:@"%@: %@", deviceName, endpointName]; + else if (entityName) + name = [NSString stringWithFormat:@"%@: %@", entityName, endpointName]; + else + name = [[endpointName retain] autorelease]; + } + else if (deviceName) + name = [[deviceName retain] autorelease]; + else if (entityName) + name = [[entityName retain] autorelease]; + + // these aren't autoreleased since we got them from CoreMIDI + [endpointName release]; + [deviceName release]; + [entityName release]; + return name; +} + +- (void)handleMidiNotification:(const MIDINotification *)message +{ +// NSLog(@"midi noticfication: %d", message->messageID); + // update popup menus when the sources or destinations change + switch(message->messageID) + { + case kMIDIMsgSetupChanged: + [self updateDestinationMenu]; + [self updateSourceMenu]; + break; + } +} + +//! Use the key map object to map keypresses to MIDI notes, which are +//! then sent out the selected MIDI port. +- (void)processMidiKeyWithCode:(int)keycode turningOn:(BOOL)isTurningOn +{ + // map the key + int midiNote = [keyMap midiNoteForKeyCode:keycode]; + if (midiNote == -1) // the key did not match + { + // handle arrow keys + switch (keycode) + { + case kRightArrowKeycode: + if (isTurningOn) + { + [self octaveUp:nil]; + } + break; + + case kLeftArrowKeycode: + if (isTurningOn) + { + [self octaveDown:nil]; + } + break; + + case kUpArrowKeycode: + if (isTurningOn) + { + [self handleVelocityKeyPressedUpOrDown:kVelocityUp]; + } + else + { + [self handleVelocityKeyReleased]; + } + break; + + case kDownArrowKeycode: + if (isTurningOn) + { + [self handleVelocityKeyPressedUpOrDown:kVelocityDown]; + } + else + { + [self handleVelocityKeyReleased]; + } + break; + } + return; + } + midiNote += octaveOffset * 12; // adjust octave +// NSLog(@"midiNote = %d\n", (int)midiNote); + + // send the note + int channel = currentChannel - 1; + int velocity; + if (isTurningOn) + velocity = (unsigned char)(0x7f * currentVelocity / maxVelocity); + else + velocity = 0; + [self sendMidiNote:midiNote channel:channel velocity:velocity]; + + // update the key view + if (isTurningOn) + [midiKeys turnMidiNoteOn:midiNote]; + else + [midiKeys turnMidiNoteOff:midiNote]; +} + +- (void)processMidiKeyClickWithNote:(int)note turningOn:(BOOL)isTurningOn +{ +// NSLog(@"note=%d", note); + + // send the note + int midiNote = note;// + octaveOffset * 12; // adjust octave + int channel = currentChannel - 1; + int velocity; + if (isTurningOn) + velocity = (unsigned char)(0x7f * currentVelocity / maxVelocity); + else + velocity = 0; + [self sendMidiNote:midiNote channel:channel velocity:velocity]; + + // update the key view + if (isTurningOn) + [midiKeys turnMidiNoteOn:note]; + else + [midiKeys turnMidiNoteOff:note]; +} + +//! Send a MIDI note on event out the virtual source or our output port. +//! A velocity of 0 is used to send a note off event. +- (void)sendMidiNote:(int)midiNote channel:(int)channel velocity:(int)velocity +{ + // send the midi note on out our virtual source + MIDIPacketList packetList; + MIDIPacket *packetPtr = MIDIPacketListInit(&packetList); + unsigned char midiData[3]; + midiData[0] = 0x90 | channel; + midiData[1] = midiNote; + midiData[2] = velocity; + packetPtr = MIDIPacketListAdd(&packetList, sizeof packetList, packetPtr, AudioGetCurrentHostTime(), 3, (const Byte *)&midiData); + if (packetPtr) + { + if (isDestinationConnected) + { + // send over output port + MIDISend(outputPort, selectedDestination, &packetList); + } + else + { + // send over virtual source + MIDIReceived(virtualSourceEndpoint, &packetList); + } + } +} + +//! We need an autorelease pool because this method can be called from a CoreMIDI thread +//! where no pool has previously been set up. The exception handler is just in case, so +//! we can always dispose of the pool, and to keep Cocoa exceptions from travelling up +//! into the CoreMIDI thread. +- (void)receiveMidiPacketList:(const MIDIPacketList *)packetList +{ + NSAutoreleasePool *pool = nil; + @try + { + pool = [[NSAutoreleasePool alloc] init]; + + // handle MIDI thru + if (performMidiThru) + { + if (isDestinationConnected) + { + // send over output port + MIDISend(outputPort, selectedDestination, packetList); + } + else + { + // send over virtual source + MIDIReceived(virtualSourceEndpoint, packetList); + } + } + + // process the received packet + MidiParser *parser = [MidiParser parserWithMidiPacketList:packetList]; + MIDIPacket *packet; + while (packet = [parser nextMidiPacket]) + { + // handle note on and off for any channel + if (packet->length == 3) + { + int note = packet->data[1]; + switch (packet->data[0] & 0xf0) + { + case 0x90: + if (packet->data[2] > 0) + { + // note on + [midiKeys turnMidiNoteOn:note]; + } + else + { + // velocity 0 == note off + [midiKeys turnMidiNoteOff:note]; + } + break; + + case 0x80: + [midiKeys turnMidiNoteOff:note]; + break; + } + } + } + } + @finally + { + [pool release]; + } +} + +- (void)adjustVelocity:(float)delta +{ + float newVelocity = currentVelocity; + newVelocity += delta; + if (newVelocity < 0.0) + { + newVelocity = 0.0; + } + else if (newVelocity > maxVelocity) + { + newVelocity = maxVelocity; + } + [velocitySlider setFloatValue:newVelocity]; + [self velocitySliderChanged:nil]; +} + +//! Send note off commands for every MIDI note, on every channel. +//! +- (IBAction)sendAllNotesOff:(id)sender +{ + int note; + int channel; + for (channel=0; channel < 16; ++channel) + { + for (note=0; note < 128; ++note) + { + [self sendMidiNote:note channel:channel velocity:0]; + } + } +} + +//! Uses the key map to convert a MIDI note into the Unicode character that +//! must be typed to play that note. The actual character depends on the +//! currently selected keyboard in the system Keyboard menu. +- (NSString *)characterForMidiNote:(int)note +{ + return [keyMap characterForMidiNote:note]; +} + +@end + + +//! Just pass the notification along to the objc method. +//! +void MyNotifyProc(const MIDINotification *message, void *refCon) +{ + AppController *controller = (AppController *)refCon; + [controller handleMidiNotification:message]; +} + +void MyMidiReadProc(const MIDIPacketList *pktlist, void *refCon, void *connRefCon) +{ + AppController *controller = (AppController *)refCon; + [controller receiveMidiPacketList:pktlist]; +} + diff --git a/CTGradient.h b/CTGradient.h new file mode 100644 index 0000000..ca6904b --- /dev/null +++ b/CTGradient.h @@ -0,0 +1,54 @@ +// +// CTGradient.h +// +// Created by Chad Weider on 12/3/05. +// Copyright (c) 2005 Cotingent. +// Some rights reserved: +// + +#import + +typedef struct _CTGradientElement + { + float red, green, blue, alpha; + float position; + + struct _CTGradientElement *nextElement; + } CTGradientElement; + + +@interface CTGradient : NSObject + { + CTGradientElement* elementList; + + CGFunctionRef gradientFunction; + } + ++ (id)gradientWithBeginningColor:(NSColor *)begin endingColor:(NSColor *)end; + ++ (id)aquaSelectedGradient; ++ (id)aquaNormalGradient; ++ (id)aquaPressedGradient; + ++ (id)unifiedSelectedGradient; ++ (id)unifiedNormalGradient; ++ (id)unifiedPressedGradient; ++ (id)unifiedDarkGradient; + +- (CTGradient *)gradientWithAlphaComponent:(float)alpha; + +- (CTGradient *)addColorStop:(NSColor *)color atPosition:(float)position; //positions given relative to [0,1] +- (CTGradient *)removeColorStopAtIndex:(unsigned)index; +- (CTGradient *)removeColorStopAtPosition:(float)position; + + +- (NSColor *)colorStopAtIndex:(unsigned)index; +- (NSColor *)colorAtPosition:(float)position; + + +- (void)drawSwatchInRect:(NSRect)rect; +- (void)fillRect:(NSRect)rect angle:(float)angle; //fills rect with axial gradient + // angle in degrees +- (void)radialFillRect:(NSRect)rect; //fills rect with radial gradient + // gradient from center outwards +@end diff --git a/CTGradient.m b/CTGradient.m new file mode 100644 index 0000000..67ac322 --- /dev/null +++ b/CTGradient.m @@ -0,0 +1,773 @@ +// +// CTGradient.m +// +// Created by Chad Weider on 12/3/05. +// Copyright (c) 2005 Cotingent. +// Some rights reserved: +// + +#import "CTGradient.h" + +@interface CTGradient (Private) +- (void)_commonInit; +- (void)addElement:(CTGradientElement*)newElement; + +- (CTGradientElement *)elementAtIndex:(unsigned)index; + +- (CTGradientElement)removeElementAtIndex:(unsigned)index; +- (CTGradientElement)removeElementAtPosition:(float)position; +@end + + +@implementation CTGradient + +/////////////////////////////////////Initialization Type Stuff +void linearEvaluation (void *info, const float *in, float *out); +static const CGFunctionCallbacks _CTLinearGradientFunction = { 0, &linearEvaluation, NULL }; //Version, evaluator function, cleanup function + +- (id)init + { + self = [super init]; + + if (self != nil) + { + [self _commonInit]; + } + return self; + } + +- (void)_commonInit + { + elementList = nil; + + static const float input_value_range [2] = { 0, 1 }; //range for the evaluator input + static const float output_value_ranges [8] = { 0, 1, 0, 1, 0, 1, 0, 1 }; //ranges for the evaluator output (4 returned values) + + gradientFunction = CGFunctionCreate(&elementList, //the two transition colors + 1, input_value_range, //number of inputs (just fraction of progression) + 4, output_value_ranges, //number of outputs RGBa + &_CTLinearGradientFunction); //info for using the evaluator funtion + } + +- (void)dealloc + { + CGFunctionRelease(gradientFunction); + + CTGradientElement *elementToRemove = elementList; + while(elementList != nil) + { + elementToRemove = elementList; + elementList = elementList->nextElement; + free(elementToRemove); + } + + [super dealloc]; + } + +- (id)copyWithZone:(NSZone *)zone + { + CTGradient *copy = [[[self class] allocWithZone:zone] init]; + + //now just copy my elementlist + CTGradientElement *currentElement = elementList; + while(currentElement != nil) + { + [copy addElement:currentElement]; + currentElement = currentElement->nextElement; + } + + return copy; + } + +- (void)encodeWithCoder:(NSCoder *)coder + { + if([coder allowsKeyedCoding]) + { + unsigned count = 0; + CTGradientElement *currentElement = elementList; + while(currentElement != nil) + { + [coder encodeValueOfObjCType:@encode(float) at:&(currentElement->red)]; + [coder encodeValueOfObjCType:@encode(float) at:&(currentElement->green)]; + [coder encodeValueOfObjCType:@encode(float) at:&(currentElement->blue)]; + [coder encodeValueOfObjCType:@encode(float) at:&(currentElement->alpha)]; + [coder encodeValueOfObjCType:@encode(float) at:&(currentElement->position)]; + + count++; + currentElement = currentElement->nextElement; + } + [coder encodeInt:count forKey:@"CTGradientElementCount"]; + } + else + [NSException raise:NSInvalidArchiveOperationException format:@"Only supports NSKeyedArchiver coders"]; + } + +- (id)initWithCoder:(NSCoder *)coder + { + [self _commonInit]; + + unsigned count = [coder decodeIntForKey:@"CTGradientElementCount"]; + + while(count != 0) + { + CTGradientElement newElement; + + [coder decodeValueOfObjCType:@encode(float) at:&(newElement.red)]; + [coder decodeValueOfObjCType:@encode(float) at:&(newElement.green)]; + [coder decodeValueOfObjCType:@encode(float) at:&(newElement.blue)]; + [coder decodeValueOfObjCType:@encode(float) at:&(newElement.alpha)]; + [coder decodeValueOfObjCType:@encode(float) at:&(newElement.position)]; + + count--; + [self addElement:&newElement]; + } + return self; + } + + +#pragma mark - + + + +#pragma mark Creation ++ (id)gradientWithBeginningColor:(NSColor *)begin endingColor:(NSColor *)end + { + id newInstance = [[[self class] alloc] init]; + + CTGradientElement color1; + CTGradientElement color2; + + [[begin colorUsingColorSpaceName:NSCalibratedRGBColorSpace] getRed:&color1.red + green:&color1.green + blue:&color1.blue + alpha:&color1.alpha]; + + [[end colorUsingColorSpaceName:NSCalibratedRGBColorSpace] getRed:&color2.red + green:&color2.green + blue:&color2.blue + alpha:&color2.alpha]; + color1.position = 0; + color2.position = 1; + + [newInstance addElement:&color1]; + [newInstance addElement:&color2]; + + return [newInstance autorelease]; + } + ++ (id)aquaSelectedGradient + { + id newInstance = [[[self class] alloc] init]; + + CTGradientElement color1; + color1.red = 0.58; + color1.green = 0.86; + color1.blue = 0.98; + color1.alpha = 1.00; + color1.position = 0; + + CTGradientElement color2; + color2.red = 0.42; + color2.green = 0.68; + color2.blue = 0.90; + color2.alpha = 1.00; + color2.position = 11.5/23; + + CTGradientElement color3; + color3.red = 0.64; + color3.green = 0.80; + color3.blue = 0.94; + color3.alpha = 1.00; + color3.position = 11.5/23; + + CTGradientElement color4; + color4.red = 0.56; + color4.green = 0.70; + color4.blue = 0.90; + color4.alpha = 1.00; + color4.position = 1; + + [newInstance addElement:&color1]; + [newInstance addElement:&color2]; + [newInstance addElement:&color3]; + [newInstance addElement:&color4]; + + return [newInstance autorelease]; + } + ++ (id)aquaNormalGradient + { + id newInstance = [[[self class] alloc] init]; + + CTGradientElement color1; + color1.red = color1.green = color1.blue = 0.95; + color1.alpha = 1.00; + color1.position = 0; + + CTGradientElement color2; + color2.red = color2.green = color2.blue = 0.83; + color2.alpha = 1.00; + color2.position = 11.5/23; + + CTGradientElement color3; + color3.red = color3.green = color3.blue = 0.95; + color3.alpha = 1.00; + color3.position = 11.5/23; + + CTGradientElement color4; + color4.red = color4.green = color4.blue = 0.92; + color4.alpha = 1.00; + color4.position = 1; + + [newInstance addElement:&color1]; + [newInstance addElement:&color2]; + [newInstance addElement:&color3]; + [newInstance addElement:&color4]; + + return [newInstance autorelease]; + } + ++ (id)aquaPressedGradient + { + id newInstance = [[[self class] alloc] init]; + + CTGradientElement color1; + color1.red = color1.green = color1.blue = 0.80; + color1.alpha = 1.00; + color1.position = 0; + + CTGradientElement color2; + color2.red = color2.green = color2.blue = 0.64; + color2.alpha = 1.00; + color2.position = 11.5/23; + + CTGradientElement color3; + color3.red = color3.green = color3.blue = 0.80; + color3.alpha = 1.00; + color3.position = 11.5/23; + + CTGradientElement color4; + color4.red = color4.green = color4.blue = 0.77; + color4.alpha = 1.00; + color4.position = 1; + + [newInstance addElement:&color1]; + [newInstance addElement:&color2]; + [newInstance addElement:&color3]; + [newInstance addElement:&color4]; + + return [newInstance autorelease]; + } + ++ (id)unifiedSelectedGradient + { + id newInstance = [[[self class] alloc] init]; + + CTGradientElement color1; + color1.red = color1.green = color1.blue = 0.85; + color1.alpha = 1.00; + color1.position = 0; + + CTGradientElement color2; + color2.red = color2.green = color2.blue = 0.95; + color2.alpha = 1.00; + color2.position = 1; + + [newInstance addElement:&color1]; + [newInstance addElement:&color2]; + + return [newInstance autorelease]; + } + ++ (id)unifiedNormalGradient + { + id newInstance = [[[self class] alloc] init]; + + CTGradientElement color1; + color1.red = color1.green = color1.blue = 0.75; + color1.alpha = 1.00; + color1.position = 0; + + CTGradientElement color2; + color2.red = color2.green = color2.blue = 0.90; + color2.alpha = 1.00; + color2.position = 1; + + [newInstance addElement:&color1]; + [newInstance addElement:&color2]; + + return [newInstance autorelease]; + } + ++ (id)unifiedPressedGradient + { + id newInstance = [[[self class] alloc] init]; + + CTGradientElement color1; + color1.red = color1.green = color1.blue = 0.60; + color1.alpha = 1.00; + color1.position = 0; + + CTGradientElement color2; + color2.red = color2.green = color2.blue = 0.75; + color2.alpha = 1.00; + color2.position = 1; + + [newInstance addElement:&color1]; + [newInstance addElement:&color2]; + + return [newInstance autorelease]; + } + ++ (id)unifiedDarkGradient + { + id newInstance = [[[self class] alloc] init]; + + CTGradientElement color1; + color1.red = color1.green = color1.blue = 0.68; + color1.alpha = 1.00; + color1.position = 0; + + CTGradientElement color2; + color2.red = color2.green = color2.blue = 0.83; + color2.alpha = 1.00; + color2.position = 1; + + [newInstance addElement:&color1]; + [newInstance addElement:&color2]; + + return [newInstance autorelease]; + } +#pragma mark - + + + +#pragma mark Modification +- (CTGradient *)gradientWithAlphaComponent:(float)alpha + { + id newInstance = [[[self class] alloc] init]; + + CTGradientElement *curElement = elementList; + CTGradientElement tempElement; + + while(curElement != nil) + { + tempElement = *curElement; + tempElement.alpha = alpha; + [newInstance addElement:&tempElement]; + + curElement = curElement->nextElement; + } + + return [newInstance autorelease]; + } + +//Adds a color stop with at in elementList +//(if two elements are at the same position then added imediatly after the one that was there already) +- (CTGradient *)addColorStop:(NSColor *)color atPosition:(float)position + { + CTGradient *newGradient = [self copy]; + CTGradientElement newGradientElement; + + //put the components of color into the newGradientElement - must make sure it is a RGB color (not Gray or CMYK) + [[color colorUsingColorSpaceName:NSCalibratedRGBColorSpace] getRed:&newGradientElement.red + green:&newGradientElement.green + blue:&newGradientElement.blue + alpha:&newGradientElement.alpha]; + newGradientElement.position = position; + + //Pass it off to addElement to take care of adding it to the elementList + [newGradient addElement:&newGradientElement]; + + return [newGradient autorelease]; + } + + +//Removes the color stop at from elementList +- (CTGradient *)removeColorStopAtPosition:(float)position + { + CTGradient *newGradient = [self copy]; + CTGradientElement removedElement = [newGradient removeElementAtPosition:position]; + + if(isnan(removedElement.position)) + [NSException raise:NSRangeException format:@"-[%@ removeColorStopAtPosition:]: no such colorStop at position (%f)", [self class], position]; + + return [newGradient autorelease]; + } + +- (CTGradient *)removeColorStopAtIndex:(unsigned)index + { + CTGradient *newGradient = [self copy]; + CTGradientElement removedElement = [newGradient removeElementAtIndex:index]; + + if(isnan(removedElement.position)) + [NSException raise:NSRangeException format:@"-[%@ removeColorStopAtIndex:]: index (%d) beyond bounds", [self class], index]; + + return [newGradient autorelease]; + } +#pragma mark - + + + +#pragma mark Information +//Returns color at in gradient +- (NSColor *)colorStopAtIndex:(unsigned)index + { + CTGradientElement *element = [self elementAtIndex:index]; + + if(element != nil) + return [NSColor colorWithCalibratedRed:element->red + green:element->green + blue:element->blue + alpha:element->alpha]; + + [NSException raise:NSRangeException format:@"-[%@ removeColorStopAtIndex:]: index (%d) beyond bounds", [self class], index]; + + return nil; + } + +- (NSColor *)colorAtPosition:(float)position + { + float components[4]; + + linearEvaluation(&elementList, &position, components); + + return [NSColor colorWithCalibratedRed:components[0] + green:components[1] + blue:components[2] + alpha:components[3]]; + } +#pragma mark - + + + +#pragma mark Drawing +- (void)drawSwatchInRect:(NSRect)rect + { + [self fillRect:rect angle:45]; + } + +- (void)fillRect:(NSRect)rect angle:(float)angle + { + //First Calculate where the beginning and ending points should be + CGPoint startPoint; + CGPoint endPoint; + + if(angle == 0 && NO) //screw the calculations - we know the answer + { + startPoint = CGPointMake(NSMinX(rect), NSMinY(rect)); //right of rect + endPoint = CGPointMake(NSMaxX(rect), NSMinY(rect)); //left of rect + } + else if(angle == 90 && NO) //same as above + { + startPoint = CGPointMake(NSMinX(rect), NSMinY(rect)); //bottom of rect + endPoint = CGPointMake(NSMinX(rect), NSMaxY(rect)); //top of rect + } + else //ok, we'll do the calculations now + { + float x,y; + float sina, cosa, tana; + + float length; + float deltax, + deltay; + + float rangle = angle * pi/180; //convert the angle to radians + + if(fabsf(tan(rangle))<=1) //for range [-45,45], [135,225] + { + x = NSWidth(rect); + y = NSHeight(rect); + + sina = sin(rangle); + cosa = cos(rangle); + tana = tan(rangle); + + length = x/fabsf(cosa)+(y-x*fabsf(tana))*fabsf(sina); + + deltax = length*cosa/2; + deltay = length*sina/2; + } + else //for range [45,135], [225,315] + { + x = NSHeight(rect); + y = NSWidth(rect); + + sina = sin(rangle - 90*pi/180); + cosa = cos(rangle - 90*pi/180); + tana = tan(rangle - 90*pi/180); + + length = x/fabsf(cosa)+(y-x*fabsf(tana))*fabsf(sina); + + deltax =-length*sina/2; + deltay = length*cosa/2; + } + + startPoint = CGPointMake(NSMidX(rect)-deltax, NSMidY(rect)-deltay); + endPoint = CGPointMake(NSMidX(rect)+deltax, NSMidY(rect)+deltay); + } + + //Calls to CoreGraphics + CGContextRef currentContext = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort]; + CGContextSaveGState(currentContext); + CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB(); + //CGColorSpaceRef colorspace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); + CGShadingRef myCGShading = CGShadingCreateAxial(colorspace, startPoint, endPoint, gradientFunction, false, false); + + CGContextClipToRect(currentContext , *(CGRect *)&rect); //This is where the action happens + CGContextDrawShading(currentContext, myCGShading); + + CGShadingRelease (myCGShading); + CGColorSpaceRelease(colorspace ); + CGContextRestoreGState(currentContext); + } + +- (void)radialFillRect:(NSRect)rect + { + CGPoint startPoint , endPoint; + float startRadius, endRadius; + + startPoint = endPoint = CGPointMake(NSMidX(rect), NSMidY(rect)); + + startRadius = 0; + + if(NSHeight(rect)>NSWidth(rect)) + endRadius = NSHeight(rect)/2; + else + endRadius = NSWidth(rect)/2; + + //Calls to CoreGraphics + CGContextRef currentContext = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort]; + CGContextSaveGState(currentContext); + CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB(); + //CGColorSpaceRef colorspace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); + CGShadingRef myCGShading = CGShadingCreateRadial(colorspace, startPoint, startRadius, endPoint, endRadius, gradientFunction, true, true); + + CGContextClipToRect (currentContext , *(CGRect *)&rect); + CGContextDrawShading(currentContext , myCGShading); //This is where the action happens + + CGShadingRelease (myCGShading); + CGColorSpaceRelease (colorspace); + CGContextRestoreGState(currentContext); + } + +#pragma mark - + + + +#pragma mark Element List +- (void)addElement:(CTGradientElement *)newElement + { + if(elementList == nil) + { + elementList = malloc(sizeof(CTGradientElement)); + *elementList = *newElement; + + elementList->nextElement = nil; + } + else + { + CTGradientElement *curElement = elementList; + while(curElement->nextElement != nil && !((curElement->position <= newElement->position) && (newElement->position < curElement->nextElement->position))) + { + curElement = curElement->nextElement; + } + + CTGradientElement *tmpNext = curElement->nextElement; + curElement->nextElement = malloc(sizeof(CTGradientElement)); + *(curElement->nextElement) = *newElement; + curElement->nextElement->nextElement = tmpNext; + } + } + +- (CTGradientElement)removeElementAtIndex:(unsigned)index + { + CTGradientElement removedElement; + removedElement.red = 0.0; + removedElement.green = 0.0; + removedElement.blue = 0.0; + removedElement.alpha = 0.0; + removedElement.position = NAN; + removedElement.nextElement = NULL; + if(elementList != nil) + { + if(index == 0) + { + CTGradientElement *tmpNext = elementList; + elementList = elementList->nextElement; + + removedElement = *tmpNext; + free(tmpNext); + + return removedElement; + } + + unsigned count = 1; //we want to start one ahead + CTGradientElement *currentElement = elementList; + while(currentElement->nextElement != nil) + { + if(count == index) + { + CTGradientElement *tmpNext = currentElement->nextElement; + currentElement->nextElement = currentElement->nextElement->nextElement; + + removedElement = *tmpNext; + free(tmpNext); + + return removedElement; + } + + count++; + currentElement = currentElement->nextElement; + } + } + removedElement.position = NAN; + return removedElement; + } + +- (CTGradientElement)removeElementAtPosition:(float)position + { + CTGradientElement removedElement; + removedElement.red = 0.0; + removedElement.green = 0.0; + removedElement.blue = 0.0; + removedElement.alpha = 0.0; + removedElement.position = NAN; + removedElement.nextElement = NULL; + if(elementList != nil) + { + if(elementList->position == position) + { + CTGradientElement *tmpNext = elementList; + elementList = elementList->nextElement; + + removedElement = *tmpNext; + free(tmpNext); + + return removedElement; + } + else + { + CTGradientElement *curElement = elementList; + while(curElement->nextElement != nil) + { + if(curElement->nextElement->position == position) + { + CTGradientElement *tmpNext = curElement->nextElement; + curElement->nextElement = curElement->nextElement->nextElement; + + removedElement = *tmpNext; + free(tmpNext); + + return removedElement; + } + } + } + } + removedElement.position = NAN; + return removedElement; + } + + +- (CTGradientElement *)elementAtIndex:(unsigned)index; + { + unsigned count = 0; + CTGradientElement *currentElement = elementList; + + while(currentElement != nil) + { + if(count == index) + return currentElement; + + count++; + currentElement = currentElement->nextElement; + } + + return nil; + } +#pragma mark - + + + +#pragma mark Core Graphics +- (CGFunctionRef)buildCGFunction + { + static const float input_value_range [2] = { 0, 1 }; //range for the evaluator input + static const float output_value_ranges [8] = { 0, 1, 0, 1, 0, 1, 0, 1 }; //ranges for the evaluator output (4 returned values) + + return CGFunctionCreate(&elementList, //the two transition colors + 1, input_value_range , //number of inputs (just fraction of progression) + 4, output_value_ranges, //number of outputs RGBa + &_CTLinearGradientFunction); //info for using the evaluator funtion + } + + + + + + +//////////////////////////////////////LinearEvaluation Function///////////////////////////////////// + +void linearEvaluation (void *info, const float *in, float *out) + { + float position = *in; + + if(*(CTGradientElement **)info == nil) //if elementList is empty return clear color + { + out[0] = out[1] = out[2] = out[3] = 0; + return; + } + + //This grabs the first two colors in the sequence + CTGradientElement *color1 = *(CTGradientElement **)info; + CTGradientElement *color2 = color1->nextElement; + + //make sure first color and second color are on other sides of position + while(color2 != nil && color2->position < position) + { + color1 = color2; + color2 = color1->nextElement; + } + //if we don't have another color then make next color the same color + if(color2 == nil) + { + color2 = color1; + } + + //----------FailSafe settings---------- + //color1->red = 1; color2->red = 0; + //color1->green = 1; color2->green = 0; + //color1->blue = 1; color2->blue = 0; + //color1->alpha = 1; color2->alpha = 1; + //color1->position = .5; + //color2->position = .5; + //------------------------------------- + + if(position <= color1->position) //Make all below color color1's position equal to color1 + { + out[0] = color1->red; + out[1] = color1->green; + out[2] = color1->blue; + out[3] = color1->alpha; + } + else if (position >= color2->position) //Make all above color color2's position equal to color2 + { + out[0] = color2->red; + out[1] = color2->green; + out[2] = color2->blue; + out[3] = color2->alpha; + } + else //Interpolate color at postions between color1 and color1 + { + //adjust position so that it goes from 0 to 1 in the range from color 1 & 2's position + position = (position-color1->position)/(color2->position - color1->position); + + out[0] = (color2->red - color1->red )*position + color1->red; + out[1] = (color2->green - color1->green)*position + color1->green; + out[2] = (color2->blue - color1->blue )*position + color1->blue; + out[3] = (color2->alpha - color1->alpha)*position + color1->alpha; + } + } + +@end + diff --git a/ColourDefaults.h b/ColourDefaults.h new file mode 100644 index 0000000..88e6f11 --- /dev/null +++ b/ColourDefaults.h @@ -0,0 +1,18 @@ +// +// ColourDefaults.h +// MidiKeys +// +// Created by Chris Reed on Sat Oct 26 2002. +// Copyright (c) 2002 Chris Reed. All rights reserved. +// + +#import + + +@interface NSUserDefaults (ColourDefaults) + +- (NSColor *)colorForKey:(NSString *)key; +- (void)setColor:(NSColor *)theColor forKey:(NSString *)key; + +@end + diff --git a/ColourDefaults.m b/ColourDefaults.m new file mode 100644 index 0000000..e05040a --- /dev/null +++ b/ColourDefaults.m @@ -0,0 +1,37 @@ +// +// ColourDefaults.mm +// MidiKeys +// +// Created by Chris Reed on Sat Oct 26 2002. +// Copyright (c) 2002 Chris Reed. All rights reserved. +// + +#import "ColourDefaults.h" + + +@implementation NSUserDefaults (ColourDefaults) + +// save color as a string with the components separated by spaces +- (NSColor *)colorForKey:(NSString *)key +{ + NSString *colorString = [self stringForKey:key]; + if (!colorString) + return nil; + + NSArray *componentArray = [colorString componentsSeparatedByString:@" "]; + if ([componentArray count] != 4) + return nil; + + id components[4]; + [componentArray getObjects:(id *)&components]; // we know the length is 4 + return [NSColor colorWithCalibratedRed:[components[0] floatValue] green:[components[1] floatValue] blue:[components[2] floatValue] alpha:[components[3] floatValue]]; +} + +- (void)setColor:(NSColor *)theColor forKey:(NSString *)key +{ + NSString *colorString = [NSString stringWithFormat:@"%g %g %g %g", [theColor redComponent], [theColor greenComponent], [theColor blueComponent], [theColor alphaComponent]]; + [self setObject:colorString forKey:key]; +} + +@end + diff --git a/EndpointDefaults.h b/EndpointDefaults.h new file mode 100644 index 0000000..ce20368 --- /dev/null +++ b/EndpointDefaults.h @@ -0,0 +1,18 @@ +// +// EndpointDefaults.h +// MidiKeys +// +// Created by Chris Reed on Wed Oct 23 2002. +// Copyright (c) 2002 Chris Reed. All rights reserved. +// + +#import +#import + +@interface NSUserDefaults (EndpointDefaults) + +- (MIDIEndpointRef)endpointForKey:(NSString *)key; +- (void)setEndpoint:(MIDIEndpointRef)endpoint forKey:(NSString *)key; + +@end + diff --git a/EndpointDefaults.m b/EndpointDefaults.m new file mode 100644 index 0000000..9d0785d --- /dev/null +++ b/EndpointDefaults.m @@ -0,0 +1,46 @@ +// +// EndpointDefaults.m +// MidiKeys +// +// Created by Chris Reed on Wed Oct 23 2002. +// Copyright (c) 2002 Chris Reed. All rights reserved. +// + +#import "EndpointDefaults.h" + + +@implementation NSUserDefaults (EndpointDefaults) + +- (MIDIEndpointRef)endpointForKey:(NSString *)key +{ + MIDIUniqueID endpointUID = [self integerForKey:key]; + if (endpointUID != 0) + { + MIDIObjectType objType; + MIDIObjectRef obj; + OSStatus err = MIDIObjectFindByUniqueID(endpointUID, &obj, &objType); + if (err == noErr && (objType == kMIDIObjectType_Destination + || objType == kMIDIObjectType_ExternalDestination + || objType == kMIDIObjectType_Source + || objType == kMIDIObjectType_ExternalSource)) + { + return (MIDIEndpointRef)obj; + } + } + return 0; +} + +- (void)setEndpoint:(MIDIEndpointRef)endpoint forKey:(NSString *)key +{ + MIDIUniqueID endpointUID; + OSStatus err = MIDIObjectGetIntegerProperty(endpoint, kMIDIPropertyUniqueID, &endpointUID); + if (err == noErr) + { + [self setInteger:endpointUID forKey:key]; + } +} + +@end + + + diff --git a/English.lproj/Credits.html b/English.lproj/Credits.html new file mode 100644 index 0000000..87cf80b --- /dev/null +++ b/English.lproj/Credits.html @@ -0,0 +1,56 @@ + +

+ +

+ +

Written by:
+   Chris Reed <flit@ftml.net>
+   http://www.manyetas.com/creed/midikeys

+ +

German localisation:
+   Richard Zelzer
+   http://www.zmusik.de/
+   Ralf Welter <i_see@macnews.de>

+ +

French localisation:
+   Frédéric Ballériaux

+ +

Japanese localisation:
+   Hiroshi Yamato
+   http://salvageship.dropcontrol.com/

+ +

Spanish localisation:
+   Fernando Díaz de la Torre
+ +

Special thanks to:
+   Airy André
+   Skye Ashbrook
+   Frédéric Ballériaux
+   Damon
+   Fernando Díaz de la Torre
+   Alexander Guy
+   Magnus Helin
+   Michael Keuter
+   Norbert Rittel
+   Ralf Welter
+   rasda
+   Adrian Steiger
+   tdc
+   Jon Wight
+   Hiroshi Yamato
+   xonox
+   Richard Zelzer
+

+ +

+Sparkle framework
+   http://sparkle.andymatuschak.org/
+   Andy Matuschak and others +

+ +

+ShortcutRecorder
+   http://wafflesoftware.net/shortcut/
+   Jesper and others +

+ \ No newline at end of file diff --git a/English.lproj/InfoPlist.strings b/English.lproj/InfoPlist.strings new file mode 100644 index 0000000000000000000000000000000000000000..f5c886211b057425f2a7373eb4c528897a4a582c GIT binary patch literal 532 zcmbV}%WlFz3`Os{UlFlH<+-YaSQI24;;|qS`#=aFNP;F51b@_@ESwoo*n~|ra_o4n zudh9~znaSOG*+sm0`0ZcRV#($PI#k?OsWL$;Um67{vzV44i2B`NOlMM;!tJP^ug(> zr;dI=hu~J4!XM*3wXu>WFo)RaSy@u6pvu>VUWOiXa4$VR8AElVb8XWkv;XD`#kqC)4Sh$ax6#UWFk|EWq>u6QpPd@?FZHZUn%x-tPX2}cPSO54v9sK0tmTLu7^c22E|wo?0?L+PkMfuiRKuf-Fa3URiEf7pw((m%z&c>s-Er z#>`gwSD{!9ut&^ta5>N|qHEAB=NTxhf&`CMm&5lM-leD}M$6o@`m8!4X-9L`(y})h`=*>TdRR4)knxqaGG1r zJK~=q@0@$AXPcj<$#!RoZY~F!Gpi6kMW5EJU1-%jrsnND{svzdKiBo1zXT6s;W=W_ zSj?^sKig!7u`!MeI)J~`QJjxBaC<(X-o0Aa@Q z`w9`zV>|clbnvHIJ)(W^a5{UxIG;FAC-<`b8ahtS70m=3?EM_pd2V#&`A+KVf1Y=d z=YO}GeVw=Ou}{e(YZM{R=!{;xFGd$sTS7;e2e$E!#7x zzRs^iCtFjdy%Rj-B;?(W)1@gz58Jzxw4c9&+P$3jdfr3cBi@nDx)AGOhxcZO|7ec! P{?&2vWFJ$yLp^^0O9L;C literal 0 HcmV?d00001 diff --git a/English.lproj/MainMenu.xib b/English.lproj/MainMenu.xib new file mode 100644 index 0000000..2bab507 --- /dev/null +++ b/English.lproj/MainMenu.xib @@ -0,0 +1,3109 @@ + + + + 1050 + 10C540 + 740 + 1038.25 + 458.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 740 + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + NSApplication + + + + FirstResponder + + + NSApplication + + + 279 + 2 + {{404, 229}, {371, 157}} + -260571136 + Midi Keys + NSPanel + + View + + {595, 163} + {371, 163} + + + 256 + + + + 256 + + + + 268 + {{19, 68}, {109, 15}} + + 2 + YES + + -2076049856 + 263168 + + LucidaGrande + 9 + 3614 + + + 109199615 + 1 + + LucidaGrande + 9 + 16 + + + + + + 400 + 75 + + + Channel 1 + + 1048576 + 2147483647 + 1 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + _popUpItemAction: + + + YES + + Channel + + + + + Channel 2 + + 1048576 + 2147483647 + + + _popUpItemAction: + 1 + + + + + Channel 3 + + 2147483647 + + + _popUpItemAction: + 2 + + + + + Channel 4 + + 2147483647 + + + _popUpItemAction: + 3 + + + + + Channel 5 + + 2147483647 + + + _popUpItemAction: + 4 + + + + + Channel 6 + + 2147483647 + + + _popUpItemAction: + 5 + + + + + Channel 7 + + 2147483647 + + + _popUpItemAction: + 6 + + + + + Channel 8 + + 2147483647 + + + _popUpItemAction: + 7 + + + + + Channel 9 + + 2147483647 + + + _popUpItemAction: + 8 + + + + + Channel 10 + + 2147483647 + + + _popUpItemAction: + 9 + + + + + Channel 11 + + 2147483647 + + + _popUpItemAction: + 10 + + + + + Channel 12 + + 2147483647 + + + _popUpItemAction: + 11 + + + + + Channel 13 + + 2147483647 + + + _popUpItemAction: + 12 + + + + + Channel 14 + + 2147483647 + + + _popUpItemAction: + 13 + + + + + Channel 15 + + 2147483647 + + + _popUpItemAction: + 14 + + + + + Channel 16 + + 1048576 + 2147483647 + + + _popUpItemAction: + 15 + + + + + 3 + YES + YES + 1 + + + + + 290 + {371, 57} + + 2 + MidiKeyView + NSView + + + + 268 + {{212, 67}, {102, 15}} + + 2 + YES + + 67501824 + 131072 + + + + + Helvetica + 12 + 16 + + + 127 + 1 + 67.896910000000005 + 0.0 + 0 + 1 + NO + NO + + + + + 268 + {{147, 66}, {50, 17}} + + 2 + YES + + 67239424 + 4194304 + Velocity: + + LucidaGrande + 11 + 3100 + + + + 6 + System + controlColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 6 + System + controlTextColor + + 3 + MAA + + + + + + + 268 + {{330, 62}, {29, 26}} + + 2 + YES + + -2080244224 + 134479872 + + + + 922501375 + 166 + + 549650432 + {1, 1} + + + + + + TU0AKgAAAAoAAAANAQAAAwAAAAEAAQAAAQEAAwAAAAEAAQAAAQIAAwAAAAIACAAIAQMAAwAAAAEAAQAA +AQYAAwAAAAEAAQAAAREABAAAAAEAAAAIARIAAwAAAAEAAQAAARUAAwAAAAEAAgAAARYAAwAAAAEAAQAA +ARcABAAAAAEAAAACARwAAwAAAAEAAQAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA + + + + + + 3 + MCAwAA + + + + + 400 + 75 + + + + {371, 87} + + 2 + NSView + + + + 260 + + + + 268 + {{90, 42}, {211, 15}} + + 2 + YES + + -2076049856 + 263168 + + + 109199615 + 1 + + + + + + 400 + 75 + + + Item1 + + 1048576 + 2147483647 + 1 + + + _popUpItemAction: + + + YES + + Destination + + + + + Item2 + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + Item3 + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + 3 + YES + YES + 1 + + + + + 268 + {{90, 20}, {211, 15}} + + 2 + YES + + -2076049856 + 263168 + + + 109199615 + 1 + + + + + + 400 + 75 + + + Item1 + + 1048576 + 2147483647 + 1 + + + _popUpItemAction: + + + YES + + Listen + + + + + Item2 + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + Item3 + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + 3 + YES + YES + 1 + + + + + 268 + {{17, 22}, {66, 11}} + + 2 + YES + + 67239424 + 4456448 + Listen to port: + + + + + + + + + 268 + {{17, 44}, {57, 11}} + + 2 + YES + + 67239424 + 4456448 + Destination: + + + + + + + + + 256 + {{304, 20}, {49, 18}} + + 2 + YES + + 67239424 + 262144 + Thru + + + 1211912703 + 2 + + NSImage + NSSwitch + + + NSSwitch + + + + 200 + 25 + + + + {{0, 89}, {371, 68}} + + 2 + NSView + + + {371, 157} + + 2 + + {{0, 0}, {1440, 878}} + {371, 179} + {595, 179} + MidiKeys + + + MainMenu + + + + MidiKeys + + 1048576 + 2147483647 + + + submenuAction: + + MidiKeys + + + + About MidiKeys + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Preferences... + , + 1048576 + 2147483647 + + + + + + Check for Updates… + + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Services + + 1048576 + 2147483647 + + + submenuAction: + + + Services + + + _NSServicesMenu + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Hide MidiKeys + h + 1048576 + 2147483647 + + + + + + Hide Others + h + 1572864 + 2147483647 + + + + + + Show All + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Quit MidiKeys + q + 1048576 + 2147483647 + + + + + _NSAppleMenu + + + + + Keys + + 1048576 + 2147483647 + + + submenuAction: + + Keys + + + + Octave Up + u + 1048576 + 2147483647 + + + + + + Octave Down + d + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Global Hot Keys + + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Send All Notes Off + \ + 1048576 + 2147483647 + + + + + + + + + Edit + + 1048576 + 2147483647 + + + submenuAction: + + + Edit + + + + + Undo + z + 1048576 + 2147483647 + + + + + + Redo + Z + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Cut + x + 1048576 + 2147483647 + + + + + + Copy + c + 1048576 + 2147483647 + + + + + + Paste + v + 1048576 + 2147483647 + + + + + + Delete + + 1048576 + 2147483647 + + + + + + Select All + a + 1048576 + 2147483647 + + + + + + + + + Window + + 1048576 + 2147483647 + + + submenuAction: + + + Window + + + + + Minimize + m + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Bring All to Front + + 1048576 + 2147483647 + + + + + _NSWindowsMenu + + + + + Help + + 1048576 + 2147483647 + + + submenuAction: + + Help + + + + MidiKeys Help + ? + 1048576 + 2147483647 + + + + + + + + _NSMainMenu + + + AppController + + + PreferencesController + + + KeyMapManager + + + SUUpdater + + + + + + + performMiniaturize: + + + + 37 + + + + arrangeInFront: + + + + 39 + + + + showHelp: + + + + 122 + + + + terminate: + + + + 139 + + + + orderFrontStandardAboutPanel: + + + + 142 + + + + hideOtherApplications: + + + + 146 + + + + hide: + + + + 152 + + + + unhideAllApplications: + + + + 153 + + + + cut: + + + + 175 + + + + paste: + + + + 176 + + + + redo: + + + + 178 + + + + selectAll: + + + + 179 + + + + undo: + + + + 180 + + + + copy: + + + + 181 + + + + delete: + + + + 195 + + + + destinationPopup + + + + 204 + + + + destinationSelected: + + + + 206 + + + + midiKeys + + + + 209 + + + + velocitySlider + + + + 212 + + + + velocitySliderChanged: + + + + 213 + + + + sourcePopup + + + + 220 + + + + sourceSelected: + + + + 221 + + + + delegate + + + + 231 + + + + octaveUp: + + + + 234 + + + + octaveDown: + + + + 235 + + + + nextKeyView + + + + 238 + + + + nextKeyView + + + + 241 + + + + initialFirstResponder + + + + 242 + + + + showPanel: + + + + 244 + + + + keyMapManager + + + + 246 + + + + delegate + + + + 247 + + + + toggleView + + + + 251 + + + + hiddenItemsView + + + + 255 + + + + midiThruCheckbox + + + + 257 + + + + toggleMidiThru: + + + + 258 + + + + sendAllNotesOff: + + + + 261 + + + + toggleMidiControls: + + + + 277 + + + + _toggleHotKeysMenuItem + + + + 280 + + + + toggleHotKeys: + + + + 281 + + + + checkForUpdates: + + + + 285 + + + + delegate + + + + 286 + + + + nextKeyView + + + + 294 + + + + channelPopup + + + + 308 + + + + channelDidChange: + + + + 310 + + + + + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + 21 + + + + + + Window + + + 2 + + + + + + + + + 250 + + + + + + + + + + + + 208 + + + + + 210 + + + + + + + + 211 + + + + + + + + 254 + + + + + + + + + + + + 198 + + + + + + + + 217 + + + + + + + + 219 + + + + + + + + 236 + + + + + + + + 256 + + + + + + + + 29 + + + + + + + + + + MainMenu + + + 19 + + + + + + + + 24 + + + + + + + + + + 5 + + + + + 23 + + + + + 92 + + + + + 56 + + + + + + + + 57 + + + + + + + + + + + + + + + + + + + 58 + + + + + 129 + + + + + 131 + + + + + + + + 130 + + + + + 134 + + + + + 136 + + + + + 143 + + + + + 144 + + + + + 145 + + + + + 149 + + + + + 150 + + + + + 83 + + + + + + + + 81 + + + + + + + + + + + + + 78 + + + + + 233 + + + + + 259 + + + + + 260 + + + + + 103 + + + + + + + + 106 + + + + + + + + 111 + + + + + 163 + + + + + + + + 169 + + + + + + + + + + + + + + + 156 + + + + + 157 + + + + + 158 + + + + + 160 + + + + + 164 + + + + + 171 + + + + + 172 + + + + + 173 + + + + + 203 + + + AppController + + + 243 + + + PreferencesController + + + 245 + + + KeyMapManager + + + 263 + + + + + 264 + + + + + 268 + + + + + + + + 269 + + + + + + + + 270 + + + + + 271 + + + + + 272 + + + + + 199 + + + + + + + + + + 201 + + + + + 200 + + + + + 197 + + + + + 215 + + + + + + + + + + 218 + + + + + 216 + + + + + 214 + + + + + -3 + + + Application + + + 275 + + + + + + + + 276 + + + + + 278 + + + + + 279 + + + + + 282 + + + + + 283 + + + + + 284 + + + + + 287 + + + + + + + + 288 + + + + + + + + 289 + + + + + + + + + + + + + + + + + + + + + + + 290 + + + + + 291 + + + + + 292 + + + + + 295 + + + + + 296 + + + + + 297 + + + + + 298 + + + + + 299 + + + + + 300 + + + + + 301 + + + + + 302 + + + + + 303 + + + + + 304 + + + + + 305 + + + + + 306 + + + + + 307 + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{929, 1005}, {211, 48}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + {{270, 873}, {371, 157}} + com.apple.InterfaceBuilder.CocoaPlugin + {{270, 873}, {371, 157}} + + + + {595, 163} + {371, 163} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{929, 983}, {211, 48}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + + com.apple.InterfaceBuilder.CocoaPlugin + + + + 72 + 1 + + + + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + {{858, 747}, {109, 243}} + com.apple.InterfaceBuilder.CocoaPlugin + + {{12, 821}, {322, 20}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{24, 618}, {229, 203}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{108, 718}, {200, 103}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + + 310 + + + + + AppController + NSObject + + id + id + id + id + id + id + id + id + id + id + + + NSMenuItem + NSTextField + NSPopUpButton + NSStepper + NSPopUpButton + NSView + KeyMapManager + MidiKeyView + NSButton + NSPopUpButton + NSView + NSSlider + + + IBProjectSource + AppController.h + + + + AppController + NSObject + + IBUserSource + + + + + FirstResponder + NSObject + + sendAllNotesOff: + id + + + IBUserSource + + + + + KeyMapManager + NSObject + + IBProjectSource + KeyMapManager.h + + + + KeyMapManager + NSObject + + IBUserSource + + + + + MidiKeyView + NSView + + mDelegate + id + + + IBProjectSource + MidiKeyView.h + + + + MidiKeyView + NSView + + IBUserSource + + + + + NSObject + + + + NSObject + + IBProjectSource + MidiKeysApplication.h + + + + NSObject + + IBProjectSource + OverlayIndicator.h + + + + NSObject + + IBProjectSource + ShortcutRecorder/SRRecorderCell.h + + + + NSObject + + IBProjectSource + ShortcutRecorder/SRRecorderControl.h + + + + NSObject + + IBProjectSource + ShortcutRecorder/SRValidator.h + + + + PreferencesController + NSWindowController + + id + id + id + id + + + NSButton + NSButton + NSButton + NSWindow + SRRecorderControl + NSButton + NSButton + NSButton + id + NSButton + NSColorWell + NSPopUpButton + NSButton + NSButton + NSButton + NSButton + NSButton + NSSlider + + + IBProjectSource + PreferencesController.h + + + + PreferencesController + NSWindowController + + NSSlider + NSButton + + + IBUserSource + + + + + SRRecorderControl + NSControl + + delegate + id + + + + + SRRecorderControl + + IBUserSource + + + + + + + NSObject + + IBDocumentRelativeSource + ../Sparkle.framework/Versions/A/Headers/SUAppcast.h + + + + NSObject + + IBDocumentRelativeSource + ../Sparkle.framework/Versions/A/Headers/SUUpdater.h + + + + SUUpdater + NSObject + + checkForUpdates: + id + + + delegate + id + + + + + + + NSActionCell + NSCell + + IBFrameworkSource + AppKit.framework/Headers/NSActionCell.h + + + + NSApplication + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSApplication.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSApplicationScripting.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSColorPanel.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSHelpManager.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSPageLayout.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSUserInterfaceItemSearching.h + + + + NSBrowser + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSBrowser.h + + + + NSButton + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSButton.h + + + + NSButtonCell + NSActionCell + + IBFrameworkSource + AppKit.framework/Headers/NSButtonCell.h + + + + NSCell + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSCell.h + + + + NSColorWell + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSColorWell.h + + + + NSControl + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSControl.h + + + + NSFormatter + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFormatter.h + + + + NSMatrix + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSMatrix.h + + + + NSMenu + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSMenu.h + + + + NSMenuItem + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSMenuItem.h + + + + NSMenuItemCell + NSButtonCell + + IBFrameworkSource + AppKit.framework/Headers/NSMenuItemCell.h + + + + NSMovieView + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSMovieView.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSAccessibility.h + + + + NSObject + + + + NSObject + + + + NSObject + + + + NSObject + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSDictionaryController.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSDragging.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSFontManager.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSFontPanel.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSKeyValueBinding.h + + + + NSObject + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSNibLoading.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSOutlineView.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSPasteboard.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSSavePanel.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSTableView.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSToolbarItem.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSView.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSClassDescription.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObjectScripting.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSPortCoder.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptClassDescription.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptObjectSpecifiers.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptWhoseTests.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLDownload.h + + + + NSObject + + IBFrameworkSource + ImageKit.framework/Headers/IKImageBrowserView.h + + + + NSObject + + IBFrameworkSource + ImageKit.framework/Headers/IKSaveOptions.h + + + + NSObject + + IBFrameworkSource + ImageKit.framework/Headers/ImageKitDeprecated.h + + + + NSObject + + IBFrameworkSource + PDFKit.framework/Headers/PDFDocument.h + + + + NSObject + + IBFrameworkSource + PDFKit.framework/Headers/PDFView.h + + + + NSObject + + IBFrameworkSource + QuartzComposer.framework/Headers/QCCompositionParameterView.h + + + + NSObject + + IBFrameworkSource + QuartzComposer.framework/Headers/QCCompositionPickerView.h + + + + NSObject + + IBFrameworkSource + QuartzFilters.framework/Headers/QuartzFilterManager.h + + + + NSObject + + IBFrameworkSource + QuickLookUI.framework/Headers/QLPreviewPanel.h + + + + NSObject + + IBFrameworkSource + Sparkle.framework/Headers/SUAppcast.h + + + + NSObject + + IBFrameworkSource + Sparkle.framework/Headers/SUUpdater.h + + + + NSPanel + NSWindow + + IBFrameworkSource + AppKit.framework/Headers/NSPanel.h + + + + NSPopUpButton + NSButton + + IBFrameworkSource + AppKit.framework/Headers/NSPopUpButton.h + + + + NSPopUpButtonCell + NSMenuItemCell + + IBFrameworkSource + AppKit.framework/Headers/NSPopUpButtonCell.h + + + + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSInterfaceStyle.h + + + + NSResponder + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSResponder.h + + + + NSSlider + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSSlider.h + + + + NSSliderCell + NSActionCell + + IBFrameworkSource + AppKit.framework/Headers/NSSliderCell.h + + + + NSStepper + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSStepper.h + + + + NSTableView + NSControl + + + + NSText + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSText.h + + + + NSTextField + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSTextField.h + + + + NSTextFieldCell + NSActionCell + + IBFrameworkSource + AppKit.framework/Headers/NSTextFieldCell.h + + + + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSClipView.h + + + + NSView + + + + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSRulerView.h + + + + NSView + NSResponder + + + + NSWindow + + IBFrameworkSource + AppKit.framework/Headers/NSDrawer.h + + + + NSWindow + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSWindow.h + + + + NSWindow + + IBFrameworkSource + AppKit.framework/Headers/NSWindowScripting.h + + + + NSWindowController + NSResponder + + showWindow: + id + + + IBFrameworkSource + AppKit.framework/Headers/NSWindowController.h + + + + PDFView + NSView + + id + id + id + id + id + id + id + id + id + id + + + + + QCView + NSView + + id + id + id + + + IBFrameworkSource + QuartzComposer.framework/Headers/QCView.h + + + + SUUpdater + NSObject + + checkForUpdates: + id + + + delegate + id + + + + + + 0 + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + YES + ../MidiKeys.xcodeproj + 3 + + diff --git a/English.lproj/Preferences.xib b/English.lproj/Preferences.xib new file mode 100644 index 0000000..63eacce --- /dev/null +++ b/English.lproj/Preferences.xib @@ -0,0 +1,2137 @@ + + + + 1050 + 11C74 + 1938 + 1138.23 + 567.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 1938 + + + YES + NSCustomView + NSPopUpButton + NSButton + NSMenu + NSButtonCell + NSTextFieldCell + NSMenuItem + NSColorWell + NSTabView + NSSlider + NSSliderCell + NSCustomObject + NSTabViewItem + NSView + NSWindowTemplate + NSTextField + NSPopUpButtonCell + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + + + PluginDependencyRecalculationVersion + + + + YES + + PreferencesController + + + FirstResponder + + + NSApplication + + + 1 + 2 + {{509, 261}, {397, 409}} + 1886914560 + MidiKeys Preferences + NSWindow + + View + + + {213, 107} + + + 256 + + YES + + + 256 + {{299, 12}, {84, 32}} + + + YES + + 67239424 + 134217728 + OK + + LucidaGrande + 13 + 1044 + + + -2038284033 + 1 + + + DQ + 200 + 25 + + + + + 256 + {{215, 12}, {84, 32}} + + + YES + + 67239424 + 134217728 + Cancel + + + -2038284033 + 1 + + + Gw + 200 + 25 + + + + + 256 + {{13, 40}, {371, 363}} + + + + YES + + + + 256 + + YES + + + 256 + + YES + + YES + + NSColor pasteboard type + + + + {{17, 273}, {38, 26}} + + YES + YES + + 1 + MC4wNTgxMzA0OTkgMC4wNTU1NDE4OTkgMQA + + + + + 256 + {{15, 127}, {239, 18}} + + YES + + 67239424 + 0 + Keyboard window is always on top + + + 1211912703 + 2 + + NSSwitch + + + + 200 + 25 + + + + + 256 + {{60, 277}, {165, 17}} + + YES + + 67239424 + 4194304 + Active key highlight color + + + + 6 + System + controlColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 6 + System + controlTextColor + + 3 + MAA + + + + + + + 256 + {{118, 70}, {216, 12}} + + YES + + 67501824 + 262144 + + + + + Helvetica + 12 + 16 + + + 90 + 0.0 + 25 + 0.0 + 0 + 0 + NO + NO + + + + + 256 + {{14, 68}, {93, 17}} + + YES + + 67239424 + 4194304 + Transparency: + + + + + + + + + 256 + {{30, 44}, {202, 18}} + + YES + + 67239424 + 131072 + Opaque when MidiKeys is in front + + LucidaGrande + 11 + 3100 + + + 1211912703 + 2 + + + + 200 + 25 + + + + + 256 + {{30, 183}, {118, 18}} + + YES + + 67239424 + 131072 + Toggling hot keys + + + 1211912703 + 2 + + + + 200 + 25 + + + + + 256 + {{30, 163}, {86, 18}} + + YES + + 67239424 + 131072 + Octave shift + + + 1211912703 + 2 + + + + 200 + 25 + + + + + 256 + {{15, 239}, {114, 18}} + + YES + + 67239424 + 0 + Show key caps + + + 1211912703 + 2 + + + + 200 + 25 + + + + + 256 + {{30, 105}, {191, 18}} + + YES + + 67239424 + 131072 + Click through when not in front + + + 1211912703 + 2 + + + + 200 + 25 + + + + + 268 + {{14, 207}, {195, 17}} + + YES + + 68288064 + 272630784 + Show overlay notifications for: + + + + + + + + {{10, 33}, {351, 317}} + + Display + + + + + + + 256 + + YES + + + 256 + {{79, 271}, {164, 26}} + + + YES + + -2076049856 + 1024 + + + -2038284033 + 1 + + + + + + 400 + 75 + + + US-English + + 1048576 + 2147483647 + 1 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + _popUpItemAction: + + + YES + + + OtherViews + + + YES + + + + UK-English + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + German + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + French + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + 3 + YES + YES + 1 + + + + + 256 + {{14, 277}, {63, 17}} + + + YES + + 67239424 + 4194304 + Key map: + + + + + + + + + 256 + {{15, 239}, {218, 18}} + + + YES + + 67239424 + 0 + Keys are system-wide hot keys + + + 1211912703 + 2 + + + + 200 + 25 + + + + + 256 + {{29, 217}, {74, 18}} + + + YES + + 67239424 + 131072 + ⌃ Control + + + 1211912703 + 2 + + + + 200 + 25 + + + + + 256 + {{29, 197}, {61, 18}} + + + YES + + 67239424 + 131072 + ⇧ Shift + + + 1211912703 + 2 + + + + 200 + 25 + + + + + 256 + {{29, 177}, {73, 18}} + + + YES + + 67239424 + 131072 + ⌥ Option + + + 1211912703 + 2 + + + + 200 + 25 + + + + + 256 + {{29, 157}, {92, 18}} + + + YES + + 67239424 + 131072 + ⌘ Command + + + 1211912703 + 2 + + + + 200 + 25 + + + + + 256 + {{14, 120}, {109, 17}} + + + YES + + 67239424 + 4194304 + Toggle hot keys: + + + + + + + + + 256 + {{14, 81}, {268, 17}} + + + YES + + 67239424 + 4194304 + Note: The arrow keys control octave and velocity. + + + + + + + + + 268 + {{141, 117}, {146, 22}} + + + SRRecorderControl + + + {{10, 33}, {351, 317}} + + + + Keys + + + + + Item 2 + + + 256 + + YES + + + 268 + {{15, 276}, {225, 18}} + + YES + + -2080244224 + 0 + Automatically check for updates + + + 1211912703 + 2 + + NSImage + NSSwitch + + + + + 200 + 25 + + + + + 268 + {{14, 238}, {145, 17}} + + YES + + 68288064 + 272630784 + Update check interval: + + + + + + + + + 268 + {{161, 232}, {100, 26}} + + YES + + -2076049856 + 2048 + + + 109199615 + 129 + + + 400 + 75 + + + Hourly + + 1048576 + 2147483647 + 1 + + + _popUpItemAction: + 3600 + + + YES + + OtherViews + + YES + + + + Daily + + 1048576 + 2147483647 + + + _popUpItemAction: + 86400 + + + + + Weekly + + 1048576 + 2147483647 + + + _popUpItemAction: + 604800 + + + + + Monthly + + 2147483647 + + + _popUpItemAction: + 2629800 + + + + + 1 + YES + YES + 2 + + + + {{10, 33}, {351, 317}} + + Updates + + + + + + + LucidaGrande + 13 + 1558 + + 0 + YES + YES + + YES + + + + + {397, 409} + + + + {{0, 0}, {1440, 878}} + {213, 129} + {10000000000000, 10000000000000} + YES + + + SUUpdater + + + + + YES + + + highlightColourWell + + + + 24 + + + + floatWindowCheckbox + + + + 25 + + + + windowTransparencySlider + + + + 35 + + + + ok: + + + + 40 + + + + cancel: + + + + 41 + + + + solidOnTopCheckbox + + + + 77 + + + + showKeyCapsCheckbox + + + + 81 + + + + keymapPopup + + + + 118 + + + + useHotKeysCheckbox + + + + 119 + + + + controlModifierCheckbox + + + + 120 + + + + shiftModifierCheckbox + + + + 121 + + + + optionModifierCheckbox + + + + 122 + + + + commandModifierCheckbox + + + + 123 + + + + _prefsWindow + + + + 124 + + + + _clickThroughCheckbox + + + + 128 + + + + _hotKeysOverlaysCheckbox + + + + 231 + + + + _octaveShiftOverlaysCheckbox + + + + 232 + + + + keyboardFloatsDidChange: + + + + 235 + + + + window + + + + 241 + + + + delegate + + + + 18 + + + + initialFirstResponder + + + + 67 + + + + nextKeyView + + + + 74 + + + + nextKeyView + + + + 49 + + + + nextKeyView + + + + 72 + + + + nextKeyView + + + + 50 + + + + nextKeyView + + + + 111 + + + + nextKeyView + + + + 109 + + + + nextKeyView + + + + 108 + + + + nextKeyView + + + + 110 + + + + nextKeyView + + + + 112 + + + + value: automaticallyChecksForUpdates + + + + + + value: automaticallyChecksForUpdates + value + automaticallyChecksForUpdates + 2 + + + 208 + + + + selectedTag: updateCheckInterval + + + + + + selectedTag: updateCheckInterval + selectedTag + updateCheckInterval + 2 + + + 212 + + + + enabled: automaticallyChecksForUpdates + + + + + + enabled: automaticallyChecksForUpdates + enabled + automaticallyChecksForUpdates + 2 + + + 213 + + + + + YES + + 0 + + YES + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + 5 + + + YES + + + + PreferencesPanel + + + 6 + + + YES + + + + + + + + 36 + + + YES + + + + + + 37 + + + YES + + + + + + 89 + + + YES + + + + + + + + 90 + + + YES + + + + + + 92 + + + YES + + + + + + + + + + + + + + + + 7 + + + + + 17 + + + YES + + + + + + 29 + + + YES + + + + + + 33 + + + YES + + + + + + 66 + + + YES + + + + + + 76 + + + YES + + + + + + 80 + + + YES + + + + + + 127 + + + YES + + + + + + 91 + + + YES + + + + + + 93 + + + YES + + + + + + + + + + + + + + + 94 + + + YES + + + + + + 100 + + + YES + + + + + + 101 + + + YES + + + + + + 102 + + + YES + + + + + + 103 + + + YES + + + + + + 104 + + + YES + + + + + + 105 + + + YES + + + + + + 130 + + + + + 131 + + + + + 132 + + + + + 133 + + + + + 134 + + + + + 135 + + + + + 136 + + + + + 138 + + + + + 139 + + + + + 140 + + + YES + + + + + + 141 + + + + + 142 + + + + + 143 + + + + + 144 + + + + + 145 + + + + + 146 + + + + + 95 + + + YES + + + + + + + + + 99 + + + + + 98 + + + + + 97 + + + + + 96 + + + + + -3 + + + Application + + + 186 + + + YES + + + + + + 188 + + + + + 189 + + + YES + + + + + + 190 + + + + + 191 + + + YES + + + + + + 192 + + + YES + + + + + + + + 193 + + + + + 194 + + + YES + + + + + + 195 + + + + + 196 + + + YES + + + + + + 197 + + + + + 198 + + + YES + + + + + + 199 + + + YES + + + + + + 200 + + + YES + + + + + + + + + 201 + + + + + 202 + + + + + 203 + + + + + 204 + + + + + 215 + + + YES + + + + + + 216 + + + + + 217 + + + YES + + + + + + 218 + + + + + 237 + + + YES + + + + + + 238 + + + + + 244 + + + + + + + YES + + YES + -1.IBPluginDependency + -2.IBPluginDependency + -3.IBPluginDependency + 100.IBPluginDependency + 101.IBPluginDependency + 102.IBPluginDependency + 103.IBPluginDependency + 104.IBPluginDependency + 105.IBPluginDependency + 127.IBPluginDependency + 130.IBPluginDependency + 131.IBPluginDependency + 132.IBPluginDependency + 133.IBPluginDependency + 134.IBPluginDependency + 135.IBPluginDependency + 136.IBPluginDependency + 138.IBPluginDependency + 139.IBPluginDependency + 140.IBPluginDependency + 141.IBPluginDependency + 142.IBPluginDependency + 143.IBPluginDependency + 144.IBPluginDependency + 145.IBPluginDependency + 146.IBPluginDependency + 17.IBPluginDependency + 186.IBPluginDependency + 188.IBPluginDependency + 189.IBPluginDependency + 190.IBPluginDependency + 191.IBPluginDependency + 192.IBPluginDependency + 193.IBPluginDependency + 194.IBPluginDependency + 195.IBPluginDependency + 196.IBPluginDependency + 197.IBPluginDependency + 198.IBPluginDependency + 199.IBPluginDependency + 200.IBPluginDependency + 201.IBPluginDependency + 202.IBPluginDependency + 203.IBPluginDependency + 204.IBPluginDependency + 215.IBPluginDependency + 216.IBPluginDependency + 217.IBPluginDependency + 218.IBPluginDependency + 237.IBPluginDependency + 238.IBPluginDependency + 244.IBPluginDependency + 29.IBPluginDependency + 33.IBPluginDependency + 36.IBPluginDependency + 37.IBPluginDependency + 5.IBPluginDependency + 5.IBWindowTemplateEditedContentRect + 6.IBPluginDependency + 6.IBUserGuides + 66.IBPluginDependency + 7.IBPluginDependency + 76.IBPluginDependency + 80.IBAttributePlaceholdersKey + 80.IBPluginDependency + 89.IBAttributePlaceholdersKey + 89.IBPluginDependency + 90.IBPluginDependency + 91.IBPluginDependency + 92.IBPluginDependency + 93.IBPluginDependency + 94.IBPluginDependency + 95.IBPluginDependency + 96.IBPluginDependency + 97.IBPluginDependency + 98.IBPluginDependency + 99.IBPluginDependency + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{181, 636}, {397, 409}} + com.apple.InterfaceBuilder.CocoaPlugin + + YES + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Show key characters on the MIDI keyboard keys. + + + com.apple.InterfaceBuilder.CocoaPlugin + + InitialTabViewItem + + InitialTabViewItem + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + YES + + + + + + YES + + + + + 244 + + + + YES + + PreferencesController + NSWindowController + + YES + + YES + cancel: + keyboardFloatsDidChange: + ok: + + + YES + id + id + id + + + + YES + + YES + cancel: + keyboardFloatsDidChange: + ok: + + + YES + + cancel: + id + + + keyboardFloatsDidChange: + id + + + ok: + id + + + + + YES + + YES + _clickThroughCheckbox + _hotKeysOverlaysCheckbox + _octaveShiftOverlaysCheckbox + _prefsWindow + _toggleHotKeysShortcut + _velocityOverlaysCheckbox + commandModifierCheckbox + controlModifierCheckbox + delegate + floatWindowCheckbox + highlightColourWell + keymapPopup + optionModifierCheckbox + shiftModifierCheckbox + showKeyCapsCheckbox + solidOnTopCheckbox + useHotKeysCheckbox + windowTransparencySlider + + + YES + NSButton + NSButton + NSButton + NSWindow + SRRecorderControl + NSButton + NSButton + NSButton + id + NSButton + NSColorWell + NSPopUpButton + NSButton + NSButton + NSButton + NSButton + NSButton + NSSlider + + + + YES + + YES + _clickThroughCheckbox + _hotKeysOverlaysCheckbox + _octaveShiftOverlaysCheckbox + _prefsWindow + _toggleHotKeysShortcut + _velocityOverlaysCheckbox + commandModifierCheckbox + controlModifierCheckbox + delegate + floatWindowCheckbox + highlightColourWell + keymapPopup + optionModifierCheckbox + shiftModifierCheckbox + showKeyCapsCheckbox + solidOnTopCheckbox + useHotKeysCheckbox + windowTransparencySlider + + + YES + + _clickThroughCheckbox + NSButton + + + _hotKeysOverlaysCheckbox + NSButton + + + _octaveShiftOverlaysCheckbox + NSButton + + + _prefsWindow + NSWindow + + + _toggleHotKeysShortcut + SRRecorderControl + + + _velocityOverlaysCheckbox + NSButton + + + commandModifierCheckbox + NSButton + + + controlModifierCheckbox + NSButton + + + delegate + id + + + floatWindowCheckbox + NSButton + + + highlightColourWell + NSColorWell + + + keymapPopup + NSPopUpButton + + + optionModifierCheckbox + NSButton + + + shiftModifierCheckbox + NSButton + + + showKeyCapsCheckbox + NSButton + + + solidOnTopCheckbox + NSButton + + + useHotKeysCheckbox + NSButton + + + windowTransparencySlider + NSSlider + + + + + IBProjectSource + ./Classes/PreferencesController.h + + + + SRRecorderControl + NSControl + + delegate + id + + + delegate + + delegate + id + + + + IBProjectSource + ./Classes/SRRecorderControl.h + + + + SUUpdater + NSObject + + checkForUpdates: + id + + + checkForUpdates: + + checkForUpdates: + id + + + + delegate + id + + + delegate + + delegate + id + + + + IBProjectSource + ./Classes/SUUpdater.h + + + + + 0 + IBCocoaFramework + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 + + + YES + 3 + + YES + + YES + NSMenuCheckmark + NSMenuMixedState + NSSwitch + + + YES + {9, 8} + {7, 2} + {15, 15} + + + + diff --git a/English.lproj/ReadMe.rtf b/English.lproj/ReadMe.rtf new file mode 100644 index 0000000..97d855e --- /dev/null +++ b/English.lproj/ReadMe.rtf @@ -0,0 +1,78 @@ +{\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica-Bold;\f1\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\vieww12000\viewh16200\viewkind0 +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural + +\f0\b\fs32 \cf0 MidiKeys 1.6 +\f1\b0\fs24 \ + +\fs20 Copyright \'a9 2002-2003 Chris Reed. All rights reserved. +\fs24 \ +\ +\ + +\f0\b\fs26 Introduction +\f1\b0\fs24 \ +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.\ +\ +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.\ +\ + +\f0\b\fs26 Requirements +\f1\b0\fs24 \ +\'a5 Mac OS X 10.2 or greater\ +\'a5 Software synthesizer, MIDI sequencer application, or external MIDI device with MIDI interface\ +\ + +\f0\b\fs26 Installation +\f1\b0\fs24 \ +Just copy the MidiKeys program to the Applications folder of your choice.\ +\ + +\f0\b\fs26 Using MidiKeys +\f1\b0\fs24 \ +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.)\ +\ +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.\ +\ +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\'c9it just won't work.\ +\ +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.\ +\ +To access lower or higher notes, use the Octave Up and Octave Down commands in the Keys menu. Up to two octaves up or down are allowed. 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.\ +\ + +\f0\b\fs26 Preferences +\f1\b0\fs24 \ +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.\ +\ +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.\ +\ +Two key maps comes with MidiKeys. The "Full" key map maps just over two octaves onto the computer keyboard. The rows that start with ZXCV and QWER for the white keys and the black keys are represented by the rows that start with ASDF and 1234. The "Single" key map just uses rows z and a. The keys are the same; it's just one octave instead of two. The "Upper Single" key map plays the same octave as the Single key map, but it uses the QWER and 1234 rows instead. The key map named "Reversed Full" simply swaps the octaves played by the "Full" key map.\ +\ +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\'d1it varies with the OS version and other software you have installed, or you may simply want to reduce the number of hot keys.\ +\ +The checkboxes below the hot keys checkbox allow you to select which modifier keys must be held down to access the keyboard. At least one modifier has to be selected. And before you ask, the alpha lock is not supported by the OS, sorry. (That's also why there has to be at least one modifier.)\ +\ +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.\ +\ + +\f0\b\fs26 Known Issues +\f1\b0\fs24 \ +\'a5 There seems to be a limit of 6 concurrent keypresses on some desktop systems and/or keyboards. But my PowerBook can handle at least 8 keypresses simultaneously.\ +\'a5 Even ignoring the hardware limit on concurrent keypresses, it takes approximately 25-30 ms to process each key down event. So if you press 6 keys at once, there wil 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.\ +\'a5 Some key combinations cannot be used as hotkeys. I doubt there's anything I can do about this.\ +\'a5 Some sequencer applications apparently do not process MIDI while in the background. For example, Intuem apprently does not. You must use the window floating and hot keys options to work around this.\ +\ + +\f0\b\fs26 Miscellaneous Notes +\f1\b0\fs24 \ +You use MidiKeys at your own risk. I am not responsible for anything that does or does not happen to you or your computer system as a result of using MidiKeys. If you get carpal tunnel syndrome because while trying to play Bach on your laptop, that's your problem.\ +\ +MidiKeys is freeware, but it is not in the public domain. At this time, I am not considering releasing the source code. That may change in the future, but don't bother asking.\ +\ +Special thanks to Richard Zelzer and Ralf Welter for providing the German translation, and Fred ? for the French localisation. If you would like to see MidiKeys localised in your favourite language, I'll be happy to do so as long as you provide the translations.\ +\ +I can be reached via email at flit@ftml.net.\ +} \ No newline at end of file diff --git a/French.lproj/Credits.html b/French.lproj/Credits.html new file mode 100644 index 0000000..c59ecf6 --- /dev/null +++ b/French.lproj/Credits.html @@ -0,0 +1,40 @@ + +

Ecrit par:
+   Chris Reed <creed@manyetas.com>
+   http://www.manyetas.com/

+ +

Localisation allemande:
+   Richard Zelzer
+   http://www.zmusik.de/
+   Ralf Welter <i_see@macnews.de>

+ +

Localisation française:
+   Frédéric Ballériaux

+ +

Localisation japonaise:
+   Hiroshi Yamato
+   http://salvageship.dropcontrol.com/

+ +

Localisation espanaise:
+   Fernando Díaz de la Torre
+ +

Merci à:
+   Airy André
+   Skye Ashbrook
+   Frédéric Ballériaux
+   Damon
+   Fernando Díaz de la Torre
+   Alexander Guy
+   Magnus Helin
+   Michael Keuter
+   Norbert Rittel
+   Ralf Welter
+   rasda
+   Adrian Steiger
+   tdc
+   Jon Wight
+   Hiroshi Yamato
+   xonox
+   Richard Zelzer
+

+ \ No newline at end of file diff --git a/French.lproj/InfoPlist.strings b/French.lproj/InfoPlist.strings new file mode 100644 index 0000000000000000000000000000000000000000..80759e64725785f65e2dfa476d92dc2935f99a81 GIT binary patch literal 540 zcmbV}%WlFj5Jm5ruZXflln_=(RTpg}9)hwUQuirIC?XH!@DTl@{$%NKioz!9qO!&_ z9$(+NGroR%>dMhVrPhj+X{%2qipibuMirS-1>V7@>@!X&abNoyU+F-02l`T@y7JUv z1sdx`N6<02L`(Q{yrU<~)ho;~Hov`e_1N+%)CaW;HQvD8^@L;$uM2G&MjuThy~~Ha zjcWqKq0#?0Ll4$~%6q!9bvEd*eSTp>4Ol}x)R9kYr;@WuqL4iWd!}DQ#r{prlA9^> s$jKL4aTC#hgkC$Hwpzb)YP<1o}h?!c?VhA*r zkdB64Y-OSl@tv7c(NcViy>C}v$eU7yEoGoJBD!WBq++ZirIp;I)x30I3@6mk(3;4BdTwXR7J(;ncqS;`3<8~FplJAC? za~q@chBLNlkE{4Qot(TXmpsDX*uHp1ea*L6n{jGhB_pW`oECq=A=p=2!RtJ2zfI9x z*>6WB_qb#``r4K}#`Cp%8MgF^w_?zeBKnASOAHCa56EYB=Go1A@jaHD+~+oA=NPQk zPqtJLV~11hA9aqpMbQ;R*+8%D0-kE$`d8yPX1oc{8mRz3W^@TJcEtjY`lR5*{tNui ziLRvIl&!i${TcgbD4UZg%a zj+`R~yU-i2fbh~hs#?MzO_;oITO6vwsUxO6rhd{?$7)=`*QU^pQa1!9f6D!h^U7Y@ zfxYHSmC@dLIO+XLY&^DZhenIrTQ6ao<~dHYHp9#=?Hw`9!L7HQcJ@5iz`i`Ru=CTx K^JmaK8~p + + + 1060 + 10C540 + 740 + 1038.25 + 458.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 740 + + + YES + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + + + YES + + YES + + + YES + + + + YES + + + NSApplication + + + + FirstResponder + + + NSApplication + + + 263 + 2 + {{76, 609}, {371, 157}} + 1886912512 + Midi Keys + NSWindow + + View + + {595, 157} + {371, 157} + + + 256 + + YES + + + 256 + + YES + + + 290 + {371, 57} + + + MidiKeyView + NSView + + + + 268 + {{233, 67}, {118, 15}} + + + YES + + 67501824 + 131072 + + + + + Helvetica + 12 + 16 + + + 127 + 1 + 64 + 0.0 + 0 + 1 + NO + NO + + + + + 268 + {{87, 67}, {31, 19}} + + + YES + + -2075001280 + 4195328 + 1 + + LucidaGrande + 11 + 3100 + + + YES + + 6 + System + textBackgroundColor + + 3 + MQA + + + + 6 + System + textColor + + 3 + MAA + + + + + + + 268 + {{17, 69}, {68, 14}} + + + YES + + 67239424 + 4194304 + Canal: + + + + 6 + System + controlColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 6 + System + controlTextColor + + + + + + + 268 + {{172, 69}, {60, 14}} + + + YES + + 67239424 + 4194304 + VsOpbG9jaXTDqToKA + + + + + + + + + 268 + {{123, 62}, {19, 27}} + + + YES + + 917024 + 0 + + 1 + 1 + 16 + 1 + YES + + + + {371, 92} + + + NSView + + + + 256 + + YES + + + 268 + {{123, 27}, {178, 22}} + + + YES + + -2076049856 + 132096 + + + 109199615 + 1 + + + + + + + + 400 + 75 + + + Item1 + + 1048576 + 2147483647 + 1 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + _popUpItemAction: + + + YES + + + OtherViews + + + YES + + + + Item2 + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + Item3 + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + 3 + YES + YES + 1 + + + + + 268 + {{123, 2}, {178, 22}} + + + YES + + -2076049856 + 132096 + + + 109199615 + 1 + + + + + + + + 400 + 75 + + + Item1 + + 1048576 + 2147483647 + 1 + + + _popUpItemAction: + + + YES + + + OtherViews + + + YES + + + + Item2 + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + Item3 + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + 3 + YES + YES + 1 + + + + + 268 + {{17, 8}, {107, 14}} + + + YES + + 67239424 + 4194304 + Port à écouter: + + + + + + + + + 268 + {{17, 33}, {107, 14}} + + + YES + + 67239424 + 4194304 + Destination: + + + + + + + + + 256 + {{305, 7}, {48, 16}} + + + YES + + 67239424 + 131072 + Thru + + + 1211912703 + 2 + + NSSwitch + + + + 200 + 25 + + + + {{0, 89}, {371, 68}} + + + NSView + + + {371, 157} + + + + {{0, 0}, {1280, 832}} + {371, 179} + {595, 179} + MidiKeys + + + MainMenu + + YES + + + MidiKeys + + 1048576 + 2147483647 + + + submenuAction: + + MidiKeys + + YES + + + À propos de MidiKeys + + 2147483647 + + + + + + Préférences... + , + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Services + + 1048576 + 2147483647 + + + submenuAction: + + + Services + + + YES + + _NSServicesMenu + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Masquer MidiKeys + h + 1048576 + 2147483647 + + + + + + Masquer les autres + h + 1572864 + 2147483647 + + + + + + Tout afficher + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Quitter MidiKeys + q + 1048576 + 2147483647 + + + + + _NSAppleMenu + + + + + Clavier + + 1048576 + 2147483647 + + + submenuAction: + + Clavier + + YES + + + Octave Supérieure + u + 1048576 + 2147483647 + + + + + + Octave Inférieure + d + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Stopper toutes les notes + \ + 1048576 + 2147483647 + + + + + + + + + Édition + + 1048576 + 2147483647 + + + submenuAction: + + Édition + + YES + + + Annuler + z + 1048576 + 2147483647 + + + + + + Rétablir + Z + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Couper + x + 1048576 + 2147483647 + + + + + + Copier + c + 1048576 + 2147483647 + + + + + + Coller + v + 1048576 + 2147483647 + + + + + + Supprimer + + 1048576 + 2147483647 + + + + + + Tout sélectionner + a + 1048576 + 2147483647 + + + + + + + + + Fenêtre + + 1048576 + 2147483647 + + + submenuAction: + + Fenêtre + + YES + + + Masquer + m + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Tout ramener au premier plan + + 1048576 + 2147483647 + + + + + _NSWindowsMenu + + + + + Aide + + 1048576 + 2147483647 + + + submenuAction: + + Aide + + YES + + + Aide MidiKeys + ? + 1048576 + 2147483647 + + + + + + + + _NSMainMenu + + + AppController + + + PreferencesController + + + KeyMapManager + + + + + YES + + + showHelp: + + + + 122 + + + + terminate: + + + + 139 + + + + orderFrontStandardAboutPanel: + + + + 142 + + + + hideOtherApplications: + + + + 146 + + + + hide: + + + + 152 + + + + unhideAllApplications: + + + + 153 + + + + destinationPopup + + + + 204 + + + + destinationSelected: + + + + 206 + + + + midiKeys + + + + 209 + + + + velocitySlider + + + + 212 + + + + velocitySliderChanged: + + + + 213 + + + + sourcePopup + + + + 220 + + + + sourceSelected: + + + + 221 + + + + channelField + + + + 228 + + + + channelStepper + + + + 229 + + + + channelDidChange: + + + + 230 + + + + delegate + + + + 231 + + + + octaveUp: + + + + 234 + + + + octaveDown: + + + + 235 + + + + nextKeyView + + + + 238 + + + + nextKeyView + + + + 239 + + + + nextKeyView + + + + 240 + + + + nextKeyView + + + + 241 + + + + initialFirstResponder + + + + 242 + + + + showPanel: + + + + 244 + + + + keyMapManager + + + + 246 + + + + delegate + + + + 247 + + + + toggleView + + + + 251 + + + + hiddenItemsView + + + + 255 + + + + midiThruCheckbox + + + + 257 + + + + toggleMidiThru: + + + + 258 + + + + sendAllNotesOff: + + + + 261 + + + + performMiniaturize: + + + + 274 + + + + arrangeInFront: + + + + 275 + + + + cut: + + + + 303 + + + + paste: + + + + 305 + + + + undo: + + + + 306 + + + + delete: + + + + 309 + + + + selectAll: + + + + 311 + + + + redo: + + + + 312 + + + + copy: + + + + 313 + + + + + YES + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + 21 + + + YES + + + + Window + + + 2 + + + YES + + + + + + + 250 + + + YES + + + + + + + + + + + 208 + + + + + 210 + + + YES + + + + + + 211 + + + YES + + + + + + 222 + + + YES + + + + + + 223 + + + YES + + + + + + 225 + + + YES + + + + + + 254 + + + YES + + + + + + + + + + 198 + + + YES + + + + + + 217 + + + YES + + + + + + 219 + + + YES + + + + + + 236 + + + YES + + + + + + 256 + + + YES + + + + + + 29 + + + YES + + + + + + + + MainMenu + + + 56 + + + YES + + + + + + 57 + + + YES + + + + + + + + + + + + + + + 58 + + + + + 129 + + + + + 131 + + + YES + + + + + + 130 + + + + + 134 + + + + + 136 + + + + + 143 + + + + + 144 + + + + + 145 + + + + + 149 + + + + + 150 + + + + + 83 + + + YES + + + + + + 81 + + + YES + + + + + + + + + 78 + + + + + 233 + + + + + 259 + + + + + 260 + + + + + 103 + + + YES + + + + + + 106 + + + YES + + + + + + 111 + + + + + 271 + + + YES + + + + + + 269 + + + YES + + + + + + + + 270 + + + + + 272 + + + + + 273 + + + + + 284 + + + YES + + + + + + 297 + + + YES + + + + + + + + + + + + + 277 + + + + + 279 + + + + + 283 + + + + + 289 + + + + + 295 + + + + + 296 + + + + + 298 + + + + + 301 + + + + + 203 + + + AppController + + + 243 + + + PreferencesController + + + 245 + + + KeyMapManager + + + 316 + + + + + 317 + + + + + 318 + + + + + 319 + + + + + 320 + + + + + 321 + + + YES + + + + + + 322 + + + YES + + + + + + 323 + + + + + 324 + + + + + 325 + + + + + 199 + + + YES + + + + + + + + 201 + + + + + 200 + + + + + 197 + + + + + 215 + + + YES + + + + + + + + 218 + + + + + 216 + + + + + 214 + + + + + -3 + + + Application + + + + + YES + + YES + 103.IBPluginDependency + 103.ImportedFromIB2 + 106.IBPluginDependency + 106.ImportedFromIB2 + 111.IBPluginDependency + 111.ImportedFromIB2 + 129.IBPluginDependency + 129.ImportedFromIB2 + 130.IBPluginDependency + 130.ImportedFromIB2 + 131.IBPluginDependency + 131.ImportedFromIB2 + 134.IBPluginDependency + 134.ImportedFromIB2 + 136.IBPluginDependency + 136.ImportedFromIB2 + 143.IBPluginDependency + 143.ImportedFromIB2 + 144.IBPluginDependency + 144.ImportedFromIB2 + 145.IBPluginDependency + 145.ImportedFromIB2 + 149.IBPluginDependency + 149.ImportedFromIB2 + 150.IBPluginDependency + 150.ImportedFromIB2 + 197.IBPluginDependency + 197.ImportedFromIB2 + 198.IBPluginDependency + 198.ImportedFromIB2 + 199.IBPluginDependency + 199.ImportedFromIB2 + 2.IBPluginDependency + 2.ImportedFromIB2 + 200.IBPluginDependency + 200.ImportedFromIB2 + 201.IBPluginDependency + 201.ImportedFromIB2 + 203.ImportedFromIB2 + 208.IBPluginDependency + 208.ImportedFromIB2 + 21.IBEditorWindowLastContentRect + 21.IBPluginDependency + 21.IBWindowTemplateEditedContentRect + 21.ImportedFromIB2 + 21.windowTemplate.hasMaxSize + 21.windowTemplate.hasMinSize + 21.windowTemplate.maxSize + 21.windowTemplate.minSize + 210.IBPluginDependency + 210.ImportedFromIB2 + 211.IBPluginDependency + 211.ImportedFromIB2 + 214.IBPluginDependency + 214.ImportedFromIB2 + 215.IBPluginDependency + 215.ImportedFromIB2 + 216.IBPluginDependency + 216.ImportedFromIB2 + 217.IBPluginDependency + 217.ImportedFromIB2 + 218.IBPluginDependency + 218.ImportedFromIB2 + 219.IBPluginDependency + 219.ImportedFromIB2 + 222.IBPluginDependency + 222.ImportedFromIB2 + 223.IBPluginDependency + 223.ImportedFromIB2 + 225.IBPluginDependency + 225.ImportedFromIB2 + 233.IBPluginDependency + 233.ImportedFromIB2 + 236.IBPluginDependency + 236.ImportedFromIB2 + 243.ImportedFromIB2 + 245.ImportedFromIB2 + 250.IBPluginDependency + 250.ImportedFromIB2 + 254.IBPluginDependency + 254.ImportedFromIB2 + 256.IBPluginDependency + 256.ImportedFromIB2 + 259.IBPluginDependency + 259.ImportedFromIB2 + 260.IBPluginDependency + 260.ImportedFromIB2 + 269.IBPluginDependency + 269.ImportedFromIB2 + 270.IBPluginDependency + 270.ImportedFromIB2 + 271.IBPluginDependency + 271.ImportedFromIB2 + 272.IBPluginDependency + 272.ImportedFromIB2 + 273.IBPluginDependency + 273.ImportedFromIB2 + 277.IBPluginDependency + 277.ImportedFromIB2 + 279.IBPluginDependency + 279.ImportedFromIB2 + 283.IBPluginDependency + 283.ImportedFromIB2 + 284.IBPluginDependency + 284.ImportedFromIB2 + 289.IBPluginDependency + 289.ImportedFromIB2 + 29.IBEditorWindowLastContentRect + 29.IBPluginDependency + 29.ImportedFromIB2 + 295.IBPluginDependency + 295.ImportedFromIB2 + 296.IBPluginDependency + 296.ImportedFromIB2 + 297.IBPluginDependency + 297.ImportedFromIB2 + 298.IBPluginDependency + 298.ImportedFromIB2 + 301.IBPluginDependency + 301.ImportedFromIB2 + 56.IBPluginDependency + 56.ImportedFromIB2 + 57.IBPluginDependency + 57.ImportedFromIB2 + 58.IBPluginDependency + 58.ImportedFromIB2 + 78.IBPluginDependency + 78.ImportedFromIB2 + 81.IBPluginDependency + 81.ImportedFromIB2 + 83.IBPluginDependency + 83.ImportedFromIB2 + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + {{21, 932}, {371, 157}} + com.apple.InterfaceBuilder.CocoaPlugin + {{21, 932}, {371, 157}} + + + + {595, 157} + {371, 157} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{42, 1068}, {357, 20}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + + + YES + + + YES + + + + + YES + + + YES + + + + 356 + + + + YES + + AppController + NSObject + + YES + + YES + channelDidChange: + destinationSelected: + octaveDown: + octaveUp: + sendAllNotesOff: + showPreferences: + sourceSelected: + toggleHotKeys: + toggleMidiControls: + toggleMidiThru: + velocitySliderChanged: + + + YES + id + id + id + id + id + id + id + id + id + id + id + + + + YES + + YES + _toggleHotKeysMenuItem + channelField + channelStepper + destinationPopup + hiddenItemsView + keyMapManager + midiKeys + midiThruCheckbox + sourcePopup + toggleView + velocitySlider + + + YES + NSMenuItem + NSTextField + NSStepper + NSPopUpButton + NSView + KeyMapManager + MidiKeyView + NSButton + NSPopUpButton + NSView + NSSlider + + + + IBProjectSource + AppController.h + + + + AppController + NSObject + + IBUserSource + + + + + FirstResponder + + sendAllNotesOff: + id + + + IBUserSource + + + + + KeyMapManager + NSObject + + IBProjectSource + KeyMapManager.h + + + + KeyMapManager + NSObject + + IBUserSource + + + + + MidiKeyView + NSView + + mDelegate + id + + + IBProjectSource + MidiKeyView.h + + + + MidiKeyView + NSView + + IBUserSource + + + + + NSObject + + + + NSObject + + IBProjectSource + MidiKeysApplication.h + + + + NSObject + + IBProjectSource + OverlayIndicator.h + + + + NSObject + + IBProjectSource + ShortcutRecorder.h + + + + NSObject + + IBProjectSource + ShortcutRecorderCell.h + + + + PreferencesController + NSObject + + YES + + YES + cancel: + ok: + showPanel: + + + YES + id + id + id + + + + YES + + YES + _clickThroughCheckbox + _octaveDownHotKeysShortcut + _octaveUpHotKeysShortcut + _prefsWindow + _toggleHotKeysShortcut + _velocityDownHotKeysShortcut + _velocityUpHotKeysShortcut + commandModifierCheckbox + controlModifierCheckbox + floatWindowCheckbox + highlightColourWell + keymapPopup + optionModifierCheckbox + shiftModifierCheckbox + showKeyCapsCheckbox + showNotificationOverlaysCheckbox + solidOnTopCheckbox + useHotKeysCheckbox + windowTransparencySlider + + + YES + NSButton + ShortcutRecorder + ShortcutRecorder + NSWindow + ShortcutRecorder + ShortcutRecorder + ShortcutRecorder + NSButton + NSButton + NSButton + NSColorWell + NSPopUpButton + NSButton + NSButton + NSButton + NSButton + NSButton + NSButton + NSSlider + + + + IBProjectSource + PreferencesController.h + + + + PreferencesController + NSObject + + YES + + YES + transparencySlider + useHotkeysCheckbox + + + YES + NSSlider + NSButton + + + + IBUserSource + + + + + ShortcutRecorder + NSControl + + delegate + id + + + + + + YES + + NSActionCell + NSCell + + IBFrameworkSource + AppKit.framework/Headers/NSActionCell.h + + + + NSApplication + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSApplication.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSApplicationScripting.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSColorPanel.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSHelpManager.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSPageLayout.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSUserInterfaceItemSearching.h + + + + NSBrowser + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSBrowser.h + + + + NSButton + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSButton.h + + + + NSButtonCell + NSActionCell + + IBFrameworkSource + AppKit.framework/Headers/NSButtonCell.h + + + + NSCell + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSCell.h + + + + NSColorWell + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSColorWell.h + + + + NSControl + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSControl.h + + + + NSFormatter + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFormatter.h + + + + NSMatrix + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSMatrix.h + + + + NSMenu + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSMenu.h + + + + NSMenuItem + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSMenuItem.h + + + + NSMenuItemCell + NSButtonCell + + IBFrameworkSource + AppKit.framework/Headers/NSMenuItemCell.h + + + + NSMovieView + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSMovieView.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSAccessibility.h + + + + NSObject + + + + NSObject + + + + NSObject + + + + NSObject + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSDictionaryController.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSDragging.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSFontManager.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSFontPanel.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSKeyValueBinding.h + + + + NSObject + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSNibLoading.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSOutlineView.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSPasteboard.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSSavePanel.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSTableView.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSToolbarItem.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSView.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSClassDescription.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObjectScripting.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSPortCoder.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptClassDescription.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptObjectSpecifiers.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptWhoseTests.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLDownload.h + + + + NSObject + + IBFrameworkSource + Sparkle.framework/Headers/SUAppcast.h + + + + NSObject + + IBFrameworkSource + Sparkle.framework/Headers/SUUpdater.h + + + + NSPopUpButton + NSButton + + IBFrameworkSource + AppKit.framework/Headers/NSPopUpButton.h + + + + NSPopUpButtonCell + NSMenuItemCell + + IBFrameworkSource + AppKit.framework/Headers/NSPopUpButtonCell.h + + + + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSInterfaceStyle.h + + + + NSResponder + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSResponder.h + + + + NSSlider + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSSlider.h + + + + NSSliderCell + NSActionCell + + IBFrameworkSource + AppKit.framework/Headers/NSSliderCell.h + + + + NSStepper + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSStepper.h + + + + NSStepperCell + NSActionCell + + IBFrameworkSource + AppKit.framework/Headers/NSStepperCell.h + + + + NSTableView + NSControl + + + + NSText + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSText.h + + + + NSTextField + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSTextField.h + + + + NSTextFieldCell + NSActionCell + + IBFrameworkSource + AppKit.framework/Headers/NSTextFieldCell.h + + + + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSClipView.h + + + + NSView + + + + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSRulerView.h + + + + NSView + NSResponder + + + + NSWindow + + IBFrameworkSource + AppKit.framework/Headers/NSDrawer.h + + + + NSWindow + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSWindow.h + + + + NSWindow + + IBFrameworkSource + AppKit.framework/Headers/NSWindowScripting.h + + + + + 0 + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 + + + YES + ../MidiKeys.xcodeproj + 3 + + diff --git a/French.lproj/Preferences.xib b/French.lproj/Preferences.xib new file mode 100644 index 0000000..b128efd --- /dev/null +++ b/French.lproj/Preferences.xib @@ -0,0 +1,1271 @@ + + + + 1060 + 10C540 + 740 + 1038.25 + 458.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 740 + + + YES + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + + + YES + + YES + + + YES + + + + YES + + PreferencesController + + + FirstResponder + + + NSApplication + + + 1 + 2 + {{76, 160}, {348, 407}} + 1886912512 + Préférences MidiKeys + NSWindow + + View + + {1.79769e+308, 1.79769e+308} + {213, 107} + + + 256 + + YES + + + 256 + + YES + + YES + + NSColor pasteboard type + + + + {{242, 361}, {38, 26}} + + YES + YES + + 1 + MC4wNTgxMzA0OTg5OCAwLjA1NTU0MTg5OTA2IDEAA + + + + + 256 + {{143, 276}, {163, 26}} + + YES + + -2076049856 + 1024 + + LucidaGrande + 13 + 1044 + + + -2038284033 + 1 + + + + + + 400 + 75 + + + US-English + + 1048576 + 2147483647 + 1 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + _popUpItemAction: + + + YES + + + OtherViews + + + YES + + + + UK-English + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + German + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + French + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + 3 + YES + YES + 1 + + + + + 256 + {{42, 282}, {99, 17}} + + YES + + 67239424 + 4194304 + Config. clavier: + + + + 6 + System + controlColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 6 + System + controlTextColor + + 3 + MAA + + + + + + + 256 + {{43, 244}, {218, 18}} + + YES + + 67239424 + 0 + Clavier actif à l'arrière-plan + + + 1211912703 + 2 + + NSSwitch + + + + 200 + 25 + + + + + 256 + {{43, 125}, {239, 18}} + + YES + + 67239424 + 0 + Clavier toujours au-dessus + + + 1211912703 + 2 + + + + 200 + 25 + + + + + 256 + {{58, 319}, {245, 17}} + + YES + + 67501824 + 131072 + + + + + Helvetica + 12 + 16 + + + 100 + 0.0 + 75 + 0.0 + 10 + 0 + NO + NO + + + + + 256 + {{55, 344}, {80, 14}} + + YES + + 67239424 + 4194304 + Transparence: + + LucidaGrande + 11 + 3100 + + + + + + + + + 256 + {{42, 366}, {195, 17}} + + YES + + 67239424 + 4194304 + Couleur des touches actives: + + + + + + + + + 256 + {{58, 80}, {245, 17}} + + YES + + 67501824 + 131072 + + + + + + 100 + 0.0 + 75 + 0.0 + 10 + 0 + NO + NO + + + + + 256 + {{225, 12}, {84, 32}} + + YES + + 67239424 + 134217728 + OK + + + -2038284033 + 1 + + + DQ + 200 + 25 + + + + + 256 + {{138, 12}, {90, 32}} + + YES + + 67239424 + 134217728 + Annuler + + + -2038284033 + 1 + + + Gw + 200 + 25 + + + + + 256 + {{57, 224}, {74, 16}} + + YES + + 67239424 + 131072 + ⌃ Control + + + 1211912703 + 2 + + + + 200 + 25 + + + + + 256 + {{57, 204}, {61, 16}} + + YES + + 67239424 + 131072 + ⇧ Maj. + + + 1211912703 + 2 + + + + 200 + 25 + + + + + 256 + {{57, 184}, {73, 16}} + + YES + + 67239424 + 131072 + ⌥ Option + + + 1211912703 + 2 + + + + 200 + 25 + + + + + 256 + {{57, 164}, {92, 16}} + + YES + + 67239424 + 131072 + ⌘ Command + + + 1211912703 + 2 + + + + 200 + 25 + + + + + 256 + {{55, 105}, {80, 14}} + + YES + + 67239424 + 4194304 + Transparence: + + + + + + + + + 256 + {{57, 58}, {248, 16}} + + YES + + 67239424 + 131072 + Opaque quand MidiKeys est à l'avant-plan + + + 1211912703 + 2 + + + + 200 + 25 + + + + {348, 407} + + {{0, 0}, {1280, 832}} + {213, 129} + {1.79769e+308, 1.79769e+308} + + + + + YES + + + delegate + + + + 18 + + + + keymapPopup + + + + 23 + + + + highlightColourWell + + + + 24 + + + + floatWindowCheckbox + + + + 25 + + + + useHotKeysCheckbox + + + + 26 + + + + transparencySlider + + + + 32 + + + + windowTransparencySlider + + + + 35 + + + + ok: + + + + 40 + + + + cancel: + + + + 41 + + + + nextKeyView + + + + 49 + + + + nextKeyView + + + + 50 + + + + controlModifierCheckbox + + + + 56 + + + + shiftModifierCheckbox + + + + 57 + + + + optionModifierCheckbox + + + + 58 + + + + commandModifierCheckbox + + + + 59 + + + + refreshModifierCheckboxState: + + + + 60 + + + + nextKeyView + + + + 61 + + + + nextKeyView + + + + 62 + + + + nextKeyView + + + + 63 + + + + nextKeyView + + + + 64 + + + + initialFirstResponder + + + + 67 + + + + nextKeyView + + + + 68 + + + + nextKeyView + + + + 69 + + + + nextKeyView + + + + 70 + + + + nextKeyView + + + + 72 + + + + nextKeyView + + + + 73 + + + + nextKeyView + + + + 74 + + + + solidOnTopCheckbox + + + + 77 + + + + + YES + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + 5 + + + YES + + + + PreferencesPanel + + + 6 + + + YES + + + + + + + + + + + + + + + + + + + + + + 7 + + + + + 11 + + + YES + + + + + + 14 + + + YES + + + + + + 16 + + + YES + + + + + + 17 + + + YES + + + + + + 27 + + + YES + + + + + + 28 + + + YES + + + + + + 29 + + + YES + + + + + + 33 + + + YES + + + + + + 36 + + + YES + + + + + + 37 + + + YES + + + + + + 52 + + + YES + + + + + + 53 + + + YES + + + + + + 54 + + + YES + + + + + + 55 + + + YES + + + + + + 66 + + + YES + + + + + + 76 + + + YES + + + + + + 79 + + + YES + + + + + + 80 + + + + + 81 + + + + + 82 + + + + + 83 + + + + + 84 + + + + + 85 + + + + + 86 + + + + + 87 + + + + + 88 + + + + + 89 + + + + + 90 + + + + + 91 + + + + + 92 + + + + + 93 + + + + + 94 + + + + + 9 + + + YES + + + + + + + + + 15 + + + + + 13 + + + + + 12 + + + + + 10 + + + + + -3 + + + Application + + + + + YES + + YES + 10.IBPluginDependency + 10.ImportedFromIB2 + 11.IBPluginDependency + 11.ImportedFromIB2 + 12.IBPluginDependency + 12.ImportedFromIB2 + 13.IBPluginDependency + 13.ImportedFromIB2 + 14.IBPluginDependency + 14.ImportedFromIB2 + 15.IBPluginDependency + 15.ImportedFromIB2 + 16.IBPluginDependency + 16.ImportedFromIB2 + 17.IBPluginDependency + 17.ImportedFromIB2 + 27.IBPluginDependency + 27.ImportedFromIB2 + 28.IBPluginDependency + 28.ImportedFromIB2 + 29.IBPluginDependency + 29.ImportedFromIB2 + 33.IBPluginDependency + 33.ImportedFromIB2 + 36.IBPluginDependency + 36.ImportedFromIB2 + 37.IBPluginDependency + 37.ImportedFromIB2 + 5.IBEditorWindowLastContentRect + 5.IBPluginDependency + 5.IBWindowTemplateEditedContentRect + 5.ImportedFromIB2 + 5.windowTemplate.hasMinSize + 5.windowTemplate.minSize + 52.IBPluginDependency + 52.ImportedFromIB2 + 53.IBPluginDependency + 53.ImportedFromIB2 + 54.IBPluginDependency + 54.ImportedFromIB2 + 55.IBPluginDependency + 55.ImportedFromIB2 + 6.IBPluginDependency + 6.ImportedFromIB2 + 66.IBPluginDependency + 66.ImportedFromIB2 + 7.IBPluginDependency + 7.ImportedFromIB2 + 76.IBPluginDependency + 76.ImportedFromIB2 + 9.IBPluginDependency + 9.ImportedFromIB2 + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{84, 613}, {348, 407}} + com.apple.InterfaceBuilder.CocoaPlugin + {{84, 613}, {348, 407}} + + + {213, 107} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + + + YES + + + YES + + + + + YES + + + YES + + + + 94 + + + + YES + + FirstResponder + + IBUserSource + + + + + PreferencesController + NSObject + + YES + + YES + cancel: + ok: + refreshModifierCheckboxState: + + + YES + id + id + id + + + + YES + + YES + commandModifierCheckbox + controlModifierCheckbox + floatWindowCheckbox + highlightColourWell + keymapPopup + optionModifierCheckbox + shiftModifierCheckbox + solidOnTopCheckbox + transparencySlider + useHotKeysCheckbox + windowTransparencySlider + + + YES + NSButton + NSButton + NSButton + NSColorWell + NSPopUpButton + NSButton + NSButton + NSButton + NSSlider + NSButton + NSSlider + + + + IBUserSource + + + + + + 0 + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 + + + YES + + 3 + + diff --git a/German.lproj/Credits.html b/German.lproj/Credits.html new file mode 100644 index 0000000..01b33d7 --- /dev/null +++ b/German.lproj/Credits.html @@ -0,0 +1,40 @@ + +

Geschrieben von:
+   Chris Reed <creed@manyetas.com>
+   http://www.manyetas.com/

+ +

Deutsche Lokalisierung:
+   Richard Zelzer
+   http://www.zmusik.de/
+   Ralf Welter <i_see@macnews.de>

+ +

Französisch Lokalisierung:
+   Frédéric Ballériaux

+ +

Japanisch Lokalisierung:
+   Hiroshi Yamato
+   http://salvageship.dropcontrol.com/

+ +

Spanisch Lokalisierung:
+   Fernando Díaz de la Torre
+ +

Spezieller Dank:
+   Airy André
+   Skye Ashbrook
+   Frédéric Ballériaux
+   Damon
+   Fernando Díaz de la Torre
+   Alexander Guy
+   Magnus Helin
+   Michael Keuter
+   Norbert Rittel
+   Ralf Welter
+   rasda
+   Adrian Steiger
+   tdc
+   Jon Wight
+   Hiroshi Yamato
+   xonox
+   Richard Zelzer
+

+ \ No newline at end of file diff --git a/German.lproj/InfoPlist.strings b/German.lproj/InfoPlist.strings new file mode 100644 index 0000000000000000000000000000000000000000..d56ff0553b1f8ec9084b60dd729356552660eb41 GIT binary patch literal 548 zcmbV|y>7xl5QL}BQ=BMKVlY)Clp-LJpa2Dy=nb|3fo){|1aHJk0^c138Y@L~y4$_| znVH?oxu&X&ddf9XsHNsQDpo{nhb^=wk}Ja+Y{J{+m*9I^x%#y>L>E*aTvb&yy>Qy< zsHH8{5p}T!;HOxl4{k+$kR$HTy|bcbNmrm5Tm>8>>YjQ6A_d)|KA9&ptfONF_q<+qQlO4;x<(0H1y^?AKz{z<>Yt)Z$j;!c?%f5yP5%+Z}yQA w&om?xGJl9(yPYzw+n&lY|50J|36teAj(y@LvcH|%@R-aDJxjF5DE!rZ1wi;)LI3~& literal 0 HcmV?d00001 diff --git a/German.lproj/KeyMapNames.strings b/German.lproj/KeyMapNames.strings new file mode 100644 index 0000000000000000000000000000000000000000..ef09e26255f53360a1d4ff37854b454819f3acae GIT binary patch literal 240 zcma)$K@NgI3`O6XQ%q(hXD}|sJ%j@Q4rro4aNzjrA3`Rsh-vD!9|riE}^Xd7ZXm8*Y)!#VpDsi{mQi{td%nt)5XR?*n>@vmh_)2k0=EbW(o_P4)J0AxsX6Boj^VHVEws5JL>zddboo6-KiJm=ujUistPjv0ZbhJ|;V}S2a5= zyQuArq^)bCwd_^NBkitSb4Ix>T?t=~NwNN|q!zMUV(~<$I(F_}^=eplPqsFG?Az|{ zk^G$BTGK%J%&39~Fo3LsZXlGEo-29Zm(`?IzEvKx&iXmisigJr=t6su-Kkc{_duWE zQPO)~=*Hp=-og}k7CdP3=43}lVMAMcGuH^(j`X4rlmokT+;d05>Qp|!fPCVGvNF^e z(B%je`^5)vSF%GCko{Hv3j!D&2(oQzB$x)PPB*BM5KtxTXLQ5@w6{f>qzxTI$*t^n zMSLPOWCxU??bG%9%rz5z;>|wNuzD=UM?R2+D+_yg3l7v#(g!B%$Ok7nZtoY_7z!iI zC|Pa!*<|fnHcAW+g)X{DU+gDBuqSes>$yooQ$E`68L_@}O%dM{;pqxbO9+zvq|fK} znSB02-(YA&=iDQeV>OZtD>EaaOKEKCUvIUO*5{VO{MIF|Msx190Y|$!Pt>WOuCppz z&lS*C9|CQ?cYUunFcyyIxSYvLcox}!NmOC6RHFQib0y+&EEJWn;@?0Yc(m(9wsER_ zymBkoYj4&VbpTrb`d;NjOjZc+1Isd zej!wJ17bZB=9q|}jB_ztP8Ba=9z7y?9;Z4@C!nLntPGjhT}o3=yLUbJ!~#ae#Qd;k z|Hv&f6Poe^2CUNaVxA;DiQ{OacP2?#c(p5F<)5MdSrS;}`ED<$5&Yu*5T1qqR6?GL zH+#2j@85X|ik=V@+yAxC%$K{$EWLIj7WMV)seVeni4*UjtarKx>f+pv3bW3YY5FKU zy;^w>wRX?G6IYY8aZ`#K!fM>OR+5D!xx#W*nBVmLck!24GQa7>yY`VM*G#YAGc4qt zS_5(1_~N#ZZ#i|3?&u7&J>#P5%_K`F3fcO!NcPO58MR66(;?^T;UB*zhLxE?mdQIY zc`c8a6x-N|5O=Df$1+b`GWcApF{$(9DifR7Hg^J;QmGR}7ai#w7IN)JXIu$M+>m2} zUDzLPDR#59v9gApspJC}`*;#LfRF6wdkp=J-jpoz7uBBZiJyEFagCZP0vYhYk`CMeVrF%!2r`sByOD68W&9ZIp za|6j|op}zOIkTc)aescWVK==utb~1hh!{{yc`xf>V(|;I(jMQh(-XgM<9Ay8+T#}^ ix1U4#(DOPek-2xkq)z%>{7CJ^LF{-Jj3^ literal 0 HcmV?d00001 diff --git a/German.lproj/MainMenu.xib b/German.lproj/MainMenu.xib new file mode 100644 index 0000000..b4d7528 --- /dev/null +++ b/German.lproj/MainMenu.xib @@ -0,0 +1,2794 @@ + + + + 1060 + 10C540 + 740 + 1038.25 + 458.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 740 + + + YES + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + + + YES + + YES + + + YES + + + + YES + + + NSApplication + + + + FirstResponder + + + NSApplication + + + 263 + 2 + {{26, 418}, {371, 157}} + 1886912512 + Midi-Tastatur + NSWindow + + View + + {595, 157} + {371, 157} + + + 256 + + YES + + + 256 + + YES + + + 290 + {371, 57} + + + MidiKeyView + NSView + + + + 268 + {{233, 67}, {118, 15}} + + + YES + + 67501824 + 131072 + + + + + Helvetica + 12 + 16 + + + 127 + 1 + 64 + 0.0 + 0 + 1 + NO + NO + + + + + 268 + {{72, 67}, {31, 19}} + + + YES + + -2075001280 + 4195328 + 1 + + LucidaGrande + 11 + 3100 + + + YES + + 6 + System + textBackgroundColor + + 3 + MQA + + + + 6 + System + textColor + + 3 + MAA + + + + + + + 268 + {{17, 69}, {64, 14}} + + + YES + + 67239424 + 4194304 + S2FuYWw6Cg + + + + 6 + System + controlColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 6 + System + controlTextColor + + + + + + + 268 + {{138, 69}, {90, 14}} + + + YES + + 67239424 + 4194304 + Härte Anschlag: + + + + + + + + + 268 + {{108, 62}, {19, 27}} + + + YES + + 917024 + 0 + + 1 + 1 + 16 + 1 + YES + + + + {371, 87} + + + NSView + + + + 256 + + YES + + + 268 + {{130, 26}, {141, 22}} + + + YES + + -2076049856 + 132096 + + + 109199615 + 1 + + + + + + + + 400 + 75 + + + Item1 + + 1048576 + 2147483647 + 1 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + _popUpItemAction: + + + YES + + + OtherViews + + + YES + + + + Item2 + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + Item3 + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + 3 + YES + YES + 1 + + + + + 268 + {{130, 1}, {141, 22}} + + + YES + + -2076049856 + 132096 + + + 109199615 + 1 + + + + + + + + 400 + 75 + + + Item1 + + 1048576 + 2147483647 + 1 + + + _popUpItemAction: + + + YES + + + OtherViews + + + YES + + + + Item2 + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + Item3 + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + 3 + YES + YES + 1 + + + + + 268 + {{17, 7}, {111, 14}} + + + YES + + 67239424 + 4194304 + Höre auf Anschluss: + + + + + + + + + 268 + {{17, 32}, {107, 14}} + + + YES + + 67239424 + 4194304 + WmllbDoKA + + + + + + + + + 256 + {{273, 6}, {93, 16}} + + + YES + + 67239424 + 131072 + Weiterleitung + + + 1211912703 + 2 + + NSSwitch + + + + 200 + 25 + + + + {{0, 90}, {371, 67}} + + + NSView + + + {371, 157} + + + + {{0, 0}, {1280, 832}} + {371, 179} + {595, 179} + MidiKeys + + + MainMenu + + YES + + + MidiKeys + + 1048576 + 2147483647 + + + submenuAction: + + MidiKeys + + YES + + + Über MidiKeys + + 2147483647 + + + + + + Einstellungen... + , + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Dienste + + 1048576 + 2147483647 + + + submenuAction: + + Dienste + + YES + + _NSServicesMenu + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + MidiKeys ausblenden + h + 1048576 + 2147483647 + + + + + + Andere ausblenden + h + 1572864 + 2147483647 + + + + + + Alle einblenden + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + MidiKeys beenden + q + 1048576 + 2147483647 + + + + + _NSAppleMenu + + + + + Keys + + 1048576 + 2147483647 + + + submenuAction: + + Keys + + YES + + + Oktave höher + u + 1048576 + 2147483647 + + + + + + Oktave tiefer + d + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + „Alle Noten aus” senden + \ + 1048576 + 2147483647 + + + + + + + + + Bearbeiten + + 1048576 + 2147483647 + + + submenuAction: + + Bearbeiten + + YES + + + Widerrufen + z + 1048576 + 2147483647 + + + + + + Wiederholen + Z + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Ausschneiden + x + 1048576 + 2147483647 + + + + + + Kopieren + c + 1048576 + 2147483647 + + + + + + Einsetzen + v + 1048576 + 2147483647 + + + + + + Löschen + + 1048576 + 2147483647 + + + + + + Alles auswählen + a + 1048576 + 2147483647 + + + + + + + + + Fenster + + 1048576 + 2147483647 + + + submenuAction: + + Fenster + + YES + + + Im Dock ablegen + m + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Alle nach vorne bringen + + 1048576 + 2147483647 + + + + + _NSWindowsMenu + + + + + Hilfe + + 1048576 + 2147483647 + + + submenuAction: + + Hilfe + + YES + + + MidiKeys Hilfe + ? + 1048576 + 2147483647 + + + + + + + + _NSMainMenu + + + AppController + + + PreferencesController + + + KeyMapManager + + + + + YES + + + performMiniaturize: + + + + 37 + + + + arrangeInFront: + + + + 39 + + + + showHelp: + + + + 122 + + + + terminate: + + + + 139 + + + + orderFrontStandardAboutPanel: + + + + 142 + + + + hideOtherApplications: + + + + 146 + + + + hide: + + + + 152 + + + + unhideAllApplications: + + + + 153 + + + + cut: + + + + 175 + + + + paste: + + + + 176 + + + + redo: + + + + 178 + + + + selectAll: + + + + 179 + + + + undo: + + + + 180 + + + + copy: + + + + 181 + + + + delete: + + + + 195 + + + + destinationPopup + + + + 204 + + + + destinationSelected: + + + + 206 + + + + midiKeys + + + + 209 + + + + velocitySlider + + + + 212 + + + + velocitySliderChanged: + + + + 213 + + + + sourcePopup + + + + 220 + + + + sourceSelected: + + + + 221 + + + + channelField + + + + 228 + + + + channelStepper + + + + 229 + + + + channelDidChange: + + + + 230 + + + + delegate + + + + 231 + + + + nextKeyView + + + + 238 + + + + nextKeyView + + + + 239 + + + + nextKeyView + + + + 240 + + + + nextKeyView + + + + 241 + + + + initialFirstResponder + + + + 242 + + + + showPanel: + + + + 244 + + + + keyMapManager + + + + 246 + + + + delegate + + + + 247 + + + + octaveUp: + + + + 253 + + + + octaveDown: + + + + 254 + + + + sendAllNotesOff: + + + + 260 + + + + hiddenItemsView + + + + 261 + + + + toggleView + + + + 262 + + + + midiThruCheckbox + + + + 263 + + + + + YES + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + 21 + + + YES + + + + Window + + + 2 + + + YES + + + + + + + 256 + + + YES + + + + + + + + + + + 208 + + + + + 210 + + + YES + + + + + + 211 + + + YES + + + + + + 222 + + + YES + + + + + + 223 + + + YES + + + + + + 225 + + + YES + + + + + + 257 + + + YES + + + + + + + + + + 198 + + + YES + + + + + + 217 + + + YES + + + + + + 219 + + + YES + + + + + + 236 + + + YES + + + + + + 255 + + + YES + + + + + + 29 + + + YES + + + + + + + + MainMenu + + + 19 + + + YES + + + + + + 24 + + + YES + + + + + + + + 5 + + + + + 23 + + + + + 92 + + + + + 56 + + + YES + + + + + + 57 + + + YES + + + + + + + + + + + + + + + 58 + + + + + 129 + + + + + 131 + + + YES + + + + + + 130 + + + + + 134 + + + + + 136 + + + + + 143 + + + + + 144 + + + + + 145 + + + + + 149 + + + + + 150 + + + + + 103 + + + YES + + + + + + 106 + + + YES + + + + + + 111 + + + + + 163 + + + YES + + + + + + 169 + + + YES + + + + + + + + + + + + + 156 + + + + + 157 + + + + + 158 + + + + + 160 + + + + + 164 + + + + + 171 + + + + + 172 + + + + + 173 + + + + + 249 + + + YES + + + + + + 251 + + + YES + + + + + + + + + 250 + + + + + 252 + + + + + 258 + + + + + 259 + + + + + 203 + + + AppController + + + 243 + + + PreferencesController + + + 245 + + + KeyMapManager + + + 265 + + + + + 266 + + + + + 267 + + + + + 268 + + + + + 269 + + + + + 270 + + + YES + + + + + + 271 + + + YES + + + + + + 272 + + + + + 273 + + + + + 274 + + + + + 199 + + + YES + + + + + + + + 201 + + + + + 200 + + + + + 197 + + + + + 215 + + + YES + + + + + + + + 218 + + + + + 216 + + + + + 214 + + + + + -3 + + + Application + + + + + YES + + YES + 103.IBPluginDependency + 103.ImportedFromIB2 + 106.IBPluginDependency + 106.ImportedFromIB2 + 111.IBPluginDependency + 111.ImportedFromIB2 + 129.IBPluginDependency + 129.ImportedFromIB2 + 130.IBPluginDependency + 130.ImportedFromIB2 + 131.IBPluginDependency + 131.ImportedFromIB2 + 134.IBPluginDependency + 134.ImportedFromIB2 + 136.IBPluginDependency + 136.ImportedFromIB2 + 143.IBPluginDependency + 143.ImportedFromIB2 + 144.IBPluginDependency + 144.ImportedFromIB2 + 145.IBPluginDependency + 145.ImportedFromIB2 + 149.IBPluginDependency + 149.ImportedFromIB2 + 150.IBPluginDependency + 150.ImportedFromIB2 + 156.IBPluginDependency + 156.ImportedFromIB2 + 157.IBPluginDependency + 157.ImportedFromIB2 + 158.IBPluginDependency + 158.ImportedFromIB2 + 160.IBPluginDependency + 160.ImportedFromIB2 + 163.IBPluginDependency + 163.ImportedFromIB2 + 164.IBPluginDependency + 164.ImportedFromIB2 + 169.IBPluginDependency + 169.ImportedFromIB2 + 171.IBPluginDependency + 171.ImportedFromIB2 + 172.IBPluginDependency + 172.ImportedFromIB2 + 173.IBPluginDependency + 173.ImportedFromIB2 + 19.IBPluginDependency + 19.ImportedFromIB2 + 197.IBPluginDependency + 197.ImportedFromIB2 + 198.IBPluginDependency + 198.ImportedFromIB2 + 199.IBPluginDependency + 199.ImportedFromIB2 + 2.IBPluginDependency + 2.ImportedFromIB2 + 200.IBPluginDependency + 200.ImportedFromIB2 + 201.IBPluginDependency + 201.ImportedFromIB2 + 203.ImportedFromIB2 + 208.IBPluginDependency + 208.ImportedFromIB2 + 21.IBEditorWindowLastContentRect + 21.IBPluginDependency + 21.IBWindowTemplateEditedContentRect + 21.ImportedFromIB2 + 21.windowTemplate.hasMaxSize + 21.windowTemplate.hasMinSize + 21.windowTemplate.maxSize + 21.windowTemplate.minSize + 210.IBPluginDependency + 210.ImportedFromIB2 + 211.IBPluginDependency + 211.ImportedFromIB2 + 214.IBPluginDependency + 214.ImportedFromIB2 + 215.IBPluginDependency + 215.ImportedFromIB2 + 216.IBPluginDependency + 216.ImportedFromIB2 + 217.IBPluginDependency + 217.ImportedFromIB2 + 218.IBPluginDependency + 218.ImportedFromIB2 + 219.IBPluginDependency + 219.ImportedFromIB2 + 222.IBPluginDependency + 222.ImportedFromIB2 + 223.IBPluginDependency + 223.ImportedFromIB2 + 225.IBPluginDependency + 225.ImportedFromIB2 + 23.IBPluginDependency + 23.ImportedFromIB2 + 236.IBPluginDependency + 236.ImportedFromIB2 + 24.IBPluginDependency + 24.ImportedFromIB2 + 243.ImportedFromIB2 + 245.ImportedFromIB2 + 249.IBPluginDependency + 249.ImportedFromIB2 + 250.IBPluginDependency + 250.ImportedFromIB2 + 251.IBPluginDependency + 251.ImportedFromIB2 + 252.IBPluginDependency + 252.ImportedFromIB2 + 255.IBPluginDependency + 255.ImportedFromIB2 + 256.IBPluginDependency + 256.ImportedFromIB2 + 257.IBPluginDependency + 257.ImportedFromIB2 + 258.IBPluginDependency + 258.ImportedFromIB2 + 259.IBPluginDependency + 259.ImportedFromIB2 + 29.IBPluginDependency + 29.ImportedFromIB2 + 5.IBPluginDependency + 5.ImportedFromIB2 + 56.IBPluginDependency + 56.ImportedFromIB2 + 57.IBPluginDependency + 57.ImportedFromIB2 + 58.IBPluginDependency + 58.ImportedFromIB2 + 92.IBPluginDependency + 92.ImportedFromIB2 + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + {{0, 955}, {371, 157}} + com.apple.InterfaceBuilder.CocoaPlugin + {{0, 955}, {371, 157}} + + + + {595, 157} + {371, 157} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + + + YES + + + YES + + + + + YES + + + YES + + + + 274 + + + + YES + + AppController + NSObject + + YES + + YES + channelDidChange: + destinationSelected: + octaveDown: + octaveUp: + sendAllNotesOff: + showPreferences: + sourceSelected: + toggleHotKeys: + toggleMidiControls: + toggleMidiThru: + velocitySliderChanged: + + + YES + id + id + id + id + id + id + id + id + id + id + id + + + + YES + + YES + _toggleHotKeysMenuItem + channelField + channelStepper + destinationPopup + hiddenItemsView + keyMapManager + midiKeys + midiThruCheckbox + sourcePopup + toggleView + velocitySlider + + + YES + NSMenuItem + NSTextField + NSStepper + NSPopUpButton + NSView + KeyMapManager + MidiKeyView + NSButton + NSPopUpButton + NSView + NSSlider + + + + IBProjectSource + AppController.h + + + + AppController + NSObject + + IBUserSource + + + + + FirstResponder + + sendAllNotesOff: + id + + + IBUserSource + + + + + KeyMapManager + NSObject + + IBProjectSource + KeyMapManager.h + + + + KeyMapManager + NSObject + + IBUserSource + + + + + MidiKeyView + NSView + + mDelegate + id + + + IBProjectSource + MidiKeyView.h + + + + MidiKeyView + NSView + + IBUserSource + + + + + NSObject + + + + NSObject + + IBProjectSource + MidiKeysApplication.h + + + + NSObject + + IBProjectSource + OverlayIndicator.h + + + + NSObject + + IBProjectSource + ShortcutRecorder.h + + + + NSObject + + IBProjectSource + ShortcutRecorderCell.h + + + + PreferencesController + NSObject + + YES + + YES + cancel: + ok: + showPanel: + + + YES + id + id + id + + + + YES + + YES + _clickThroughCheckbox + _octaveDownHotKeysShortcut + _octaveUpHotKeysShortcut + _prefsWindow + _toggleHotKeysShortcut + _velocityDownHotKeysShortcut + _velocityUpHotKeysShortcut + commandModifierCheckbox + controlModifierCheckbox + floatWindowCheckbox + highlightColourWell + keymapPopup + optionModifierCheckbox + shiftModifierCheckbox + showKeyCapsCheckbox + showNotificationOverlaysCheckbox + solidOnTopCheckbox + useHotKeysCheckbox + windowTransparencySlider + + + YES + NSButton + ShortcutRecorder + ShortcutRecorder + NSWindow + ShortcutRecorder + ShortcutRecorder + ShortcutRecorder + NSButton + NSButton + NSButton + NSColorWell + NSPopUpButton + NSButton + NSButton + NSButton + NSButton + NSButton + NSButton + NSSlider + + + + IBProjectSource + PreferencesController.h + + + + PreferencesController + NSObject + + YES + + YES + transparencySlider + useHotkeysCheckbox + + + YES + NSSlider + NSButton + + + + IBUserSource + + + + + ShortcutRecorder + NSControl + + delegate + id + + + + + + YES + + NSActionCell + NSCell + + IBFrameworkSource + AppKit.framework/Headers/NSActionCell.h + + + + NSApplication + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSApplication.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSApplicationScripting.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSColorPanel.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSHelpManager.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSPageLayout.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSUserInterfaceItemSearching.h + + + + NSBrowser + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSBrowser.h + + + + NSButton + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSButton.h + + + + NSButtonCell + NSActionCell + + IBFrameworkSource + AppKit.framework/Headers/NSButtonCell.h + + + + NSCell + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSCell.h + + + + NSColorWell + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSColorWell.h + + + + NSControl + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSControl.h + + + + NSFormatter + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFormatter.h + + + + NSMatrix + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSMatrix.h + + + + NSMenu + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSMenu.h + + + + NSMenuItem + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSMenuItem.h + + + + NSMenuItemCell + NSButtonCell + + IBFrameworkSource + AppKit.framework/Headers/NSMenuItemCell.h + + + + NSMovieView + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSMovieView.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSAccessibility.h + + + + NSObject + + + + NSObject + + + + NSObject + + + + NSObject + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSDictionaryController.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSDragging.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSFontManager.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSFontPanel.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSKeyValueBinding.h + + + + NSObject + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSNibLoading.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSOutlineView.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSPasteboard.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSSavePanel.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSTableView.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSToolbarItem.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSView.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSClassDescription.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObjectScripting.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSPortCoder.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptClassDescription.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptObjectSpecifiers.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptWhoseTests.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLDownload.h + + + + NSObject + + IBFrameworkSource + Sparkle.framework/Headers/SUAppcast.h + + + + NSObject + + IBFrameworkSource + Sparkle.framework/Headers/SUUpdater.h + + + + NSPopUpButton + NSButton + + IBFrameworkSource + AppKit.framework/Headers/NSPopUpButton.h + + + + NSPopUpButtonCell + NSMenuItemCell + + IBFrameworkSource + AppKit.framework/Headers/NSPopUpButtonCell.h + + + + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSInterfaceStyle.h + + + + NSResponder + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSResponder.h + + + + NSSlider + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSSlider.h + + + + NSSliderCell + NSActionCell + + IBFrameworkSource + AppKit.framework/Headers/NSSliderCell.h + + + + NSStepper + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSStepper.h + + + + NSStepperCell + NSActionCell + + IBFrameworkSource + AppKit.framework/Headers/NSStepperCell.h + + + + NSTableView + NSControl + + + + NSText + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSText.h + + + + NSTextField + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSTextField.h + + + + NSTextFieldCell + NSActionCell + + IBFrameworkSource + AppKit.framework/Headers/NSTextFieldCell.h + + + + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSClipView.h + + + + NSView + + + + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSRulerView.h + + + + NSView + NSResponder + + + + NSWindow + + IBFrameworkSource + AppKit.framework/Headers/NSDrawer.h + + + + NSWindow + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSWindow.h + + + + NSWindow + + IBFrameworkSource + AppKit.framework/Headers/NSWindowScripting.h + + + + + 0 + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 + + + YES + ../MidiKeys.xcodeproj + 3 + + diff --git a/German.lproj/Preferences.xib b/German.lproj/Preferences.xib new file mode 100644 index 0000000..7e85b7a --- /dev/null +++ b/German.lproj/Preferences.xib @@ -0,0 +1,1230 @@ + + + + 1060 + 10C540 + 740 + 1038.25 + 458.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 740 + + + YES + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + + + YES + + YES + + + YES + + + + YES + + PreferencesController + + + FirstResponder + + + NSApplication + + + 1 + 2 + {{271, 298}, {360, 409}} + 1886912512 + MidiKeys Einstellungen + NSWindow + + View + + {1.79769e+308, 1.79769e+308} + {213, 107} + + + 256 + + YES + + + 256 + {{42, 285}, {120, 17}} + + YES + + 67239424 + 4194304 + Tastaturbelegung: + + LucidaGrande + 13 + 1044 + + + + 6 + System + controlColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 6 + System + controlTextColor + + 3 + MAA + + + + + + + 256 + {{43, 247}, {218, 18}} + + YES + + 67239424 + 0 + Taste für systemweiten Zugriff + + + 1211912703 + 2 + + NSSwitch + + + + 200 + 25 + + + + + 256 + {{43, 127}, {224, 18}} + + YES + + 67239424 + 0 + Tastatur immer im Vordergrund + + + 1211912703 + 2 + + + + 200 + 25 + + + + + 256 + {{58, 321}, {257, 17}} + + YES + + 67501824 + 131072 + + + + + Helvetica + 12 + 16 + + + 100 + 0.0 + 75 + 0.0 + 10 + 0 + NO + NO + + + + + 256 + {{55, 346}, {75, 14}} + + YES + + 67239424 + 4194304 + Transparenz: + + LucidaGrande + 11 + 16 + + + + + + + + + 256 + {{42, 368}, {156, 17}} + + YES + + 67239424 + 4194304 + Farbe der aktiven Taste: + + + + + + + + + 256 + {{58, 82}, {257, 17}} + + YES + + 67501824 + 131072 + + + + + + 100 + 0.0 + 75 + 0.0 + 10 + 0 + NO + NO + + + + + 256 + {{219, 12}, {102, 32}} + + YES + + 67239424 + 137887744 + OK + + + -2038284033 + 1 + + Helvetica + 13 + 16 + + + DQ + 200 + 25 + + + + + 256 + {{111, 12}, {108, 32}} + + YES + + 67239424 + 137887744 + Abbrechen + + + -2038284033 + 1 + + + Gw + 200 + 25 + + + + + 256 + {{57, 225}, {110, 18}} + + YES + + 67239424 + 131072 + ⌃ Control-Taste + + + 1211912703 + 2 + + + + 200 + 25 + + + + + 256 + {{57, 205}, {112, 18}} + + YES + + 67239424 + 131072 + ⇧ Umschalttaste + + + 1211912703 + 2 + + + + 200 + 25 + + + + + 256 + {{57, 185}, {89, 18}} + + YES + + 67239424 + 131072 + ⌥ Wahltaste + + + 1211912703 + 2 + + + + 200 + 25 + + + + + 256 + {{57, 165}, {101, 18}} + + YES + + 67239424 + 131072 + ⌘ Befehlstaste + + + 1211912703 + 2 + + + + 200 + 25 + + + + + 256 + {{55, 107}, {75, 14}} + + YES + + 67239424 + 4194304 + Transparenz: + + + + + + + + + 256 + {{57, 58}, {202, 18}} + + YES + + 67239424 + 131072 + Nur im Hintergrund + + + 1211912703 + 2 + + + + 200 + 25 + + + + + 256 + + YES + + YES + + NSColor pasteboard type + + + + {{203, 363}, {38, 26}} + + YES + YES + + 1 + MC4wNTgxMzA0OTg5OCAwLjA1NTU0MTg5OTA2IDEAA + + + + + 256 + {{164, 279}, {148, 26}} + + YES + + -2076049856 + 1024 + + + -2038284033 + 1 + + + + + + 400 + 75 + + + Einfach + + 1048576 + 2147483647 + 1 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + _popUpItemAction: + + + YES + + + OtherViews + + + YES + + + Gesamt + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + + 1 + 3 + YES + YES + 1 + + + + {{1, 9}, {360, 409}} + + {{0, 0}, {1280, 1002}} + {213, 129} + {1.79769e+308, 1.79769e+308} + + + + + YES + + + delegate + + + + 18 + + + + keymapPopup + + + + 23 + + + + highlightColourWell + + + + 24 + + + + floatWindowCheckbox + + + + 25 + + + + useHotKeysCheckbox + + + + 26 + + + + transparencySlider + + + + 32 + + + + windowTransparencySlider + + + + 35 + + + + ok: + + + + 40 + + + + cancel: + + + + 41 + + + + nextKeyView + + + + 50 + + + + nextKeyView + + + + 51 + + + + controlModifierCheckbox + + + + 56 + + + + shiftModifierCheckbox + + + + 57 + + + + optionModifierCheckbox + + + + 58 + + + + commandModifierCheckbox + + + + 59 + + + + refreshModifierCheckboxState: + + + + 60 + + + + nextKeyView + + + + 64 + + + + nextKeyView + + + + 65 + + + + nextKeyView + + + + 66 + + + + nextKeyView + + + + 67 + + + + nextKeyView + + + + 69 + + + + initialFirstResponder + + + + 71 + + + + nextKeyView + + + + 72 + + + + nextKeyView + + + + 73 + + + + nextKeyView + + + + 74 + + + + nextKeyView + + + + 75 + + + + nextKeyView + + + + 76 + + + + solidOnTopCheckbox + + + + 78 + + + + + YES + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + 5 + + + YES + + + + PreferencesPanel + + + 6 + + + YES + + + + + + + + + + + + + + + + + + + + + + 7 + + + + + 11 + + + YES + + + + + + 14 + + + YES + + + + + + 16 + + + YES + + + + + + 17 + + + YES + + + + + + 27 + + + YES + + + + + + 28 + + + YES + + + + + + 29 + + + YES + + + + + + 33 + + + YES + + + + + + 36 + + + YES + + + + + + 37 + + + YES + + + + + + 52 + + + YES + + + + + + 53 + + + YES + + + + + + 54 + + + YES + + + + + + 55 + + + YES + + + + + + 70 + + + YES + + + + + + 77 + + + YES + + + + + + 80 + + + YES + + + + + + 81 + + + + + 82 + + + + + 83 + + + + + 84 + + + + + 85 + + + + + 86 + + + + + 87 + + + + + 88 + + + + + 89 + + + + + 90 + + + + + 91 + + + + + 92 + + + + + 93 + + + + + 94 + + + + + 95 + + + + + 9 + + + YES + + + + + + + 15 + + + + + 12 + + + + + -3 + + + Application + + + + + YES + + YES + 11.IBPluginDependency + 11.ImportedFromIB2 + 12.IBPluginDependency + 12.ImportedFromIB2 + 14.IBPluginDependency + 14.ImportedFromIB2 + 15.IBPluginDependency + 15.ImportedFromIB2 + 16.IBPluginDependency + 16.ImportedFromIB2 + 17.IBPluginDependency + 17.ImportedFromIB2 + 27.IBPluginDependency + 27.ImportedFromIB2 + 28.IBPluginDependency + 28.ImportedFromIB2 + 29.IBPluginDependency + 29.ImportedFromIB2 + 33.IBPluginDependency + 33.ImportedFromIB2 + 36.IBPluginDependency + 36.ImportedFromIB2 + 37.IBPluginDependency + 37.ImportedFromIB2 + 5.IBPluginDependency + 5.ImportedFromIB2 + 5.windowTemplate.hasMinSize + 5.windowTemplate.minSize + 52.IBPluginDependency + 52.ImportedFromIB2 + 53.IBPluginDependency + 53.ImportedFromIB2 + 54.IBPluginDependency + 54.ImportedFromIB2 + 55.IBPluginDependency + 55.ImportedFromIB2 + 6.IBPluginDependency + 6.ImportedFromIB2 + 7.IBPluginDependency + 7.ImportedFromIB2 + 70.IBPluginDependency + 70.ImportedFromIB2 + 77.IBPluginDependency + 77.ImportedFromIB2 + 9.IBPluginDependency + 9.ImportedFromIB2 + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + {213, 107} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + + + YES + + + YES + + + + + YES + + + YES + + + + 95 + + + + YES + + FirstResponder + + IBUserSource + + + + + PreferencesController + NSObject + + YES + + YES + cancel: + ok: + refreshModifierCheckboxState: + + + YES + id + id + id + + + + YES + + YES + commandModifierCheckbox + controlModifierCheckbox + floatWindowCheckbox + highlightColourWell + keymapPopup + optionModifierCheckbox + shiftModifierCheckbox + solidOnTopCheckbox + transparencySlider + useHotKeysCheckbox + windowTransparencySlider + + + YES + NSButton + NSButton + NSButton + NSColorWell + NSPopUpButton + NSButton + NSButton + NSButton + NSSlider + NSButton + NSSlider + + + + IBUserSource + + + + + + 0 + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 + + + YES + + 3 + + diff --git a/Japanese.lproj/Credits.html b/Japanese.lproj/Credits.html new file mode 100644 index 0000000..3acabfb --- /dev/null +++ b/Japanese.lproj/Credits.html @@ -0,0 +1,40 @@ + +

Written by:
+   Chris Reed <flit@ftml.net>
+   http://www.manyetas.com/creed/

+ +

German localisation:
+   Richard Zelzer
+   http://www.zmusik.de/
+   Ralf Welter <i_see@macnews.de>

+ +

French localisation:
+   Frédéric Ballériaux

+ +

Japanese localisation:
+   Hiroshi Yamato
+   http://salvageship.dropcontrol.com/

+ +

Spanish localisation:
+   Fernando Díaz de la Torre
+ +

Special thanks to:
+   Airy André
+   Skye Ashbrook
+   Frédéric Ballériaux
+   Damon
+   Fernando Díaz de la Torre
+   Alexander Guy
+   Magnus Helin
+   Michael Keuter
+   Norbert Rittel
+   Ralf Welter
+   rasda
+   Adrian Steiger
+   tdc
+   Jon Wight
+   Hiroshi Yamato
+   xonox
+   Richard Zelzer
+

+ \ No newline at end of file diff --git a/Japanese.lproj/InfoPlist.strings b/Japanese.lproj/InfoPlist.strings new file mode 100644 index 0000000000000000000000000000000000000000..80759e64725785f65e2dfa476d92dc2935f99a81 GIT binary patch literal 540 zcmbV}%WlFj5Jm5ruZXflln_=(RTpg}9)hwUQuirIC?XH!@DTl@{$%NKioz!9qO!&_ z9$(+NGroR%>dMhVrPhj+X{%2qipibuMirS-1>V7@>@!X&abNoyU+F-02l`T@y7JUv z1sdx`N6<02L`(Q{yrU<~)ho;~Hov`e_1N+%)CaW;HQvD8^@L;$uM2G&MjuThy~~Ha zjcWqKq0#?0Ll4$~%6q!9bvEd*eSTp>4Ol}x)R9kYr;@WuqL4iWd!}DQ#r{prlA9^> s$jKL4aTC#hgkC$Hwpzb)YP4f25XYynIjekw#|0z=G^4H9$O%T1TU26{2zusj?=E+@7xwl{(kN{H$yf<&=KQsTCxBvE}Br`HCPP)>UWvL`m)r9$DwR%>9PTAf^>WVIoZtXq*DFNGRcCsL==tijeTDSEBXkV)(y{cOyuY*1nBCJtCk>By0pGCWf zZ36z7iwk(xykb{0*?dFOgh{4mb#vgG^-YT7{e>brk`@t?=us4TPN3Y2w4Tp z=QsTg4`1}9?&@28r|;SS%or*1E@0x|3)N?ODR@Aw9je@7?PF2nodo1@Lr#mzDLGU9 z#jBXR{rSm5ZR*X8h4GZ9Gj6YASvqnaggO=GUgG4G_j3FVX2eZC7I)$pa!N}70pcO# AqyPW_ literal 0 HcmV?d00001 diff --git a/Japanese.lproj/MainMenu.xib b/Japanese.lproj/MainMenu.xib new file mode 100644 index 0000000..30dad7c --- /dev/null +++ b/Japanese.lproj/MainMenu.xib @@ -0,0 +1,2804 @@ + + + + 1060 + 10C540 + 740 + 1038.25 + 458.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 740 + + + YES + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + + + YES + + YES + + + YES + + + + YES + + + NSApplication + + + + FirstResponder + + + NSApplication + + + 263 + 2 + {{48, 596}, {371, 157}} + 1886912512 + Midi Keys + NSWindow + + View + + {595, 157} + {371, 157} + + + 256 + + YES + + + 256 + + YES + + + 290 + {371, 57} + + + MidiKeyView + NSView + + + + 268 + {{233, 67}, {118, 15}} + + + YES + + 67501824 + 131072 + + + + + Helvetica + 12 + 16 + + + 127 + 1 + 64 + 0.0 + 0 + 1 + NO + NO + + + + + 268 + {{87, 67}, {31, 19}} + + + YES + + -2075001280 + 4195328 + 1 + + LucidaGrande + 11 + 16 + + + YES + + 6 + System + textBackgroundColor + + 3 + MQA + + + + 6 + System + textColor + + 3 + MAA + + + + + + + 268 + {{17, 69}, {64, 14}} + + + YES + + 67239424 + 4194304 + チャンネル: + + + + 6 + System + controlColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 6 + System + controlTextColor + + + + + + + 268 + {{156, 69}, {74, 14}} + + + YES + + 67239424 + 4194304 + ベロシティー: + + + + + + + + + 268 + {{123, 62}, {19, 27}} + + + YES + + 917024 + 0 + + 1 + 1 + 16 + 1 + YES + + + + {371, 87} + + + NSView + + + + 256 + + YES + + + 268 + {{123, 25}, {178, 22}} + + + YES + + -2076049856 + 132096 + + + 109199615 + 1 + + + + + + + + 400 + 75 + + + Item1 + + 1048576 + 2147483647 + 1 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + _popUpItemAction: + + + YES + + + OtherViews + + + YES + + + + Item2 + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + Item3 + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + 3 + YES + YES + 1 + + + + + 268 + {{123, 0}, {178, 22}} + + + YES + + -2076049856 + 132096 + + + 109199615 + 1 + + + + + + + + 400 + 75 + + + Item1 + + 1048576 + 2147483647 + 1 + + + _popUpItemAction: + + + YES + + + OtherViews + + + YES + + + + Item2 + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + Item3 + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + 3 + YES + YES + 1 + + + + + 268 + {{17, 6}, {87, 14}} + + + YES + + 67239424 + 4194304 + MIDI受信ポート: + + + + + + + + + 268 + {{17, 31}, {87, 14}} + + + YES + + 67239424 + 4194304 + MIDI送信ポート: + + + + + + + + + 256 + {{305, 7}, {55, 16}} + + + YES + + 67239424 + 131072 + スルー + + + 1211912703 + 2 + + NSSwitch + + + + 200 + 25 + + + + {{0, 89}, {371, 68}} + + + NSView + + + {371, 157} + + + + {{0, 0}, {1280, 832}} + {371, 179} + {595, 179} + MidiKeys + + + MainMenu + + YES + + + MidiKeys + + 1048576 + 2147483647 + + + submenuAction: + + MidiKeys + + YES + + + About MidiKeys + + 2147483647 + + + + + + 環境設定... + , + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + サービス + + 1048576 + 2147483647 + + + submenuAction: + + サービス + + YES + + _NSServicesMenu + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + MidiKeysを隠す + h + 1048576 + 2147483647 + + + + + + ほかを隠す + h + 1572864 + 2147483647 + + + + + + すべてを表示 + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + MidiKeysを終了 + q + 1048576 + 2147483647 + + + + + _NSAppleMenu + + + + + 鍵盤 + + 1048576 + 2147483647 + + + submenuAction: + + 鍵盤 + + YES + + + オクターブ上げる + u + 1048576 + 2147483647 + + + + + + オクターブ下げる + d + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + オールノートオフを送る + \ + 1048576 + 2147483647 + + + + + + + + + 編集 + + 1048576 + 2147483647 + + + submenuAction: + + 編集 + + YES + + + 取り消し + z + 1048576 + 2147483647 + + + + + + やり直し + Z + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + カット + x + 1048576 + 2147483647 + + + + + + コピー + c + 1048576 + 2147483647 + + + + + + ペースト + v + 1048576 + 2147483647 + + + + + + 削除 + + 1048576 + 2147483647 + + + + + + すべてを選択 + a + 1048576 + 2147483647 + + + + + + + + + ウインドウ + + 1048576 + 2147483647 + + + submenuAction: + + ウインドウ + + YES + + + ウインドウをしまう + m + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + すべてを手前に移動 + + 1048576 + 2147483647 + + + + + _NSWindowsMenu + + + + + ヘルプ + + 1048576 + 2147483647 + + + submenuAction: + + ヘルプ + + YES + + + MidiKeys Help + ? + 1048576 + 2147483647 + + + + + + + + _NSMainMenu + + + AppController + + + PreferencesController + + + KeyMapManager + + + + + YES + + + performMiniaturize: + + + + 37 + + + + arrangeInFront: + + + + 39 + + + + showHelp: + + + + 122 + + + + terminate: + + + + 139 + + + + orderFrontStandardAboutPanel: + + + + 142 + + + + hideOtherApplications: + + + + 146 + + + + hide: + + + + 152 + + + + unhideAllApplications: + + + + 153 + + + + cut: + + + + 175 + + + + paste: + + + + 176 + + + + redo: + + + + 178 + + + + selectAll: + + + + 179 + + + + undo: + + + + 180 + + + + copy: + + + + 181 + + + + delete: + + + + 195 + + + + destinationPopup + + + + 204 + + + + destinationSelected: + + + + 206 + + + + midiKeys + + + + 209 + + + + velocitySlider + + + + 212 + + + + velocitySliderChanged: + + + + 213 + + + + sourcePopup + + + + 220 + + + + sourceSelected: + + + + 221 + + + + channelField + + + + 228 + + + + channelStepper + + + + 229 + + + + channelDidChange: + + + + 230 + + + + delegate + + + + 231 + + + + octaveUp: + + + + 234 + + + + octaveDown: + + + + 235 + + + + nextKeyView + + + + 238 + + + + nextKeyView + + + + 239 + + + + nextKeyView + + + + 240 + + + + nextKeyView + + + + 241 + + + + initialFirstResponder + + + + 242 + + + + showPanel: + + + + 244 + + + + keyMapManager + + + + 246 + + + + delegate + + + + 247 + + + + toggleView + + + + 251 + + + + hiddenItemsView + + + + 255 + + + + midiThruCheckbox + + + + 257 + + + + toggleMidiThru: + + + + 258 + + + + sendAllNotesOff: + + + + 261 + + + + + YES + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + 21 + + + YES + + + + Window + + + 2 + + + YES + + + + + + + 250 + + + YES + + + + + + + + + + + 208 + + + + + 210 + + + YES + + + + + + 211 + + + YES + + + + + + 222 + + + YES + + + + + + 223 + + + YES + + + + + + 225 + + + YES + + + + + + 254 + + + YES + + + + + + + + + + 198 + + + YES + + + + + + 217 + + + YES + + + + + + 219 + + + YES + + + + + + 236 + + + YES + + + + + + 256 + + + YES + + + + + + 29 + + + YES + + + + + + + + MainMenu + + + 19 + + + YES + + + + + + 24 + + + YES + + + + + + + + 5 + + + + + 23 + + + + + 92 + + + + + 56 + + + YES + + + + + + 57 + + + YES + + + + + + + + + + + + + + + 58 + + + + + 129 + + + + + 131 + + + YES + + + + + + 130 + + + + + 134 + + + + + 136 + + + + + 143 + + + + + 144 + + + + + 145 + + + + + 149 + + + + + 150 + + + + + 83 + + + YES + + + + + + 81 + + + YES + + + + + + + + + 78 + + + + + 233 + + + + + 259 + + + + + 260 + + + + + 103 + + + YES + + + + + + 106 + + + YES + + + + + + 111 + + + + + 163 + + + YES + + + + + + 169 + + + YES + + + + + + + + + + + + + 156 + + + + + 157 + + + + + 158 + + + + + 160 + + + + + 164 + + + + + 171 + + + + + 172 + + + + + 173 + + + + + 203 + + + AppController + + + 243 + + + PreferencesController + + + 245 + + + KeyMapManager + + + 263 + + + + + 264 + + + + + 265 + + + + + 266 + + + + + 267 + + + + + 268 + + + YES + + + + + + 269 + + + YES + + + + + + 270 + + + + + 271 + + + + + 272 + + + + + 199 + + + YES + + + + + + + + 201 + + + + + 200 + + + + + 197 + + + + + 215 + + + YES + + + + + + + + 218 + + + + + 216 + + + + + 214 + + + + + -3 + + + Application + + + + + YES + + YES + 103.IBPluginDependency + 103.ImportedFromIB2 + 106.IBPluginDependency + 106.ImportedFromIB2 + 111.IBPluginDependency + 111.ImportedFromIB2 + 129.IBPluginDependency + 129.ImportedFromIB2 + 130.IBPluginDependency + 130.ImportedFromIB2 + 131.IBPluginDependency + 131.ImportedFromIB2 + 134.IBPluginDependency + 134.ImportedFromIB2 + 136.IBPluginDependency + 136.ImportedFromIB2 + 143.IBPluginDependency + 143.ImportedFromIB2 + 144.IBPluginDependency + 144.ImportedFromIB2 + 145.IBPluginDependency + 145.ImportedFromIB2 + 149.IBPluginDependency + 149.ImportedFromIB2 + 150.IBPluginDependency + 150.ImportedFromIB2 + 156.IBPluginDependency + 156.ImportedFromIB2 + 157.IBPluginDependency + 157.ImportedFromIB2 + 158.IBPluginDependency + 158.ImportedFromIB2 + 160.IBPluginDependency + 160.ImportedFromIB2 + 163.IBPluginDependency + 163.ImportedFromIB2 + 164.IBPluginDependency + 164.ImportedFromIB2 + 169.IBPluginDependency + 169.ImportedFromIB2 + 171.IBPluginDependency + 171.ImportedFromIB2 + 172.IBPluginDependency + 172.ImportedFromIB2 + 173.IBPluginDependency + 173.ImportedFromIB2 + 19.IBPluginDependency + 19.ImportedFromIB2 + 197.IBPluginDependency + 197.ImportedFromIB2 + 198.IBPluginDependency + 198.ImportedFromIB2 + 199.IBPluginDependency + 199.ImportedFromIB2 + 2.IBPluginDependency + 2.ImportedFromIB2 + 200.IBPluginDependency + 200.ImportedFromIB2 + 201.IBPluginDependency + 201.ImportedFromIB2 + 203.ImportedFromIB2 + 208.IBPluginDependency + 208.ImportedFromIB2 + 21.IBEditorWindowLastContentRect + 21.IBPluginDependency + 21.IBWindowTemplateEditedContentRect + 21.ImportedFromIB2 + 21.windowTemplate.hasMaxSize + 21.windowTemplate.hasMinSize + 21.windowTemplate.maxSize + 21.windowTemplate.minSize + 210.IBPluginDependency + 210.ImportedFromIB2 + 211.IBPluginDependency + 211.ImportedFromIB2 + 214.IBPluginDependency + 214.ImportedFromIB2 + 215.IBPluginDependency + 215.ImportedFromIB2 + 216.IBPluginDependency + 216.ImportedFromIB2 + 217.IBPluginDependency + 217.ImportedFromIB2 + 218.IBPluginDependency + 218.ImportedFromIB2 + 219.IBPluginDependency + 219.ImportedFromIB2 + 222.IBPluginDependency + 222.ImportedFromIB2 + 223.IBPluginDependency + 223.ImportedFromIB2 + 225.IBPluginDependency + 225.ImportedFromIB2 + 23.IBPluginDependency + 23.ImportedFromIB2 + 233.IBPluginDependency + 233.ImportedFromIB2 + 236.IBPluginDependency + 236.ImportedFromIB2 + 24.IBPluginDependency + 24.ImportedFromIB2 + 243.ImportedFromIB2 + 245.ImportedFromIB2 + 250.IBPluginDependency + 250.ImportedFromIB2 + 254.IBPluginDependency + 254.ImportedFromIB2 + 256.IBPluginDependency + 256.ImportedFromIB2 + 259.IBPluginDependency + 259.ImportedFromIB2 + 260.IBPluginDependency + 260.ImportedFromIB2 + 29.IBEditorWindowLastContentRect + 29.IBPluginDependency + 29.ImportedFromIB2 + 5.IBPluginDependency + 5.ImportedFromIB2 + 56.IBPluginDependency + 56.ImportedFromIB2 + 57.IBPluginDependency + 57.ImportedFromIB2 + 58.IBPluginDependency + 58.ImportedFromIB2 + 78.IBPluginDependency + 78.ImportedFromIB2 + 81.IBPluginDependency + 81.ImportedFromIB2 + 83.IBPluginDependency + 83.ImportedFromIB2 + 92.IBPluginDependency + 92.ImportedFromIB2 + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + {{42, 909}, {371, 157}} + com.apple.InterfaceBuilder.CocoaPlugin + {{42, 909}, {371, 157}} + + + + {595, 157} + {371, 157} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{63, 1045}, {348, 20}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + + + YES + + + YES + + + + + YES + + + YES + + + + 282 + + + + YES + + AppController + NSObject + + YES + + YES + channelDidChange: + destinationSelected: + octaveDown: + octaveUp: + sendAllNotesOff: + showPreferences: + sourceSelected: + toggleHotKeys: + toggleMidiControls: + toggleMidiThru: + velocitySliderChanged: + + + YES + id + id + id + id + id + id + id + id + id + id + id + + + + YES + + YES + _toggleHotKeysMenuItem + channelField + channelStepper + destinationPopup + hiddenItemsView + keyMapManager + midiKeys + midiThruCheckbox + sourcePopup + toggleView + velocitySlider + + + YES + NSMenuItem + NSTextField + NSStepper + NSPopUpButton + NSView + KeyMapManager + MidiKeyView + NSButton + NSPopUpButton + NSView + NSSlider + + + + IBProjectSource + AppController.h + + + + AppController + NSObject + + IBUserSource + + + + + FirstResponder + + sendAllNotesOff: + id + + + IBUserSource + + + + + KeyMapManager + NSObject + + IBProjectSource + KeyMapManager.h + + + + KeyMapManager + NSObject + + IBUserSource + + + + + MidiKeyView + NSView + + mDelegate + id + + + IBProjectSource + MidiKeyView.h + + + + MidiKeyView + NSView + + IBUserSource + + + + + NSObject + + + + NSObject + + IBProjectSource + MidiKeysApplication.h + + + + NSObject + + IBProjectSource + OverlayIndicator.h + + + + NSObject + + IBProjectSource + ShortcutRecorder.h + + + + NSObject + + IBProjectSource + ShortcutRecorderCell.h + + + + PreferencesController + NSObject + + YES + + YES + cancel: + ok: + showPanel: + + + YES + id + id + id + + + + YES + + YES + _clickThroughCheckbox + _octaveDownHotKeysShortcut + _octaveUpHotKeysShortcut + _prefsWindow + _toggleHotKeysShortcut + _velocityDownHotKeysShortcut + _velocityUpHotKeysShortcut + commandModifierCheckbox + controlModifierCheckbox + floatWindowCheckbox + highlightColourWell + keymapPopup + optionModifierCheckbox + shiftModifierCheckbox + showKeyCapsCheckbox + showNotificationOverlaysCheckbox + solidOnTopCheckbox + useHotKeysCheckbox + windowTransparencySlider + + + YES + NSButton + ShortcutRecorder + ShortcutRecorder + NSWindow + ShortcutRecorder + ShortcutRecorder + ShortcutRecorder + NSButton + NSButton + NSButton + NSColorWell + NSPopUpButton + NSButton + NSButton + NSButton + NSButton + NSButton + NSButton + NSSlider + + + + IBProjectSource + PreferencesController.h + + + + PreferencesController + NSObject + + YES + + YES + transparencySlider + useHotkeysCheckbox + + + YES + NSSlider + NSButton + + + + IBUserSource + + + + + ShortcutRecorder + NSControl + + delegate + id + + + + + + YES + + NSActionCell + NSCell + + IBFrameworkSource + AppKit.framework/Headers/NSActionCell.h + + + + NSApplication + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSApplication.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSApplicationScripting.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSColorPanel.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSHelpManager.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSPageLayout.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSUserInterfaceItemSearching.h + + + + NSBrowser + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSBrowser.h + + + + NSButton + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSButton.h + + + + NSButtonCell + NSActionCell + + IBFrameworkSource + AppKit.framework/Headers/NSButtonCell.h + + + + NSCell + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSCell.h + + + + NSColorWell + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSColorWell.h + + + + NSControl + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSControl.h + + + + NSFormatter + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFormatter.h + + + + NSMatrix + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSMatrix.h + + + + NSMenu + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSMenu.h + + + + NSMenuItem + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSMenuItem.h + + + + NSMenuItemCell + NSButtonCell + + IBFrameworkSource + AppKit.framework/Headers/NSMenuItemCell.h + + + + NSMovieView + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSMovieView.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSAccessibility.h + + + + NSObject + + + + NSObject + + + + NSObject + + + + NSObject + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSDictionaryController.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSDragging.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSFontManager.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSFontPanel.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSKeyValueBinding.h + + + + NSObject + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSNibLoading.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSOutlineView.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSPasteboard.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSSavePanel.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSTableView.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSToolbarItem.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSView.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSClassDescription.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObjectScripting.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSPortCoder.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptClassDescription.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptObjectSpecifiers.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptWhoseTests.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLDownload.h + + + + NSObject + + IBFrameworkSource + Sparkle.framework/Headers/SUAppcast.h + + + + NSObject + + IBFrameworkSource + Sparkle.framework/Headers/SUUpdater.h + + + + NSPopUpButton + NSButton + + IBFrameworkSource + AppKit.framework/Headers/NSPopUpButton.h + + + + NSPopUpButtonCell + NSMenuItemCell + + IBFrameworkSource + AppKit.framework/Headers/NSPopUpButtonCell.h + + + + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSInterfaceStyle.h + + + + NSResponder + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSResponder.h + + + + NSSlider + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSSlider.h + + + + NSSliderCell + NSActionCell + + IBFrameworkSource + AppKit.framework/Headers/NSSliderCell.h + + + + NSStepper + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSStepper.h + + + + NSStepperCell + NSActionCell + + IBFrameworkSource + AppKit.framework/Headers/NSStepperCell.h + + + + NSTableView + NSControl + + + + NSText + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSText.h + + + + NSTextField + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSTextField.h + + + + NSTextFieldCell + NSActionCell + + IBFrameworkSource + AppKit.framework/Headers/NSTextFieldCell.h + + + + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSClipView.h + + + + NSView + + + + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSRulerView.h + + + + NSView + NSResponder + + + + NSWindow + + IBFrameworkSource + AppKit.framework/Headers/NSDrawer.h + + + + NSWindow + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSWindow.h + + + + NSWindow + + IBFrameworkSource + AppKit.framework/Headers/NSWindowScripting.h + + + + + 0 + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 + + + YES + ../MidiKeys.xcodeproj + 3 + + diff --git a/Japanese.lproj/Preferences.xib b/Japanese.lproj/Preferences.xib new file mode 100644 index 0000000..544e60e --- /dev/null +++ b/Japanese.lproj/Preferences.xib @@ -0,0 +1,1275 @@ + + + + 1060 + 10C540 + 740 + 1038.25 + 458.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 740 + + + YES + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + + + YES + + YES + + + YES + + + + YES + + PreferencesController + + + FirstResponder + + + NSApplication + + + 1 + 2 + {{74, 360}, {348, 407}} + 1886912512 + MidiKeys 環境設定 + NSWindow + + View + + {1.79769e+308, 1.79769e+308} + {213, 107} + + + 256 + + YES + + + 256 + + YES + + YES + + NSColor pasteboard type + + + + {{208, 362}, {38, 26}} + + YES + YES + + 1 + MC4wNTgxMzA0OTg5OCAwLjA1NTU0MTg5OTA2IDEAA + + + + + 256 + {{128, 276}, {178, 26}} + + YES + + -2076049856 + 1024 + + LucidaGrande + 13 + 1044 + + + -2038284033 + 1 + + + + + + 400 + 75 + + + US-English + + 1048576 + 2147483647 + 1 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + _popUpItemAction: + + + YES + + + OtherViews + + + YES + + + + UK-English + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + German + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + French + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + 3 + YES + YES + 1 + + + + + 256 + {{42, 268}, {84, 31}} + + YES + + 67239424 + 4194304 + 44Kt44O844Oe44OD44OXOgo + + LucidaGrande + 12 + 16 + + + + 6 + System + controlColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 6 + System + controlTextColor + + 3 + MAA + + + + + + + 256 + {{43, 244}, {262, 18}} + + YES + + 67239424 + 0 + ホットキーを使ってバックグラウンドで演奏 + + + 1211912703 + 2 + + NSSwitch + + + + 200 + 25 + + + + + 256 + {{43, 125}, {239, 18}} + + YES + + 67239424 + 0 + MIDIKeysを常に全面に表示 + + + 1211912703 + 2 + + + + 200 + 25 + + + + + 256 + {{58, 319}, {245, 17}} + + YES + + 67501824 + 131072 + + + + + Helvetica + 12 + 16 + + + 100 + 0.0 + 75 + 0.0 + 10 + 0 + NO + NO + + + + + 256 + {{55, 344}, {105, 14}} + + YES + + 67239424 + 4194304 + 透明度を変更: + + LucidaGrande + 11 + 3100 + + + + + + + + + 256 + {{40, 367}, {160, 16}} + + YES + + 67239424 + 4194304 + 弾いてる鍵盤を次の色で表示 + + + + + + + + + 256 + {{58, 80}, {245, 17}} + + YES + + 67501824 + 131072 + + + + + + 100 + 0.0 + 75 + 0.0 + 10 + 0 + NO + NO + + + + + 256 + {{225, 12}, {84, 32}} + + YES + + 67239424 + 134217728 + OK + + + -2038284033 + 1 + + + DQ + 200 + 25 + + + + + 256 + {{120, 12}, {105, 32}} + + YES + + 67239424 + 134217728 + キャンセル + + + -2038284033 + 1 + + + Gw + 200 + 25 + + + + + 256 + {{57, 222}, {76, 18}} + + YES + + 67239424 + 131072 + ⌃ Control + + + 1211912703 + 2 + + + + 200 + 25 + + + + + 256 + {{57, 202}, {76, 18}} + + YES + + 67239424 + 131072 + ⇧ Shift + + + 1211912703 + 2 + + + + 200 + 25 + + + + + 256 + {{57, 182}, {76, 18}} + + YES + + 67239424 + 131072 + ⌥ Option + + + 1211912703 + 2 + + + + 200 + 25 + + + + + 256 + {{57, 162}, {92, 18}} + + YES + + 67239424 + 131072 + ⌘ Command + + + 1211912703 + 2 + + + + 200 + 25 + + + + + 256 + {{55, 105}, {105, 14}} + + YES + + 67239424 + 4194304 + 透明度を変更: + + + + + + + + + 256 + {{57, 58}, {224, 16}} + + YES + + 67239424 + 131072 + MidiKeysが前面にあるとき不透明にする + + + 1211912703 + 2 + + + + 200 + 25 + + + + {348, 407} + + {{0, 0}, {1280, 832}} + {213, 129} + {1.79769e+308, 1.79769e+308} + + + + + YES + + + delegate + + + + 18 + + + + keymapPopup + + + + 23 + + + + highlightColourWell + + + + 24 + + + + floatWindowCheckbox + + + + 25 + + + + useHotKeysCheckbox + + + + 26 + + + + transparencySlider + + + + 32 + + + + windowTransparencySlider + + + + 35 + + + + ok: + + + + 40 + + + + cancel: + + + + 41 + + + + nextKeyView + + + + 49 + + + + nextKeyView + + + + 50 + + + + controlModifierCheckbox + + + + 56 + + + + shiftModifierCheckbox + + + + 57 + + + + optionModifierCheckbox + + + + 58 + + + + commandModifierCheckbox + + + + 59 + + + + refreshModifierCheckboxState: + + + + 60 + + + + nextKeyView + + + + 61 + + + + nextKeyView + + + + 62 + + + + nextKeyView + + + + 63 + + + + nextKeyView + + + + 64 + + + + initialFirstResponder + + + + 67 + + + + nextKeyView + + + + 68 + + + + nextKeyView + + + + 69 + + + + nextKeyView + + + + 70 + + + + nextKeyView + + + + 72 + + + + nextKeyView + + + + 73 + + + + nextKeyView + + + + 74 + + + + solidOnTopCheckbox + + + + 77 + + + + + YES + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + 5 + + + YES + + + + PreferencesPanel + + + 6 + + + YES + + + + + + + + + + + + + + + + + + + + + + 7 + + + + + 11 + + + YES + + + + + + 14 + + + YES + + + + + + 16 + + + YES + + + + + + 17 + + + YES + + + + + + 27 + + + YES + + + + + + 28 + + + YES + + + + + + 29 + + + YES + + + + + + 33 + + + YES + + + + + + 36 + + + YES + + + + + + 37 + + + YES + + + + + + 52 + + + YES + + + + + + 53 + + + YES + + + + + + 54 + + + YES + + + + + + 55 + + + YES + + + + + + 66 + + + YES + + + + + + 76 + + + YES + + + + + + 79 + + + YES + + + + + + 80 + + + + + 81 + + + + + 82 + + + + + 83 + + + + + 84 + + + + + 85 + + + + + 86 + + + + + 87 + + + + + 88 + + + + + 89 + + + + + 90 + + + + + 91 + + + + + 92 + + + + + 93 + + + + + 94 + + + + + 9 + + + YES + + + + + + + + + 15 + + + + + 13 + + + + + 12 + + + + + 10 + + + + + -3 + + + Application + + + + + YES + + YES + 10.IBPluginDependency + 10.ImportedFromIB2 + 11.IBPluginDependency + 11.ImportedFromIB2 + 12.IBPluginDependency + 12.ImportedFromIB2 + 13.IBPluginDependency + 13.ImportedFromIB2 + 14.IBPluginDependency + 14.ImportedFromIB2 + 15.IBPluginDependency + 15.ImportedFromIB2 + 16.IBPluginDependency + 16.ImportedFromIB2 + 17.IBPluginDependency + 17.ImportedFromIB2 + 27.IBPluginDependency + 27.ImportedFromIB2 + 28.IBPluginDependency + 28.ImportedFromIB2 + 29.IBPluginDependency + 29.ImportedFromIB2 + 33.IBPluginDependency + 33.ImportedFromIB2 + 36.IBPluginDependency + 36.ImportedFromIB2 + 37.IBPluginDependency + 37.ImportedFromIB2 + 5.IBEditorWindowLastContentRect + 5.IBPluginDependency + 5.IBWindowTemplateEditedContentRect + 5.ImportedFromIB2 + 5.windowTemplate.hasMinSize + 5.windowTemplate.minSize + 52.IBPluginDependency + 52.ImportedFromIB2 + 53.IBPluginDependency + 53.ImportedFromIB2 + 54.IBPluginDependency + 54.ImportedFromIB2 + 55.IBPluginDependency + 55.ImportedFromIB2 + 6.IBPluginDependency + 6.ImportedFromIB2 + 66.IBPluginDependency + 66.ImportedFromIB2 + 7.IBPluginDependency + 7.ImportedFromIB2 + 76.IBPluginDependency + 76.ImportedFromIB2 + 9.IBPluginDependency + 9.ImportedFromIB2 + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{105, 590}, {348, 407}} + com.apple.InterfaceBuilder.CocoaPlugin + {{105, 590}, {348, 407}} + + + {213, 107} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + + + YES + + + YES + + + + + YES + + + YES + + + + 94 + + + + YES + + FirstResponder + + IBUserSource + + + + + PreferencesController + NSObject + + YES + + YES + cancel: + ok: + refreshModifierCheckboxState: + + + YES + id + id + id + + + + YES + + YES + commandModifierCheckbox + controlModifierCheckbox + floatWindowCheckbox + highlightColourWell + keymapPopup + optionModifierCheckbox + shiftModifierCheckbox + solidOnTopCheckbox + transparencySlider + useHotKeysCheckbox + windowTransparencySlider + + + YES + NSButton + NSButton + NSButton + NSColorWell + NSPopUpButton + NSButton + NSButton + NSButton + NSSlider + NSButton + NSSlider + + + + IBUserSource + + + + + + 0 + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 + + + YES + + 3 + + diff --git a/KeyMapManager.h b/KeyMapManager.h new file mode 100644 index 0000000..246a2da --- /dev/null +++ b/KeyMapManager.h @@ -0,0 +1,29 @@ +// +// KeyMapManager.h +// MidiKeys +// +// Created by Chris Reed on Sat Oct 26 2002. +// Copyright (c) 2002 Chris Reed. All rights reserved. +// + +#import + +@class MidiKeyMap; + +@interface KeyMapManager : NSObject +{ + NSDictionary *mPlist; +} + ++ sharedInstance; +- init; + +- (NSArray *)allKeyMapNames; +- (NSArray *)allKeyMapLocalisedNames; +- (id)keyMapDefinitionWithName:(NSString *)name; +- (MidiKeyMap *)keyMapWithName:(NSString *)name; + +- (NSString *)localisedNameForKeyMapWithName:(NSString *)name; +- (NSString *)nameForKeyMapWithLocalisedName:(NSString *)localName; + +@end diff --git a/KeyMapManager.m b/KeyMapManager.m new file mode 100644 index 0000000..212a38e --- /dev/null +++ b/KeyMapManager.m @@ -0,0 +1,110 @@ +// +// KeyMapManager.mm +// MidiKeys +// +// Created by Chris Reed on Sat Oct 26 2002. +// Copyright (c) 2002 Chris Reed. All rights reserved. +// + +#import "KeyMapManager.h" +#import "MidiKeyMap.h" + + +@implementation KeyMapManager + +static KeyMapManager *sharedInstance = nil; + ++ sharedInstance +{ + return sharedInstance ? sharedInstance : [[self alloc] init]; +} + +// always return the shared instance +- init +{ + if (sharedInstance) + { + [self release]; + } + else if (self = [super init]) + { + sharedInstance = self; + } + return sharedInstance; +} + +// disallow disposing of the shared instance +- (void)dealloc +{ + if (self == sharedInstance) + return; + [mPlist release]; + [super dealloc]; +} + +// read the plist file and find all the keymaps +- (void)awakeFromNib +{ + // read the map from the the definition file + NSString *plistPath = [[NSBundle bundleForClass:[self class]] pathForResource:@"KeyMaps" ofType:@"plist"]; + mPlist = [[NSDictionary dictionaryWithContentsOfFile:plistPath] retain]; + if (!mPlist) + { + mPlist = [[NSDictionary dictionary] retain]; + } +} + +// return the names sorted alphabetically +- (NSArray *)allKeyMapNames +{ + return [[mPlist allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; +} + +- (NSArray *)allKeyMapLocalisedNames +{ + NSArray *names = [self allKeyMapNames]; + id iterator; + NSMutableArray *localisedNames = [NSMutableArray array]; + for (iterator in names) + { + [localisedNames addObject:[self localisedNameForKeyMapWithName:iterator]]; + } + return [localisedNames sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; +} + +- (id)keyMapDefinitionWithName:(NSString *)name +{ + if (!name) + return nil; + return [mPlist objectForKey:name]; +} + +- (MidiKeyMap *)keyMapWithName:(NSString *)name +{ + if (!name) + return nil; + NSArray *def = [self keyMapDefinitionWithName:name]; + if (!def) + return nil; + return [[[MidiKeyMap alloc] initWithDefinition:def] autorelease]; +} + +- (NSString *)localisedNameForKeyMapWithName:(NSString *)name +{ + return NSLocalizedStringFromTable(name, @"KeyMapNames", nil); +} + +- (NSString *)nameForKeyMapWithLocalisedName:(NSString *)localName +{ + NSArray *names = [self allKeyMapNames]; + id iterator; + for (iterator in names) + { + if ([localName isEqualToString:[self localisedNameForKeyMapWithName:iterator]]) + return iterator; + } + // not found + return nil; +} + +@end diff --git a/KeyMaps.plist b/KeyMaps.plist new file mode 100644 index 0000000..ad64c58 --- /dev/null +++ b/KeyMaps.plist @@ -0,0 +1,195 @@ + + + + + Full + + Ranges + + + FirstMidiNote + 39 + KeyCodes + + 50 + 48 + 12 + 19 + 13 + 20 + 14 + 21 + 15 + 17 + 22 + 16 + 26 + 32 + 34 + 25 + 31 + 29 + 35 + 27 + 33 + 30 + 51 + 42 + + + + FirstMidiNote + 60 + KeyCodes + + 6 + 1 + 7 + 2 + 8 + 9 + 5 + 11 + 4 + 45 + 38 + 46 + 43 + 37 + 47 + 41 + 44 + + + + + Reversed Full + + Ranges + + + FirstMidiNote + 63 + KeyCodes + + 50 + 48 + 12 + 19 + 13 + 20 + 14 + 21 + 15 + 17 + 22 + 16 + 26 + 32 + 34 + 25 + 31 + 29 + 35 + 27 + 33 + 30 + 51 + 42 + + + + FirstMidiNote + 48 + KeyCodes + + 6 + 1 + 7 + 2 + 8 + 9 + 5 + 11 + 4 + 45 + 38 + 46 + 43 + 37 + 47 + 41 + 44 + + + + + Single + + Ranges + + + FirstMidiNote + 60 + KeyCodes + + 6 + 1 + 7 + 2 + 8 + 9 + 5 + 11 + 4 + 45 + 38 + 46 + 43 + 37 + 47 + 41 + 44 + + + + + Upper Single + + Ranges + + + FirstMidiNote + 51 + KeyCodes + + 50 + 48 + 12 + 19 + 13 + 20 + 14 + 21 + 15 + 17 + 22 + 16 + 26 + 32 + 34 + 25 + 31 + 29 + 35 + 27 + 33 + 30 + 51 + 42 + + + + + + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d28a2c2 --- /dev/null +++ b/LICENSE @@ -0,0 +1,26 @@ + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +o Redistributions of source code must retain the above copyright notice, this list + of conditions and the following disclaimer. + +o Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + +o Neither the name of Immo Software nor the names of its contributors may be used + to endorse or promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/LiesMich.rtf b/LiesMich.rtf new file mode 100644 index 0000000..c362932 --- /dev/null +++ b/LiesMich.rtf @@ -0,0 +1,94 @@ +{\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica-Bold;\f1\fswiss\fcharset77 Helvetica;\f2\fswiss\fcharset77 Helvetica-Oblique; +} +{\colortbl;\red255\green255\blue255;} +\vieww12000\viewh16200\viewkind0 +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural + +\f0\b\fs32 \cf0 MidiKeys 1.6 +\f1\b0\fs24 \ + +\fs20 Copyright \'a9 2002-2003 Chris Reed. Alle Rechte vorbehalten. +\fs24 \ +\ +\ + +\f0\b\fs26 Einleitung +\f1\b0\fs24 \ +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. \ +\ +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.\ +\ + +\f0\b\fs26 Voraussetzungen +\f1\b0\fs24 \ +\'a5 Mac OS X 10.2 oder neuer\ +\'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.\ +\ + +\f0\b\fs26 Installation +\f1\b0\fs24 \ +Kopieren Sie MidiKeys in den Programmordner Ihrer Wahl.\ +\ + +\f0\b\fs26 MidiKeys verwenden +\f1\b0\fs24 \ +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.)\ +\ +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.\ +\ +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.\ +\ +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 +\f2\i \'e3Weiterleiten\'d3 aktiviert ist, werden die empfangenen Noten an das eingestellte Ziel weitergeleitet.\ +\ +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. +\f1\i0 \ +\ +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. +\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). +\f1\i0 \ +\ +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.\ +\ + +\f0\b\fs26 Einstellungen +\f1\b0\fs24 \ +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.\ +\ +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.\ +\ +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. +\f2\i Entsprechend werden bei \'e3Einfach (oben)\'d2 nur die oberen Tasten und bei \'e3Gesamt (vertauscht)\'d2 alle Tasten mit vertauschten Oktaven verwendet. +\f1\i0 \ +\ +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.\ +\ +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.)\ +\ +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.\ +\ +\ + +\f0\b\fs26 Bekannte Probleme\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural + +\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. +\f2\i (Anm. des \'86bersetzers: Leider nicht mein PowerBook, auf meinem ProKeyboard tritt das Problem auch auf)\ + +\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.\ +\'a5 Manche Tastenkombinationen k\'9annen nicht f\'9fr den systemweiten Zugriff verwendet werden. Vermutlich kann ich daran nichts \'8andern.\ +\'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.\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural + +\f0\b\fs26 \cf0 \ +Sonstige Anmerkungen\ + +\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.\ +\ +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.\ +\ +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.\ +\ +Ich kann per e-mail unter +\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.)} \ No newline at end of file diff --git a/Lisez-Moi.rtf b/Lisez-Moi.rtf new file mode 100644 index 0000000..5896a54 --- /dev/null +++ b/Lisez-Moi.rtf @@ -0,0 +1,83 @@ +{\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica-Bold;\f1\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\paperw11900\paperh16840\margl1440\margr1440\vieww11720\viewh16200\viewkind0 +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural + +\f0\b\fs32 \cf0 MidiKeys 1.6 +\f1\b0\fs24 \ + +\fs20 Copyright \'a9 2002-2003 Chris Reed. All rights reserved. +\fs24 \ +\ +\ + +\f0\b\fs26 Introduction +\f1\b0\fs24 \ +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.\ +\ +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.\ +\ +\ +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\b\fs26 \cf0 Configuration requise\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural + +\f1\b0\fs24 \cf0 \'a5 Mac OS X 10.2 ou sup\'8erieur\ +\'a5 Un clavier virtuel, un s\'8equenceur MIDI, ou n'importe quel synth\'8etiseur, module, sampleur MIDI externe avec une interface MIDI.\ +\ + +\f0\b\fs26 Installation\ + +\f1\b0\fs24 Copiez l'application MidiKeys dans le dossier Applications de votre cho +\fs26 ix.\ +\ + +\f0\b Utilisation de MidiKeys\ + +\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").\ +\ +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.\ +\ +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.\ +\ +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.\ +\ +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".\ +\ + +\f0\b\fs26 Pr\'8ef\'8erences +\f1\b0\fs24 \ +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".\ +\ +Vous pouvez d\'8efinir la couleur des touches actives ainsi que leur transparence. \ +\ +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".\ +\ +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. \ +\ +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. \ +\ +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.\ +\ + +\f0\b\fs26 Probl\'8fmes connus\ + +\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.\ +\'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.\ +\'a5 Certaines combinaisons de touches ne peuvent pas \'90tre utilis\'8ees comme "hotkeys". Je doute que je puisse y changer quoi que ce soit.\ +\'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".\ +\ + +\f0\b\fs26 Remarques diverses\ + +\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.\ +\ +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.\ +\ +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.\ +\ +Vous pouvez me contacter par mail \'88 l'adresse suivante: flit@ftml.net \ +\ +} \ No newline at end of file diff --git a/MidiKeyMap.h b/MidiKeyMap.h new file mode 100644 index 0000000..a579e9e --- /dev/null +++ b/MidiKeyMap.h @@ -0,0 +1,47 @@ +// +// MidiKeyMap.h +// MidiKeys +// +// Created by Chris Reed on Sat Oct 26 2002. +// Copyright (c) 2002 Chris Reed. All rights reserved. +// + +#import + +//! Maximum number of key codes. +#define MAX_KEY_CODES (256) + +//! Maximum number of MIDI notes. +#define MAX_MIDI_NOTES (128) + +/*! + * @brief Maps key codes to MIDI notes. + */ +@interface MidiKeyMap : NSObject +{ + id mDefinition; + NSArray *mRanges; + int mKeyCodeToNoteMap[MAX_KEY_CODES]; + int mNoteToKeyCodeMap[MAX_MIDI_NOTES]; + BOOL mHotKeysAreRegistered; + NSMutableDictionary *mRegisteredHotKeys; +} + +// Definition is currently an array of range dictionaries +- initWithDefinition:(id)def; + +//! Returns -1 if the key was not found +- (int)midiNoteForKeyCode:(int)keycode; +- (int)midiNoteForHotKeyWithIdentifier:(UInt32)identifier; + +//! @brief Returns the key code for a MIDI note. +- (int)keyCodeForMidiNote:(int)note; + +//! @brief Returns the Unicode character for a MIDI note value. +- (NSString *)characterForMidiNote:(int)midiNote; + +//! @brief Registers all keys handled by the key map as system hot keys. +- (void)registerHotKeysWithModifiers:(int)modifiers; +- (void)unregisterHotKeys; + +@end diff --git a/MidiKeyMap.m b/MidiKeyMap.m new file mode 100644 index 0000000..16ffb03 --- /dev/null +++ b/MidiKeyMap.m @@ -0,0 +1,280 @@ +// +// MidiKeyMap.mm +// MidiKeys +// +// Created by Chris Reed on Sat Oct 26 2002. +// Copyright (c) 2002 Chris Reed. All rights reserved. +// + +#import "MidiKeyMap.h" +#import + +@interface MidiKeyMap (InternalMethods) + +- (void)constructMaps; + +@end + +@implementation MidiKeyMap + +- initWithDefinition:(id)def +{ + self = [super init]; + if (self) + { + mDefinition = [def retain]; + mRanges = [[mDefinition objectForKey:@"Ranges"] retain]; + [self constructMaps]; + } + return self; +} + +- (void)dealloc +{ + // can't leave hotkeys sitting around without a way to remove them + if (mHotKeysAreRegistered) + { + [self unregisterHotKeys]; + } + + [mRegisteredHotKeys release]; + [mRanges release]; + [mDefinition release]; + [super dealloc]; +} + +- (void)constructMaps +{ + int i; + for (i=0; i < MAX_KEY_CODES; ++i) + { + mKeyCodeToNoteMap[i] = -1; + } + + for (i=0; i < MAX_MIDI_NOTES; ++i) + { + mNoteToKeyCodeMap[i] = -1; + } + + id range; + for (range in mRanges) + { + @try + { + NSArray *rangeKeys = [range objectForKey:@"KeyCodes"]; + int rangeStartNote = [[range objectForKey:@"FirstMidiNote"] intValue]; + int numKeyCodes = [rangeKeys count]; + for (i=0; i < numKeyCodes; ++i) + { + id thisKey = [rangeKeys objectAtIndex:i]; + int keycode = [thisKey intValue]; + int note = rangeStartNote + i; + mKeyCodeToNoteMap[keycode] = note; + mNoteToKeyCodeMap[note] = keycode; + } + } + @catch (NSException * e) + { + // a key was missing from the range dictionary (or something) + NSLog(@"invalid range definition"); + // move on to the next range + // @todo remove the offending range from the key map + } + } +} + +//! @return The MIDI note number that corresponds to the given key code. +//! @retval -1 There is no mapping for the given key code. +- (int)midiNoteForKeyCode:(int)keycode +{ + if (keycode < 0 || keycode >= MAX_KEY_CODES) + { + return -1; + } + else + { + return mKeyCodeToNoteMap[keycode]; + } +} + +// look up the hot key in our dictionary +- (int)midiNoteForHotKeyWithIdentifier:(UInt32)identifier +{ + // return -1 if there are no hotkeys installed + if (!mHotKeysAreRegistered || [mRegisteredHotKeys count]==0) + return -1; + + int note = [[mRegisteredHotKeys objectForKey:[NSValue valueWithPointer:(void *)identifier]] intValue]; + return note; +} + +- (int)keyCodeForMidiNote:(int)note +{ + if (note < 0 || note >= MAX_MIDI_NOTES) + { + return -1; + } + else + { + return mNoteToKeyCodeMap[note]; + } +} + +//! @return An NSString containing the character value. Will be an empty string if +//! the key map doesn't have an entry for the given note value. +- (NSString *)characterForMidiNote:(int)midiNote +{ + int keyCode = [self keyCodeForMidiNote:midiNote]; + + // Get current key layout selected in Keyboard menu. + KeyboardLayoutRef layout; +// TISInputSourceRef inputSource; + OSStatus status; +// inputSource = TISCopyCurrentKeyboardInputSource(); + + status = KLGetCurrentKeyboardLayout(&layout); + if (status) + { + return nil; + } + + // Get the type of available layout data. + KeyboardLayoutKind layoutKind; + status = KLGetKeyboardLayoutProperty(layout, kKLKind, (const void **)&layoutKind); + if (status) + { + return nil; + } + + UInt32 deadKeyState = 0; + switch (layoutKind) + { + // Use the Unicode layout if available. + case kKLKCHRuchrKind: + case kKLuchrKind: + { + // Get the Unicode 'uchr' key layout data. + UCKeyboardLayout * uchrData; + status = KLGetKeyboardLayoutProperty(layout, kKLuchrData, (const void **)&uchrData); + if (status) + { + return nil; + } + + // Get Unicode characters for this keycode. + UniChar keyChars[16]; + UniCharCount keyCharsCount; + status = UCKeyTranslate(uchrData, keyCode, kUCKeyActionDisplay, 0, LMGetKbdType(), kUCKeyTranslateNoDeadKeysMask, &deadKeyState, sizeof(keyChars), &keyCharsCount, keyChars); + if (status) + { + return nil; + } + + // Return NSString with the Unicode characters. + return [NSString stringWithCharacters:(const unichar *)&keyChars length:keyCharsCount]; + } + + // Otherwise fall back to the old format. + case kKLKCHRKind: + { + // Get the 'KCHR' resource data. + void * kchrData; + status = KLGetKeyboardLayoutProperty(layout, kKLKCHRData, (const void **)&kchrData); + if (status) + { + return nil; + } + + // Put a 1 in bit 7 of the keycode param to indicate a down stroke. + UInt32 resultChars = KeyTranslate(kchrData, (keyCode & 0x3f) | (1 << 7), &deadKeyState); + if (status) + { + return nil; + } + + // Return the key char as a string. + char keyCharString[2] = {0}; + keyCharString[0] = resultChars & 0xff; + return [NSString stringWithUTF8String:keyCharString]; + } + } + + return nil; +} + +- (void)registerHotKeysWithModifiers:(int)modifiers; +{ + // must have a modifier set to install hotkeys + if (modifiers == 0) + { + return; + } + + OSStatus err; + EventHotKeyID hotKeyID = { 0, 0 }; + EventHotKeyRef hotKeyRef; + + [mRegisteredHotKeys release]; + mRegisteredHotKeys = [[NSMutableDictionary dictionary] retain]; + + id range; + for (range in mRanges) + { + @try + { + NSArray *rangeKeys = [range objectForKey:@"KeyCodes"]; + int rangeStartNote = [[range objectForKey:@"FirstMidiNote"] intValue]; + int numKeyCodes = [rangeKeys count]; + int i; + for (i=0; i < numKeyCodes; ++i) + { + id thisKey = [rangeKeys objectAtIndex:i]; + int midiNote = rangeStartNote + i; + err = RegisterEventHotKey([thisKey intValue], modifiers, hotKeyID, GetApplicationEventTarget(), 0, &hotKeyRef); + if (err) + { + NSLog(@"error %ld installing hotkey (keycode = %ld)", err, [thisKey intValue]); + continue; + } + mHotKeysAreRegistered = YES; + + // save the hotKeyRef as the key in a dictionary, with its keycode as the value + [mRegisteredHotKeys setObject:[NSNumber numberWithInt:midiNote] forKey:[NSValue valueWithPointer:hotKeyRef]]; + } + } + @catch (NSException * e) + { + // a key was missing from the range dictionary (or something) + NSLog(@"invalid range definition"); + // move on to the next range + // XXX remove the offending range from the key map + } + } +} + +- (void)unregisterHotKeys +{ + if (!mHotKeysAreRegistered || [mRegisteredHotKeys count]==0) + { + return; + } + + id iterator; + for (iterator in mRegisteredHotKeys) + { + EventHotKeyRef hotKeyRef = (EventHotKeyRef)[iterator pointerValue]; + OSStatus err = UnregisterEventHotKey(hotKeyRef); + if (err) + { + NSLog(@"err %ld unregistering hot key %p", err, hotKeyRef); + } + } + + // clear hot keys dictionary + [mRegisteredHotKeys removeAllObjects]; + + mHotKeysAreRegistered = NO; +} + +@end + diff --git a/MidiKeyView.h b/MidiKeyView.h new file mode 100644 index 0000000..25d3277 --- /dev/null +++ b/MidiKeyView.h @@ -0,0 +1,76 @@ +// +// MidiKeyView.h +// MidiKeys +// +// Created by Chris Reed on Tue Oct 15 2002. +// Copyright (c) 2002 Chris Reed. All rights reserved. +// + +#import + +//! Maximum number of keys to show. +#define KEY_COUNT 120 + +/*! + * @brief Information about a key on a musical keyboard. + */ +typedef struct _key_info { + int theOctave; + int octaveFirstNote; + int noteInOctave; + int isWhiteKey; + int isBlackKey; + int numWhiteKeys; + int numBlackKeys; + BOOL rightIsInset; + BOOL leftIsInset; +} key_info_t; + +/*! + * @brief View class that displays a musical keyboard. + */ +@interface MidiKeyView : NSView +{ + id mDelegate; + NSImage *octaveImage; + char midiKeyStates[KEY_COUNT]; + BOOL inited; + int numOctaves; + int leftOctaves; + int firstMidiNote; + int lastMidiNote; + NSColor *mHighlightColour; + int mClickedNote; + NSImage *mOctaveDownImage; + NSImage *mOctaveUpImage; + int mOctaveOffset; + BOOL _showKeycaps; +} + +- (void)setDelegate:(id)delegate; +- delegate; + +- (void)turnMidiNoteOn:(int)note; +- (void)turnMidiNoteOff:(int)note; + +- (NSColor *)highlightColour; +- (void)setHighlightColour:(NSColor *)theColour; + +- (int)octaveOffset; +- (void)setOctaveOffset:(int)offset; + +- (BOOL)showKeycaps; +- (void)setShowKeycaps:(BOOL)show; + +@end + +@interface NSObject (MidiKeyViewControllerMethods) + +- (void)processMidiKeyWithCode:(int)keycode turningOn:(BOOL)isTurningOn; +- (void)processMidiKeyClickWithNote:(int)note turningOn:(BOOL)isTurningOn; + +- (NSString *)characterForMidiNote:(int)note; + +@end + + diff --git a/MidiKeyView.m b/MidiKeyView.m new file mode 100644 index 0000000..7a8b286 --- /dev/null +++ b/MidiKeyView.m @@ -0,0 +1,550 @@ +// +// MidiKeyView.m +// MidiKeys +// +// Created by Chris Reed on Tue Oct 15 2002. +// Copyright (c) 2002 Chris Reed. All rights reserved. +// + +#import "MidiKeyView.h" +#import "AppController.h" +#import "CTGradient.h" + +// image file name +#define kOctaveImageFile @"Octave.png" +#define kOctaveDownImageFile @"OctaveDown.png" +#define kOctaveUpImageFile @"OctaveUp.png" + +// key sizes +#define kWhiteKeyWidth 12.0 +#define kBlackKeyInset 4.0 +#define kBlackKeyWidth 6.0 +#define kBlackKeyHeight 32.0 + +@interface MidiKeyView (PrivateMethods) + +- (key_info_t)getKeyInfoForMidiNote:(int)note; +- (void)computeKeyValues; +- (NSBezierPath *)bezierPathForMidiNote:(int)note; +- (void)highlightMidiKey:(int)note; +- (int)midiNoteForMouse:(NSPoint)location; +- (void)drawOctaveOffsetIndicator; + +@end + +@implementation MidiKeyView + +- (id)initWithFrame:(NSRect)frame +{ + self = [super initWithFrame:frame]; + if (self) + { + octaveImage = [[NSImage imageNamed:kOctaveImageFile] retain]; + mOctaveUpImage = [[NSImage imageNamed:kOctaveUpImageFile] retain]; + mOctaveDownImage = [[NSImage imageNamed:kOctaveDownImageFile] retain]; + mHighlightColour = [NSColor greenColor]; + } + return self; +} + +- (void)dealloc +{ + if (mClickedNote != -1) + { + // i don't know if this can happen, but no reason to take the chance + [mDelegate processMidiKeyClickWithNote:mClickedNote turningOn:NO]; + } + [mHighlightColour release]; + [octaveImage release]; + [mOctaveDownImage release]; + [mOctaveUpImage release]; + [super dealloc]; +} + +- (void)setDelegate:(id)delegate +{ + mDelegate = delegate; +} + +- delegate +{ + return mDelegate; +} + +- (void)computeKeyValues +{ + NSSize octaveSize = [octaveImage size]; + NSRect bounds = [self frame]; + numOctaves = (int)(bounds.size.width / (octaveSize.width - 1)); + +// NSLog(@"numOctaves = %d", numOctaves); + + // put middle c=60 in approx. center octave + leftOctaves = numOctaves/2; + firstMidiNote = 60 - (leftOctaves * 12); + +// NSLog(@"firstMidiNote = %d", firstMidiNote); + + // XXX really compute lastMidiNote + lastMidiNote = KEY_COUNT; //firstMidiNote + int(bounds.size.width / kWhiteKeyWidth); +} + +- (key_info_t)getKeyInfoForMidiNote:(int)note +{ + key_info_t info; + int theNote = note; + int theOctave = (theNote - firstMidiNote) / 12; + int octaveFirstNote = firstMidiNote + theOctave * 12; + int noteInOctave = theNote - octaveFirstNote; + int numWhiteKeys = 0; + int numBlackKeys = 0; + int isWhiteKey = 0; + int isBlackKey = 0; + BOOL leftIsInset = NO; + BOOL rightIsInset = NO; // black key insets on white keys + + switch (noteInOctave) + { + case 0: // C + isWhiteKey = 1; + rightIsInset = YES; + break; + case 1: // C# + isBlackKey = 1; + numWhiteKeys = 1; + break; + case 2: // D + isWhiteKey = 1; + numWhiteKeys = 1; + numBlackKeys = 1; + rightIsInset = YES; + leftIsInset = YES; + break; + case 3: // D# + isBlackKey = 1; + numWhiteKeys = 2; + numBlackKeys = 1; + break; + case 4: // E + isWhiteKey = 1; + numWhiteKeys = 2; + numBlackKeys = 2; + leftIsInset = YES; + break; + case 5: // F + isWhiteKey = 1; + numWhiteKeys = 3; + numBlackKeys = 2; + rightIsInset = YES; + break; + case 6: // F# + isBlackKey = 1; + numWhiteKeys = 4; + numBlackKeys = 2; + break; + case 7: // G + isWhiteKey = 1; + numWhiteKeys = 4; + numBlackKeys = 3; + rightIsInset = YES; + leftIsInset = YES; + break; + case 8: // G# + isBlackKey = 1; + numWhiteKeys = 5; + numBlackKeys = 3; + break; + case 9: // A + isWhiteKey = 1; + numWhiteKeys = 5; + numBlackKeys = 4; + rightIsInset = YES; + leftIsInset = YES; + break; + case 10: // A# + isBlackKey = 1; + numWhiteKeys = 6; + numBlackKeys = 4; + break; + case 11: // B + isWhiteKey = 1; + numWhiteKeys = 6; + numBlackKeys = 5; + leftIsInset = YES; + break; + default: + NSLog(@"bad note to key mapping!!! note=%d", note); + } + + info.theOctave = theOctave; + info.octaveFirstNote = octaveFirstNote; + info.noteInOctave = noteInOctave; + info.isWhiteKey = isWhiteKey; + info.isBlackKey = isBlackKey; + info.numWhiteKeys = numWhiteKeys; + info.numBlackKeys = numBlackKeys; + info.rightIsInset = rightIsInset; + info.leftIsInset = leftIsInset; + + return info; +} + +- (NSBezierPath *)bezierPathForMidiNote:(int)note +{ + NSSize octaveSize = [octaveImage size]; + + // invert middle c + int theNote = note; + key_info_t info = [self getKeyInfoForMidiNote:theNote]; + + int theOctave = info.theOctave; + float octaveLeft = theOctave * (octaveSize.width - 1); + int numWhiteKeys = info.numWhiteKeys; + int isBlackKey = info.isBlackKey; + BOOL leftIsInset = info.leftIsInset; + BOOL rightIsInset = info.rightIsInset; // black key insets on white keys + + NSRect keyRect; + + if (isBlackKey) + { + keyRect.origin.x = octaveLeft + numWhiteKeys * kWhiteKeyWidth - kBlackKeyInset; + keyRect.origin.y = octaveSize.height - kBlackKeyHeight; + keyRect.size.width = kBlackKeyWidth + 1.0; + keyRect.size.height = kBlackKeyHeight - 1; + + return [NSBezierPath bezierPathWithRect:keyRect]; + } + + // white key + float x, y, w, h; + x = octaveLeft + numWhiteKeys * kWhiteKeyWidth - 1.0; + y = 0.; + w = kWhiteKeyWidth + 1.0; + h = octaveSize.height - kBlackKeyHeight; + + NSBezierPath *keyPath = [NSBezierPath bezierPath]; + [keyPath moveToPoint:NSMakePoint(x+0.5, y+h-0.5)]; + [keyPath lineToPoint:NSMakePoint(x+0.5, y)]; + [keyPath lineToPoint:NSMakePoint(x+w, y)]; + [keyPath lineToPoint:NSMakePoint(x+w, y+h)]; + if (rightIsInset) + { + [keyPath lineToPoint:NSMakePoint(x+w - kBlackKeyInset + 1, y+h)]; + } + + // start with white key part below the black keys + y = octaveSize.height - kBlackKeyHeight - 1; + h = kBlackKeyHeight; + if (!rightIsInset && leftIsInset) + { + x += kBlackKeyInset - 1; + w -= kBlackKeyInset - 1; + } + else if (rightIsInset && !leftIsInset) + { + w -= kBlackKeyInset - 1; + } + else if (rightIsInset && leftIsInset) + { + x += kBlackKeyInset - 1; + w -= (kBlackKeyInset - 1) * 2; + } + [keyPath lineToPoint:NSMakePoint(x+w, y+h)]; + [keyPath lineToPoint:NSMakePoint(x+0.5, y+h)]; + [keyPath lineToPoint:NSMakePoint(x+0.5, y+0.5)]; + [keyPath closePath]; + + return keyPath; +} + +- (void)highlightMidiKey:(int)note +{ + NSBezierPath *keyPath = [self bezierPathForMidiNote:note]; + NSColor * darkerHighlightColor = [NSColor colorWithCalibratedHue:[mHighlightColour hueComponent] saturation:[mHighlightColour saturationComponent]/2.0f brightness:[mHighlightColour brightnessComponent] alpha:[mHighlightColour alphaComponent]]; + NSColor * lighterHighlightColor = [NSColor colorWithCalibratedHue:[mHighlightColour hueComponent] saturation:[mHighlightColour saturationComponent] brightness:[mHighlightColour brightnessComponent] alpha:[mHighlightColour alphaComponent]]; + + // Draw the highlight + [NSGraphicsContext saveGraphicsState]; + + [keyPath setClip]; + + CTGradient * gradient = [CTGradient gradientWithBeginningColor:darkerHighlightColor endingColor:lighterHighlightColor]; + [gradient fillRect:[keyPath bounds] angle:330.0f]; + + [NSGraphicsContext restoreGraphicsState]; + +// [mHighlightColour set]; +// [keyPath fill]; + + // Draw frame around the highlighted key + [NSGraphicsContext saveGraphicsState]; + + [[NSColor colorWithCalibratedHue:[mHighlightColour hueComponent] saturation:[mHighlightColour saturationComponent] brightness:[mHighlightColour brightnessComponent]/3. alpha:[mHighlightColour alphaComponent]] set]; + [keyPath stroke]; + + [NSGraphicsContext restoreGraphicsState]; +} + +// composite the up or down images into the view +- (void)drawOctaveOffsetIndicator +{ + if (mOctaveOffset == 0) + return; + + NSRect bounds = [self bounds]; + NSPoint drawPoint; + NSSize imageSize; + NSImage *image; + + if (mOctaveOffset > 0) + { + // octave up + image = mOctaveUpImage; + imageSize = [image size]; + drawPoint = NSMakePoint(NSMaxX(bounds) - imageSize.width - 5.0, (NSHeight(bounds) - imageSize.height) / 2.0); + } + else + { + // octave down + image = mOctaveDownImage; + imageSize = [image size]; + drawPoint = NSMakePoint(5.0, (NSHeight(bounds) - imageSize.height) / 2.0); + } + + float indicatorCompositeFraction = [[NSUserDefaults standardUserDefaults] floatForKey:@"OctaveOffsetIndicatorCompositeFraction"]; + if (indicatorCompositeFraction == 0.0) + { + [[NSUserDefaults standardUserDefaults] setFloat:0.25 forKey:@"OctaveOffsetIndicatorCompositeFraction"]; + indicatorCompositeFraction = 0.25; + } + + [image compositeToPoint:drawPoint operation:NSCompositeSourceOver fraction:indicatorCompositeFraction]; + + if (abs(mOctaveOffset) > 1) + { + int offsets = abs(mOctaveOffset) - 1; + while (offsets--) + { + if (mOctaveOffset > 0) + drawPoint.x -= imageSize.width * 0.5; + else + drawPoint.x += imageSize.width * 0.5; + [image compositeToPoint:drawPoint operation:NSCompositeSourceOver fraction:indicatorCompositeFraction]; + } + } +} + +// This is really quite inefficient, but it works out, and draws flicker-free +// thanks to the WindowServer's double buffering. +- (void)drawRect:(NSRect)rect +{ + if (!inited) + { + [self computeKeyValues]; + inited = YES; + } + + NSRect bounds = [self frame]; + NSDrawWhiteBezel(bounds, rect); + + // draw the keyboard an octave at a time + NSSize octaveSize = [octaveImage size]; + float frameWidth = bounds.size.width; + NSPoint drawPoint; + drawPoint.x = -1.; + drawPoint.y = 0.; + + do { + [octaveImage compositeToPoint:drawPoint operation:NSCompositeCopy]; + drawPoint.x += octaveSize.width - 1.; + } while (drawPoint.x < frameWidth); + + BOOL drawKeyCaps = _showKeycaps && mDelegate && [mDelegate respondsToSelector:@selector(characterForMidiNote:)]; + + // draw each key that is currently pressed + int i; + for (i = firstMidiNote; i < lastMidiNote; ++i) + { + // draw only if the key is on + if (midiKeyStates[i]) + { + [self highlightMidiKey:i]; + } + + // Draw the key cap for this key. + if (drawKeyCaps) + { + int offsetNote = i + mOctaveOffset * 12; + if (offsetNote >= firstMidiNote && offsetNote < lastMidiNote) + { + key_info_t info = [self getKeyInfoForMidiNote:offsetNote]; + NSRect pathBounds = [[self bezierPathForMidiNote:offsetNote] bounds]; + NSMutableDictionary * attributes = [NSMutableDictionary dictionaryWithObjectsAndKeys:[NSFont labelFontOfSize:9.0f], NSFontAttributeName, nil]; + if (info.isWhiteKey) + { + drawPoint.y = pathBounds.origin.y + 3.0f; + drawPoint.x = pathBounds.origin.x + 4.0f; + } + else + { + drawPoint.x = pathBounds.origin.x + 1.0f; + drawPoint.y = pathBounds.origin.y + 3.0f; + [attributes setValue:[NSColor whiteColor] forKey:NSForegroundColorAttributeName]; + } + + NSString * c = [mDelegate characterForMidiNote:i]; + [c drawAtPoint:drawPoint withAttributes:attributes]; + } + } + } + + [self drawOctaveOffsetIndicator]; +} + +// recompute key values +- (void)resizeWithOldSuperviewSize:(NSSize)oldBoundsSize +{ + [self computeKeyValues]; + inited = YES; + + [super resizeWithOldSuperviewSize:oldBoundsSize]; +} + +- (BOOL)acceptsFirstResponder +{ + return YES; +} + +- (BOOL)mouseDownCanMoveWindow +{ + return NO; +} + +//! Just tests if the point is within every key which is inefficient. +//! +//! @retval -1 on failure +- (int)midiNoteForMouse:(NSPoint)location +{ + int note; + for (note = firstMidiNote; note < lastMidiNote; ++note) + { + NSBezierPath *keyPath = [self bezierPathForMidiNote:note]; + if ([keyPath containsPoint:location]) + { + return note; + } + } + + return -1; +} + +// find the note of the clicked key, send note on, and save the note +- (void)mouseDown:(NSEvent *)theEvent +{ + mClickedNote = [self midiNoteForMouse:[self convertPoint:[theEvent locationInWindow] fromView:nil]]; + if (mClickedNote != -1) + [mDelegate processMidiKeyClickWithNote:mClickedNote turningOn:YES]; +} + +// get the key the mouse is currently over. if it's changed, send a note off +// for the old one, note on for the new one, save it and continue +- (void)mouseDragged:(NSEvent *)theEvent +{ + int currentNote = [self midiNoteForMouse:[self convertPoint:[theEvent locationInWindow] fromView:nil]]; + if (currentNote != mClickedNote) + { + if (mClickedNote != -1) + [mDelegate processMidiKeyClickWithNote:mClickedNote turningOn:NO]; + if (currentNote != -1) + [mDelegate processMidiKeyClickWithNote:currentNote turningOn:YES]; + mClickedNote = currentNote; + } +} + +- (void)mouseUp:(NSEvent *)theEvent +{ + if (mClickedNote != -1) + { + [mDelegate processMidiKeyClickWithNote:mClickedNote turningOn:NO]; + mClickedNote = -1; + } +} + +// let the mDelegate object handle all the midi logic +- (void)keyDown:(NSEvent *)theEvent +{ +// NSLog(@"keyDown: %@; keycode = %d; timestamp = %g", [theEvent charactersIgnoringModifiers], [theEvent keyCode], (float)[theEvent timestamp]); + // ignore keydowns generated by auto-key + if ([theEvent isARepeat]) + return; + [mDelegate processMidiKeyWithCode:[theEvent keyCode] turningOn:YES]; +} + +// send note offs +- (void)keyUp:(NSEvent *)theEvent +{ + [mDelegate processMidiKeyWithCode:[theEvent keyCode] turningOn:NO]; +} + +// we use counting for these methods instead of setting the states +// to boolean values because it is easily conceivable that multiple input +// sources would hit the same notes +- (void)turnMidiNoteOn:(int)note +{ + if (note < 0 || note > KEY_COUNT-1) + return; + if (midiKeyStates[note] < 127) + midiKeyStates[note]++; + [self setNeedsDisplay:YES]; +} + +- (void)turnMidiNoteOff:(int)note +{ + if (note < 0 || note > KEY_COUNT-1) + return; + if (midiKeyStates[note] > 0) + midiKeyStates[note]--; + [self setNeedsDisplay:YES]; +} + +- (NSColor *)highlightColour +{ + return mHighlightColour; +} + +- (void)setHighlightColour:(NSColor *)theColour +{ + if (theColour) + { + [mHighlightColour release]; + mHighlightColour = [theColour retain]; + } +} + +- (int)octaveOffset +{ + return mOctaveOffset; +} + +- (void)setOctaveOffset:(int)offset +{ + mOctaveOffset = offset; + [self setNeedsDisplay:YES]; +} + +- (BOOL)showKeycaps +{ + return _showKeycaps; +} + +- (void)setShowKeycaps:(BOOL)show +{ + if (show != _showKeycaps) + { + _showKeycaps = show; + [self setNeedsDisplay:YES]; + } +} + +@end diff --git a/MidiKeys-Info.plist b/MidiKeys-Info.plist new file mode 100644 index 0000000..4df73b1 --- /dev/null +++ b/MidiKeys-Info.plist @@ -0,0 +1,42 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + MidiKeys + CFBundleGetInfoString + 1.8, Copyright © 2002-2010 Immo Software. + CFBundleHelpBookName + ReadMe.rtf + CFBundleIconFile + MidiKeys.icns + CFBundleIdentifier + com.immosw.MidiKeys + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + MidiKeys + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.8 + CFBundleSignature + MKéY + CFBundleVersion + 1.8 + LSApplicationCategoryType + public.app-category.music + LSMinimumSystemVersion + 10.5.0 + NSMainNibFile + MainMenu + NSPrincipalClass + MidiKeysApplication + SUFeedURL + http://immosw.com/versions/midikeys/appcast.xml + SUPublicDSAKeyFile + dsa_pub.pem + + diff --git a/MidiKeys.icns b/MidiKeys.icns new file mode 100644 index 0000000000000000000000000000000000000000..3dcb2e08b7538aedbad98896a06775786255310c GIT binary patch literal 45925 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

5Bj# zI!9%Iy;mpzK8zGxXJ~R}tfP)Riv|Z2U&!~cWwp#*hR!QP%tI==_QRvV-5CKS{qnEz z9;lw7jfX$rJN>0nnac~(tFn(OWpA|qgU~80}jsiS7 z`T1}UlcPGo+I0lLJ3BH|Roo?ENjDCVNcG z1`V>bvKjgfkUbUh8m8ne@E`mnB>WxQV{S=U(`;<)Hm*aEV}5rRrnCNz?y6BRWIYe~ z9`;>O9O&W~F}ma*=^k4L0E7TyvM2+(M`jmKUd;|9G(O;7*lM8H*bfvw5rm>x;e|SuM=|7@9k&tf)@bwu6R0Qxd{ggQN zfcD6pOX4WOr*RAoiinK|c;^4WJ*@X|50Rh>NKI@sz&-fWS-jlrEsS(jWI0Iy_sCXN zx^YzXEnK_h53(pYSfval>?v?9Ivg@*0Mg z@Tn)EQ5eH1OH@uE`JNFW{@xyrl1ud`1K%TmJY88q1DGBBaVpWH;^TPhFyU2C{;qoPPW)q$g8UfxR$>&r=y5JR&LvJ^_uFFegz1Q#Tj3z@TwBK4sT$Afu|o1x_3}jH;Mg zV$=tJv>k@6hItS50@Mdw9dh)lia?1t6-Zd0gERb9G3C`y*TC4!!jf;r1-Q@D*g!{9 zO<57jRrQ~75Lh3X+dHO)ngFiBRaRBwt1~b{qbSGY&`m<8zN3BiEuNC#?`Vuc3`I?2 zNB@K=i}y)rpNURca5^`b4gaU+|94+(^N{Sat*36)Hg>#y+tFBi>(th=>=5(+#1`Y| zIfoyLKl=6X@SJGl|7By!`4yiMd{p}PHwCAP{p9{9bzlXQfA_o0-@f>+Jb=~PRTwm> z`foM=^uy{&gL<Qs(eqj@&-}(E3Kli71 z(!Znv0~YsuuE0NC*Ry!QzpjDz;eRUi-~9Zr_rI(_{Ox~J{6AlN8=jT^7hmxFO)r1F z%=>(KCehW)>QG!4!Tih`a7ue$9hX?j`K$_X;1l@&H(&EVrvl9Xk@eW5($DAu;(uei zq*US`dm!(B;Cg>p)b&rJAimcJ-XG%l)yuz+1KzzHcK)w8{_ghQMZy8S8g&0Ej^8=_ zH*>+_kKfX}?=JqN52p9pjQ4jn?)lVo?AlB7{oje>pWXTRf`rv8tDS!m$3Nfr(Ir{> z=iJ&m*LCe^vPVcb@-cW3u}1Z|Lox zuKttx{$ISw`m&m}{%LQx?#qh#^1I+O<3IQs`b9h3FIN|f1^;JzzT|6)`m%eMd|>{d ze|^00Wttz}Rr|pS$)pc|@L#>2^m_xas{bp^4|S@4p9KOweEYw99q_&Z%Ktmf50%Q_ z>C1iQx!#BO_Qvb)-W^o>^+sV|Qih+T0gAum-rl$ekUIQzsyE8|k}^(_^2Yyp?0sKX zfibQ?^!soB`+uXc{+$0__r2mAtp6YEdEV>&`QO7J&wlvlcmKQZA41B;{J)d?tCBfF zA%A`Mzk4SHq3r)o?XODN2$lWy-T&^LGK9ANcWQrC0xG!AqA#uuMBrP0t<`_`&Mk!c zVCngXeYFTR{_)*^|EdxGuhIWr^$*1kgy6pp?7OeGeXrlw?cdk_*Vp5(uj5Z&$KSr5 zfBJg+inafAsnOtFQN;eZBwgyA`nH`~mg#`Ac7)KlSzb8|vfp zN7UEnuYG;~jQaTe9rbno0rheI1@(3Q3H5RQ4fS>Y5%qEY74>!g8I}H*rvQJ=zoWk9 z4^aAl*8m^mFHm3eC#aA48-)6pKY~wa_%B@G)BF|cYyJ%NF@J|pAM=L@^)Y{mP#^QB zsIU23)W`fWLVe6%Bh<(IIV5HKmcNGz^zrit2=(#v7YOz7^C!>;ef#_kRG^QaKSHRF zpTB}8=-cPdpaQ6GpTEO3=-cNHaSi(R`Ab}bzJ2}_*Pw5ozr{5`efs<{Sp$Un^7-p` QRX~0D{Q3Jj^wz)s4@bq);Q#;t literal 0 HcmV?d00001 diff --git a/MidiKeys.xcodeproj/creed.mode1 b/MidiKeys.xcodeproj/creed.mode1 new file mode 100644 index 0000000..8aa708f --- /dev/null +++ b/MidiKeys.xcodeproj/creed.mode1 @@ -0,0 +1,1476 @@ + + + + + ActivePerspectiveName + Project + AllowedModules + + + BundleLoadPath + + MaxInstances + n + Module + PBXSmartGroupTreeModule + Name + Groups and Files Outline View + + + BundleLoadPath + + MaxInstances + n + Module + PBXNavigatorGroup + Name + Editor + + + BundleLoadPath + + MaxInstances + n + Module + XCTaskListModule + Name + Task List + + + BundleLoadPath + + MaxInstances + n + Module + XCDetailModule + Name + File and Smart Group Detail Viewer + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXBuildResultsModule + Name + Detailed Build Results Viewer + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXProjectFindModule + Name + Project Batch Find Tool + + + BundleLoadPath + + MaxInstances + n + Module + PBXRunSessionModule + Name + Run Log + + + BundleLoadPath + + MaxInstances + n + Module + PBXBookmarksModule + Name + Bookmarks Tool + + + BundleLoadPath + + MaxInstances + n + Module + PBXClassBrowserModule + Name + Class Browser + + + BundleLoadPath + + MaxInstances + n + Module + PBXCVSModule + Name + Source Code Control Tool + + + BundleLoadPath + + MaxInstances + n + Module + PBXDebugBreakpointsModule + Name + Debug Breakpoints Tool + + + BundleLoadPath + + MaxInstances + n + Module + XCDockableInspector + Name + Inspector + + + BundleLoadPath + + MaxInstances + n + Module + PBXOpenQuicklyModule + Name + Open Quickly Tool + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXDebugSessionModule + Name + Debugger + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXDebugCLIModule + Name + Debug Console + + + Description + DefaultDescriptionKey + DockingSystemVisible + + Extension + mode1 + FavBarConfig + + PBXProjectModuleGUID + 0246B6DE09C35A49009A0CA3 + XCBarModuleItemNames + + F508BCFA036B5A4801EFE74C + PreferencesController.m + F546EC7E035D0D950199E6AF + MidiKeyView.m + F5F8BC1103909790013BC55C + AppController.m + + XCBarModuleItems + + F5F8BC1103909790013BC55C + F546EC7E035D0D950199E6AF + F508BCFA036B5A4801EFE74C + + + FirstTimeWindowDisplayed + + Identifier + com.apple.perspectives.project.mode1 + MajorVersion + 31 + MinorVersion + 1 + Name + Default + Notifications + + + XCObserverAutoDisconnectKey + + XCObserverDefintionKey + + XCObserverFactoryKey + XCPerspectivesSpecificationIdentifier + XCObserverGUIDKey + XCObserverProjectIdentifier + XCObserverNotificationKey + PBXStatusBuildStateMessageNotification + XCObserverTargetKey + XCMainBuildResultsModuleGUID + XCObserverTriggerKey + awakenModuleWithObserver: + XCObserverValidationKey + + + + OpenEditors + + PerspectiveWidths + + 1004 + 300 + + Perspectives + + + ChosenToolbarItems + + active-target-popup + active-buildstyle-popup + action + NSToolbarFlexibleSpaceItem + buildOrClean + build-and-runOrDebug + com.apple.ide.PBXToolbarStopButton + show-inspector + get-info + toggle-editor + NSToolbarFlexibleSpaceItem + com.apple.pbx.toolbar.searchfield + + ControllerClassBaseName + + IconName + WindowOfProjectWithEditor + Identifier + perspective.project + IsVertical + + Layout + + + ContentConfiguration + + PBXBottomSmartGroupGIDs + + 1C37FBAC04509CD000000102 + 1C37FAAC04509CD000000102 + 1C08E77C0454961000C914BD + 1C37FABC05509CD000000102 + 1C37FABC05539CD112110102 + E2644B35053B69B200211256 + 1C37FABC04509CD000100104 + 1CC0EA4004350EF90044410B + 1CC0EA4004350EF90041110B + + PBXProjectModuleGUID + 1CE0B1FE06471DED0097A5F4 + PBXProjectModuleLabel + Files + PBXProjectStructureProvided + yes + PBXSmartGroupTreeModuleColumnData + + PBXSmartGroupTreeModuleColumnWidthsKey + + 22 + 22 + 200 + + PBXSmartGroupTreeModuleColumnsKey_v4 + + TargetStatusColumn + SCMStatusColumn + MainColumn + + + PBXSmartGroupTreeModuleOutlineStateKey_v7 + + PBXSmartGroupTreeModuleOutlineStateExpansionKey + + 29B97314FDCFA39411CA2CEA + 080E96DDFE201D6D7F000001 + 29B97315FDCFA39411CA2CEA + 29B97317FDCFA39411CA2CEA + 1C37FBAC04509CD000000102 + 1C37FABC05509CD000000102 + + PBXSmartGroupTreeModuleOutlineStateSelectionKey + + + 27 + 1 + 0 + + + PBXSmartGroupTreeModuleOutlineStateVisibleRectKey + {{0, 0}, {244, 765}} + + PBXTopSmartGroupGIDs + + XCIncludePerspectivesSwitch + + XCSharingToken + com.apple.Xcode.GFSharingToken + + GeometryConfiguration + + Frame + {{0, 0}, {261, 783}} + GroupTreeTableConfiguration + + TargetStatusColumn + 22 + SCMStatusColumn + 22 + MainColumn + 200 + + RubberWindowFrame + 41 33 1004 845 0 0 1440 878 + + Module + PBXSmartGroupTreeModule + Proportion + 261pt + + + Dock + + + BecomeActive + + ContentConfiguration + + PBXProjectModuleGUID + 1CE0B20306471E060097A5F4 + PBXProjectModuleLabel + AppController.m + PBXSplitModuleInNavigatorKey + + Split0 + + PBXProjectModuleGUID + 1CE0B20406471E060097A5F4 + PBXProjectModuleLabel + AppController.m + _historyCapacity + 0 + bookmark + 02E5363E0C3C4FE600CBD4A5 + history + + 028E8E970BE56775004B2132 + 028E8E980BE56775004B2132 + 028E8E990BE56775004B2132 + 02FE63CB0BEEC7A3004A1450 + 02FE63CD0BEEC7A3004A1450 + 02FE63CE0BEEC7A3004A1450 + 02E533F30C13492800CBD4A5 + 02E533F40C13492800CBD4A5 + 02E5345A0C13513800CBD4A5 + 02E5345B0C13513800CBD4A5 + 02E534680C13570400CBD4A5 + 02E534690C13570400CBD4A5 + 02E534AA0C1B30FC00CBD4A5 + 02E534AB0C1B30FC00CBD4A5 + 02E5363D0C3C4FE600CBD4A5 + + prevStack + + 028E8EA00BE56775004B2132 + 028E8EA10BE56775004B2132 + 028E8EA20BE56775004B2132 + 02FE63D40BEEC7A3004A1450 + 02FE63D60BEEC7A3004A1450 + 02FE63D70BEEC7A3004A1450 + 02E533F70C13492800CBD4A5 + 02E533F80C13492800CBD4A5 + 02E533F90C13492800CBD4A5 + 02E533FA0C13492800CBD4A5 + 02E533FB0C13492800CBD4A5 + 02E534410C134D6600CBD4A5 + 02E534420C134D6600CBD4A5 + 02E5346B0C13570400CBD4A5 + 02E5346C0C13570400CBD4A5 + 02E534AC0C1B30FC00CBD4A5 + + + SplitCount + 1 + + StatusBarVisibility + + + GeometryConfiguration + + Frame + {{0, 0}, {738, 778}} + RubberWindowFrame + 41 33 1004 845 0 0 1440 878 + + Module + PBXNavigatorGroup + Proportion + 778pt + + + ContentConfiguration + + PBXProjectModuleGUID + 1CE0B20506471E060097A5F4 + PBXProjectModuleLabel + Detail + + GeometryConfiguration + + Frame + {{0, 783}, {738, 0}} + RubberWindowFrame + 41 33 1004 845 0 0 1440 878 + + Module + XCDetailModule + Proportion + 0pt + + + Proportion + 738pt + + + Name + Project + ServiceClasses + + XCModuleDock + PBXSmartGroupTreeModule + XCModuleDock + PBXNavigatorGroup + XCDetailModule + + TableOfContents + + 02E533D50C122A8400CBD4A5 + 1CE0B1FE06471DED0097A5F4 + 02E533D60C122A8400CBD4A5 + 1CE0B20306471E060097A5F4 + 1CE0B20506471E060097A5F4 + + ToolbarConfiguration + xcode.toolbar.config.default + + + ChosenToolbarItems + + XCToolbarPerspectiveControl + NSToolbarSeparatorItem + buildOrClean + build-and-runOrDebug + com.apple.ide.PBXToolbarStopButton + NSToolbarFlexibleSpaceItem + get-info + + ControllerClassBaseName + + IconName + WindowOfProject + Identifier + perspective.morph + IsVertical + + Layout + + + ContentConfiguration + + PBXBottomSmartGroupGIDs + + 1C37FBAC04509CD000000102 + 1C37FAAC04509CD000000102 + 1C08E77C0454961000C914BD + 1C37FABC05509CD000000102 + 1C37FABC05539CD112110102 + E2644B35053B69B200211256 + 1C37FABC04509CD000100104 + 1CC0EA4004350EF90044410B + 1CC0EA4004350EF90041110B + + PBXProjectModuleGUID + 11E0B1FE06471DED0097A5F4 + PBXProjectModuleLabel + Files + PBXProjectStructureProvided + yes + PBXSmartGroupTreeModuleColumnData + + PBXSmartGroupTreeModuleColumnWidthsKey + + 22 + 261 + + PBXSmartGroupTreeModuleColumnsKey_v4 + + SCMStatusColumn + MainColumn + + + PBXSmartGroupTreeModuleOutlineStateKey_v7 + + PBXSmartGroupTreeModuleOutlineStateExpansionKey + + 29B97314FDCFA39411CA2CEA + 080E96DDFE201D6D7F000001 + 29B97315FDCFA39411CA2CEA + 1C37FBAC04509CD000000102 + 1C37FABC05509CD000000102 + + PBXSmartGroupTreeModuleOutlineStateSelectionKey + + + 1 + 0 + + + PBXSmartGroupTreeModuleOutlineStateVisibleRectKey + {{0, 0}, {283, 759}} + + PBXTopSmartGroupGIDs + + XCIncludePerspectivesSwitch + + XCSharingToken + com.apple.Xcode.GFSharingToken + + GeometryConfiguration + + Frame + {{0, 0}, {300, 777}} + GroupTreeTableConfiguration + + SCMStatusColumn + 22 + MainColumn + 261 + + + Module + PBXSmartGroupTreeModule + Proportion + 300pt + + + Name + Morph + PreferredWidth + 300 + ServiceClasses + + XCModuleDock + PBXSmartGroupTreeModule + + TableOfContents + + 02E533D70C122A8400CBD4A5 + 11E0B1FE06471DED0097A5F4 + + ToolbarConfiguration + xcode.toolbar.config.default.short + + + PerspectivesBarVisible + + ShelfIsVisible + + SourceDescription + file at '/System/Library/PrivateFrameworks/DevToolsInterface.framework/Versions/A/Resources/XCPerspectivesSpecificationMode1.xcperspec' + StatusbarIsVisible + + TimeStamp + 205279207.28514799 + ToolbarDisplayMode + 2 + ToolbarIsVisible + + ToolbarSizeMode + 2 + Type + Perspectives + UpdateMessage + The Default Workspace in this version of Xcode now includes support to hide and show the detail view (what has been referred to as the "Metro-Morph" feature). You must discard your current Default Workspace settings and update to the latest Default Workspace in order to gain this feature. Do you wish to update to the latest Workspace defaults for project '%@'? + WindowJustification + 5 + WindowOrderList + + 1C530D57069F1CE1000CFCEE + 02E5344C0C134D6600CBD4A5 + 02E5344D0C134D6600CBD4A5 + 02FE63E70BEEC7AD004A1450 + 1CD10A99069EF8BA00B06720 + 02E5344A0C134D6600CBD4A5 + 1C0AD2B3069F1EA900FABCE6 + 02E530950C0A819800CBD4A5 + /Users/creed/projects/MidiKeys/MidiKeys.xcodeproj + + WindowString + 41 33 1004 845 0 0 1440 878 + WindowTools + + + FirstTimeWindowDisplayed + + Identifier + windowTool.build + IsVertical + + Layout + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1CD0528F0623707200166675 + PBXProjectModuleLabel + + StatusBarVisibility + + + GeometryConfiguration + + Frame + {{0, 0}, {510, 0}} + RubberWindowFrame + 835 43 510 208 0 0 1440 878 + + Module + PBXNavigatorGroup + Proportion + 0pt + + + BecomeActive + + ContentConfiguration + + PBXProjectModuleGUID + XCMainBuildResultsModuleGUID + PBXProjectModuleLabel + Build + XCBuildResultsTrigger_Collapse + 1022 + XCBuildResultsTrigger_Open + 1010 + + GeometryConfiguration + + Frame + {{0, 5}, {510, 162}} + RubberWindowFrame + 835 43 510 208 0 0 1440 878 + + Module + PBXBuildResultsModule + Proportion + 162pt + + + Proportion + 167pt + + + Name + Build Results + ServiceClasses + + PBXBuildResultsModule + + StatusbarIsVisible + + TableOfContents + + 02E530950C0A819800CBD4A5 + 02E530960C0A819800CBD4A5 + 1CD0528F0623707200166675 + XCMainBuildResultsModuleGUID + + ToolbarConfiguration + xcode.toolbar.config.build + WindowString + 835 43 510 208 0 0 1440 878 + WindowToolGUID + 02E530950C0A819800CBD4A5 + WindowToolIsVisible + + + + FirstTimeWindowDisplayed + + Identifier + windowTool.debugger + IsVertical + + Layout + + + Dock + + + ContentConfiguration + + Debugger + + HorizontalSplitView + + _collapsingFrameDimension + 0.0 + _indexOfCollapsedView + 0 + _percentageOfCollapsedView + 0.0 + isCollapsed + yes + sizes + + {{0, 0}, {400, 372}} + {{0, 372}, {400, 409}} + + + VerticalSplitView + + _collapsingFrameDimension + 0.0 + _indexOfCollapsedView + 0 + _percentageOfCollapsedView + 0.0 + isCollapsed + yes + sizes + + {{0, 0}, {400, 781}} + {{400, 0}, {731, 781}} + + + + LauncherConfigVersion + 8 + PBXProjectModuleGUID + 1C162984064C10D400B95A72 + PBXProjectModuleLabel + Debug - GLUTExamples (Underwater) + + GeometryConfiguration + + DebugConsoleDrawerSize + {100, 120} + DebugConsoleVisible + None + DebugConsoleWindowFrame + {{200, 200}, {500, 300}} + DebugSTDIOWindowFrame + {{200, 200}, {500, 300}} + Frame + {{0, 0}, {1131, 781}} + RubberWindowFrame + 28 56 1131 822 0 0 1440 878 + + Module + PBXDebugSessionModule + Proportion + 781pt + + + Proportion + 781pt + + + Name + Debugger + ServiceClasses + + PBXDebugSessionModule + + StatusbarIsVisible + + TableOfContents + + 1CD10A99069EF8BA00B06720 + 02E534440C134D6600CBD4A5 + 1C162984064C10D400B95A72 + 02E534450C134D6600CBD4A5 + 02E534460C134D6600CBD4A5 + 02E534470C134D6600CBD4A5 + 02E534480C134D6600CBD4A5 + 02E534490C134D6600CBD4A5 + 02E5344A0C134D6600CBD4A5 + + ToolbarConfiguration + xcode.toolbar.config.debug + WindowString + 28 56 1131 822 0 0 1440 878 + WindowToolGUID + 1CD10A99069EF8BA00B06720 + WindowToolIsVisible + + + + FirstTimeWindowDisplayed + + Identifier + windowTool.find + IsVertical + + Layout + + + Dock + + + Dock + + + BecomeActive + + ContentConfiguration + + PBXProjectModuleGUID + 1CDD528C0622207200134675 + PBXProjectModuleLabel + AppController.m + StatusBarVisibility + + + GeometryConfiguration + + Frame + {{0, 0}, {781, 212}} + RubberWindowFrame + 41 351 781 470 0 0 1440 878 + + Module + PBXNavigatorGroup + Proportion + 781pt + + + Proportion + 212pt + + + ContentConfiguration + + PBXProjectModuleGUID + 1CD0528E0623707200166675 + PBXProjectModuleLabel + Project Find + + GeometryConfiguration + + Frame + {{0, 217}, {781, 212}} + RubberWindowFrame + 41 351 781 470 0 0 1440 878 + + Module + PBXProjectFindModule + Proportion + 212pt + + + Proportion + 429pt + + + Name + Project Find + ServiceClasses + + PBXProjectFindModule + + StatusbarIsVisible + + TableOfContents + + 1C530D57069F1CE1000CFCEE + 02E534A80C1B30F400CBD4A5 + 02E534A90C1B30F400CBD4A5 + 1CDD528C0622207200134675 + 1CD0528E0623707200166675 + + WindowString + 41 351 781 470 0 0 1440 878 + WindowToolGUID + 1C530D57069F1CE1000CFCEE + WindowToolIsVisible + + + + Identifier + MENUSEPARATOR + + + FirstTimeWindowDisplayed + + Identifier + windowTool.debuggerConsole + IsVertical + + Layout + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1C78EAAC065D492600B07095 + PBXProjectModuleLabel + Debugger Console + + GeometryConfiguration + + Frame + {{0, 0}, {440, 358}} + RubberWindowFrame + 52 398 440 400 0 0 1440 878 + + Module + PBXDebugCLIModule + Proportion + 358pt + + + Proportion + 359pt + + + Name + Debugger Console + ServiceClasses + + PBXDebugCLIModule + + StatusbarIsVisible + + TableOfContents + + 02FE63E70BEEC7AD004A1450 + 02E5344B0C134D6600CBD4A5 + 1C78EAAC065D492600B07095 + + WindowString + 52 398 440 400 0 0 1440 878 + WindowToolGUID + 02FE63E70BEEC7AD004A1450 + WindowToolIsVisible + + + + FirstTimeWindowDisplayed + + Identifier + windowTool.run + IsVertical + + Layout + + + Dock + + + ContentConfiguration + + LauncherConfigVersion + 3 + PBXProjectModuleGUID + 1CD0528B0623707200166675 + PBXProjectModuleLabel + Run + Runner + + HorizontalSplitView + + _collapsingFrameDimension + 0.0 + _indexOfCollapsedView + 0 + _percentageOfCollapsedView + 0.0 + isCollapsed + yes + sizes + + {{0, 0}, {367, 168}} + {{0, 173}, {367, 270}} + + + VerticalSplitView + + _collapsingFrameDimension + 0.0 + _indexOfCollapsedView + 0 + _percentageOfCollapsedView + 0.0 + isCollapsed + yes + sizes + + {{0, 0}, {406, 443}} + {{411, 0}, {517, 443}} + + + + + GeometryConfiguration + + Frame + {{0, 0}, {487, 159}} + RubberWindowFrame + 856 644 487 200 0 0 1440 878 + + Module + PBXRunSessionModule + Proportion + 159pt + + + Proportion + 159pt + + + Name + Run Log + ServiceClasses + + PBXRunSessionModule + + StatusbarIsVisible + + TableOfContents + + 1C0AD2B3069F1EA900FABCE6 + 02E533680C12136E00CBD4A5 + 1CD0528B0623707200166675 + 02E533690C12136E00CBD4A5 + + ToolbarConfiguration + xcode.toolbar.config.run + WindowString + 856 644 487 200 0 0 1440 878 + WindowToolGUID + 1C0AD2B3069F1EA900FABCE6 + WindowToolIsVisible + + + + Identifier + windowTool.scm + Layout + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1C78EAB2065D492600B07095 + PBXProjectModuleLabel + <No Editor> + PBXSplitModuleInNavigatorKey + + Split0 + + PBXProjectModuleGUID + 1C78EAB3065D492600B07095 + + SplitCount + 1 + + StatusBarVisibility + 1 + + GeometryConfiguration + + Frame + {{0, 0}, {452, 0}} + RubberWindowFrame + 743 379 452 308 0 0 1280 1002 + + Module + PBXNavigatorGroup + Proportion + 0pt + + + BecomeActive + 1 + ContentConfiguration + + PBXProjectModuleGUID + 1CD052920623707200166675 + PBXProjectModuleLabel + SCM + + GeometryConfiguration + + ConsoleFrame + {{0, 259}, {452, 0}} + Frame + {{0, 7}, {452, 259}} + RubberWindowFrame + 743 379 452 308 0 0 1280 1002 + TableConfiguration + + Status + 30 + FileName + 199 + Path + 197.09500122070312 + + TableFrame + {{0, 0}, {452, 250}} + + Module + PBXCVSModule + Proportion + 262pt + + + Proportion + 266pt + + + Name + SCM + ServiceClasses + + PBXCVSModule + + StatusbarIsVisible + 1 + TableOfContents + + 1C78EAB4065D492600B07095 + 1C78EAB5065D492600B07095 + 1C78EAB2065D492600B07095 + 1CD052920623707200166675 + + ToolbarConfiguration + xcode.toolbar.config.scm + WindowString + 743 379 452 308 0 0 1280 1002 + + + Identifier + windowTool.breakpoints + IsVertical + 0 + Layout + + + Dock + + + BecomeActive + 1 + ContentConfiguration + + PBXBottomSmartGroupGIDs + + 1C77FABC04509CD000000102 + + PBXProjectModuleGUID + 1CE0B1FE06471DED0097A5F4 + PBXProjectModuleLabel + Files + PBXProjectStructureProvided + no + PBXSmartGroupTreeModuleColumnData + + PBXSmartGroupTreeModuleColumnWidthsKey + + 168 + + PBXSmartGroupTreeModuleColumnsKey_v4 + + MainColumn + + + PBXSmartGroupTreeModuleOutlineStateKey_v7 + + PBXSmartGroupTreeModuleOutlineStateExpansionKey + + 1C77FABC04509CD000000102 + + PBXSmartGroupTreeModuleOutlineStateSelectionKey + + + 0 + + + PBXSmartGroupTreeModuleOutlineStateVisibleRectKey + {{0, 0}, {168, 350}} + + PBXTopSmartGroupGIDs + + XCIncludePerspectivesSwitch + 0 + + GeometryConfiguration + + Frame + {{0, 0}, {185, 368}} + GroupTreeTableConfiguration + + MainColumn + 168 + + RubberWindowFrame + 315 424 744 409 0 0 1440 878 + + Module + PBXSmartGroupTreeModule + Proportion + 185pt + + + ContentConfiguration + + PBXProjectModuleGUID + 1CA1AED706398EBD00589147 + PBXProjectModuleLabel + Detail + + GeometryConfiguration + + Frame + {{190, 0}, {554, 368}} + RubberWindowFrame + 315 424 744 409 0 0 1440 878 + + Module + XCDetailModule + Proportion + 554pt + + + Proportion + 368pt + + + MajorVersion + 2 + MinorVersion + 0 + Name + Breakpoints + ServiceClasses + + PBXSmartGroupTreeModule + XCDetailModule + + StatusbarIsVisible + 1 + TableOfContents + + 1CDDB66807F98D9800BB5817 + 1CDDB66907F98D9800BB5817 + 1CE0B1FE06471DED0097A5F4 + 1CA1AED706398EBD00589147 + + ToolbarConfiguration + xcode.toolbar.config.breakpoints + WindowString + 315 424 744 409 0 0 1440 878 + WindowToolGUID + 1CDDB66807F98D9800BB5817 + WindowToolIsVisible + 1 + + + FirstTimeWindowDisplayed + + Identifier + windowTool.debugAnimator + IsVertical + + Layout + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 0275EDB309E347DD001B1D57 + PBXProjectModuleLabel + + StatusBarVisibility + + + GeometryConfiguration + + Frame + {{0, 0}, {700, 459}} + RubberWindowFrame + 31 321 700 500 0 0 1440 878 + + Module + PBXNavigatorGroup + Proportion + 459pt + + + Proportion + 459pt + + + Name + Debug Visualizer + ServiceClasses + + PBXNavigatorGroup + + StatusbarIsVisible + + TableOfContents + + 0275EDB509E347DD001B1D57 + 0275EDB609E347DD001B1D57 + 0275EDB309E347DD001B1D57 + + ToolbarConfiguration + xcode.toolbar.config.debugAnimator + WindowString + 31 321 700 500 0 0 1440 878 + WindowToolGUID + 0275EDB509E347DD001B1D57 + WindowToolIsVisible + + + + Identifier + windowTool.bookmarks + Layout + + + Dock + + + Module + PBXBookmarksModule + Proportion + 100% + + + Proportion + 100% + + + Name + Bookmarks + ServiceClasses + + PBXBookmarksModule + + StatusbarIsVisible + 0 + WindowString + 538 42 401 187 0 0 1280 1002 + + + Identifier + windowTool.classBrowser + Layout + + + Dock + + + BecomeActive + 1 + ContentConfiguration + + OptionsSetName + Hierarchy, all classes + PBXProjectModuleGUID + 1CA6456E063B45B4001379D8 + PBXProjectModuleLabel + Class Browser - NSObject + + GeometryConfiguration + + ClassesFrame + {{0, 0}, {374, 96}} + ClassesTreeTableConfiguration + + PBXClassNameColumnIdentifier + 208 + PBXClassBookColumnIdentifier + 22 + + Frame + {{0, 0}, {630, 331}} + MembersFrame + {{0, 105}, {374, 395}} + MembersTreeTableConfiguration + + PBXMemberTypeIconColumnIdentifier + 22 + PBXMemberNameColumnIdentifier + 216 + PBXMemberTypeColumnIdentifier + 97 + PBXMemberBookColumnIdentifier + 22 + + PBXModuleWindowStatusBarHidden2 + 1 + RubberWindowFrame + 385 179 630 352 0 0 1440 878 + + Module + PBXClassBrowserModule + Proportion + 332pt + + + Proportion + 332pt + + + Name + Class Browser + ServiceClasses + + PBXClassBrowserModule + + StatusbarIsVisible + 0 + TableOfContents + + 1C0AD2AF069F1E9B00FABCE6 + 1C0AD2B0069F1E9B00FABCE6 + 1CA6456E063B45B4001379D8 + + ToolbarConfiguration + xcode.toolbar.config.classbrowser + WindowString + 385 179 630 352 0 0 1440 878 + WindowToolGUID + 1C0AD2AF069F1E9B00FABCE6 + WindowToolIsVisible + 0 + + + + diff --git a/MidiKeys.xcodeproj/creed.mode1v3 b/MidiKeys.xcodeproj/creed.mode1v3 new file mode 100644 index 0000000..d02d39f --- /dev/null +++ b/MidiKeys.xcodeproj/creed.mode1v3 @@ -0,0 +1,1528 @@ + + + + + ActivePerspectiveName + Project + AllowedModules + + + BundleLoadPath + + MaxInstances + n + Module + PBXSmartGroupTreeModule + Name + Groups and Files Outline View + + + BundleLoadPath + + MaxInstances + n + Module + PBXNavigatorGroup + Name + Editor + + + BundleLoadPath + + MaxInstances + n + Module + XCTaskListModule + Name + Task List + + + BundleLoadPath + + MaxInstances + n + Module + XCDetailModule + Name + File and Smart Group Detail Viewer + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXBuildResultsModule + Name + Detailed Build Results Viewer + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXProjectFindModule + Name + Project Batch Find Tool + + + BundleLoadPath + + MaxInstances + n + Module + XCProjectFormatConflictsModule + Name + Project Format Conflicts List + + + BundleLoadPath + + MaxInstances + n + Module + PBXBookmarksModule + Name + Bookmarks Tool + + + BundleLoadPath + + MaxInstances + n + Module + PBXClassBrowserModule + Name + Class Browser + + + BundleLoadPath + + MaxInstances + n + Module + PBXCVSModule + Name + Source Code Control Tool + + + BundleLoadPath + + MaxInstances + n + Module + PBXDebugBreakpointsModule + Name + Debug Breakpoints Tool + + + BundleLoadPath + + MaxInstances + n + Module + XCDockableInspector + Name + Inspector + + + BundleLoadPath + + MaxInstances + n + Module + PBXOpenQuicklyModule + Name + Open Quickly Tool + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXDebugSessionModule + Name + Debugger + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXDebugCLIModule + Name + Debug Console + + + BundleLoadPath + + MaxInstances + n + Module + XCSnapshotModule + Name + Snapshots Tool + + + Description + DefaultDescriptionKey + DockingSystemVisible + + Extension + mode1v3 + FavBarConfig + + PBXProjectModuleGUID + 02BAC2400D2ED6C10060DD02 + XCBarModuleItemNames + + F5F8BC1103909790013BC55C + AppController.m + + XCBarModuleItems + + F5F8BC1103909790013BC55C + + + FirstTimeWindowDisplayed + + Identifier + com.apple.perspectives.project.mode1v3 + MajorVersion + 33 + MinorVersion + 0 + Name + Default + Notifications + + + XCObserverAutoDisconnectKey + + XCObserverDefintionKey + + XCObserverFactoryKey + XCPerspectivesSpecificationIdentifier + XCObserverGUIDKey + XCObserverProjectIdentifier + XCObserverNotificationKey + PBXStatusBuildStateMessageNotification + XCObserverTargetKey + XCMainBuildResultsModuleGUID + XCObserverTriggerKey + awakenModuleWithObserver: + XCObserverValidationKey + + + + OpenEditors + + PerspectiveWidths + + -1 + -1 + + Perspectives + + + ChosenToolbarItems + + XCToolbarPerspectiveControl + NSToolbarSeparatorItem + active-combo-popup + action + NSToolbarFlexibleSpaceItem + debugger-enable-breakpoints + build-and-go + buildOrClean + com.apple.ide.PBXToolbarStopButton + get-info + show-inspector + NSToolbarFlexibleSpaceItem + servicesModuleCVS + servicesModuledebug + servicesModulebreakpoints + servicesModulefind + com.apple.pbx.toolbar.searchfield + + ControllerClassBaseName + + IconName + WindowOfProjectWithEditor + Identifier + perspective.project + IsVertical + + Layout + + + BecomeActive + + ContentConfiguration + + PBXBottomSmartGroupGIDs + + 1C37FBAC04509CD000000102 + 1C37FAAC04509CD000000102 + 1C37FABC05509CD000000102 + 1C37FABC05539CD112110102 + E2644B35053B69B200211256 + 1C37FABC04509CD000100104 + 1CC0EA4004350EF90044410B + 1CC0EA4004350EF90041110B + + PBXProjectModuleGUID + 1CE0B1FE06471DED0097A5F4 + PBXProjectModuleLabel + Files + PBXProjectStructureProvided + yes + PBXSmartGroupTreeModuleColumnData + + PBXSmartGroupTreeModuleColumnWidthsKey + + 22 + 22 + 263 + + PBXSmartGroupTreeModuleColumnsKey_v4 + + TargetStatusColumn + SCMStatusColumn + MainColumn + + + PBXSmartGroupTreeModuleOutlineStateKey_v7 + + PBXSmartGroupTreeModuleOutlineStateExpansionKey + + 29B97314FDCFA39411CA2CEA + 080E96DDFE201D6D7F000001 + 02D610F710ED232600B7DF2F + 29B97317FDCFA39411CA2CEA + 1C37FBAC04509CD000000102 + + PBXSmartGroupTreeModuleOutlineStateSelectionKey + + + 39 + 37 + 0 + + + PBXSmartGroupTreeModuleOutlineStateVisibleRectKey + {{0, 0}, {307, 1058}} + + PBXTopSmartGroupGIDs + + XCIncludePerspectivesSwitch + + XCSharingToken + com.apple.Xcode.GFSharingToken + + GeometryConfiguration + + Frame + {{0, 0}, {324, 1076}} + GroupTreeTableConfiguration + + TargetStatusColumn + 22 + SCMStatusColumn + 22 + MainColumn + 263 + + RubberWindowFrame + 38 39 1150 1139 0 0 1920 1178 + + Module + PBXSmartGroupTreeModule + Proportion + 324pt + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1CE0B20306471E060097A5F4 + PBXProjectModuleLabel + OverlayIndicator.m + PBXSplitModuleInNavigatorKey + + Split0 + + PBXProjectModuleGUID + 1CE0B20406471E060097A5F4 + PBXProjectModuleLabel + OverlayIndicator.m + _historyCapacity + 0 + bookmark + 02D61566110A63C000B7DF2F + history + + 028E8E970BE56775004B2132 + 028E8E990BE56775004B2132 + 02E534690C13570400CBD4A5 + 02E534AA0C1B30FC00CBD4A5 + 02BEF8F01078093F00A35020 + 029ECBC710E8466C003648D5 + 029ECBC810E8466C003648D5 + 029ECBC910E8466C003648D5 + 029ECBCA10E8466C003648D5 + 029ECBEB10E8606C003648D5 + 029ECBEC10E8606C003648D5 + 029ECC0510E91D5E003648D5 + 029ECC0710E91D5E003648D5 + 029ECD2C10E95077003648D5 + 029ECD2E10E95077003648D5 + 029ECD3110E95077003648D5 + 02D60EB410EAFA9A00B7DF2F + 02D60EB610EAFA9A00B7DF2F + 02D60EB810EAFA9A00B7DF2F + 02D60EBC10EAFA9A00B7DF2F + 02D60EC410EAFB4000B7DF2F + 02D610AE10ED073F00B7DF2F + 02D6116710ED317400B7DF2F + 02D6116A10ED317400B7DF2F + 02D6123410EE6C5700B7DF2F + 02D6123510EE6C5700B7DF2F + 02D6123610EE6C5700B7DF2F + 02D612C610EE9BEA00B7DF2F + 02D612C710EE9BEA00B7DF2F + 02D612FD10EFD5A200B7DF2F + 02D6130010EFD5A200B7DF2F + 02D613CF11039EE800B7DF2F + 02D613D011039EE800B7DF2F + 02D613D111039EE800B7DF2F + 02D613FE1103DC7700B7DF2F + 02D614051103DE2A00B7DF2F + 02D613DF1103A01000B7DF2F + + + SplitCount + 1 + + StatusBarVisibility + + + GeometryConfiguration + + Frame + {{0, 0}, {821, 1071}} + RubberWindowFrame + 38 39 1150 1139 0 0 1920 1178 + + Module + PBXNavigatorGroup + Proportion + 1071pt + + + ContentConfiguration + + PBXProjectModuleGUID + 1CE0B20506471E060097A5F4 + PBXProjectModuleLabel + Detail + + GeometryConfiguration + + Frame + {{0, 1076}, {821, 0}} + RubberWindowFrame + 38 39 1150 1139 0 0 1920 1178 + + Module + XCDetailModule + Proportion + 0pt + + + Proportion + 821pt + + + Name + Project + ServiceClasses + + XCModuleDock + PBXSmartGroupTreeModule + XCModuleDock + PBXNavigatorGroup + XCDetailModule + + TableOfContents + + 02D60DEA10E988B900B7DF2F + 1CE0B1FE06471DED0097A5F4 + 02D60DEB10E988B900B7DF2F + 1CE0B20306471E060097A5F4 + 1CE0B20506471E060097A5F4 + + ToolbarConfigUserDefaultsMinorVersion + 2 + ToolbarConfiguration + xcode.toolbar.config.defaultV3 + + + ControllerClassBaseName + + IconName + WindowOfProject + Identifier + perspective.morph + IsVertical + + Layout + + + ContentConfiguration + + PBXBottomSmartGroupGIDs + + 1C37FBAC04509CD000000102 + 1C37FAAC04509CD000000102 + 1C08E77C0454961000C914BD + 1C37FABC05509CD000000102 + 1C37FABC05539CD112110102 + E2644B35053B69B200211256 + 1C37FABC04509CD000100104 + 1CC0EA4004350EF90044410B + 1CC0EA4004350EF90041110B + + PBXProjectModuleGUID + 11E0B1FE06471DED0097A5F4 + PBXProjectModuleLabel + Files + PBXProjectStructureProvided + yes + PBXSmartGroupTreeModuleColumnData + + PBXSmartGroupTreeModuleColumnWidthsKey + + 22 + 261 + + PBXSmartGroupTreeModuleColumnsKey_v4 + + SCMStatusColumn + MainColumn + + + PBXSmartGroupTreeModuleOutlineStateKey_v7 + + PBXSmartGroupTreeModuleOutlineStateExpansionKey + + 29B97314FDCFA39411CA2CEA + 080E96DDFE201D6D7F000001 + 29B97315FDCFA39411CA2CEA + 1C37FBAC04509CD000000102 + 1C37FABC05509CD000000102 + + PBXSmartGroupTreeModuleOutlineStateSelectionKey + + + 1 + 0 + + + PBXSmartGroupTreeModuleOutlineStateVisibleRectKey + {{0, 0}, {283, 759}} + + PBXTopSmartGroupGIDs + + XCIncludePerspectivesSwitch + + XCSharingToken + com.apple.Xcode.GFSharingToken + + GeometryConfiguration + + Frame + {{0, 0}, {300, 777}} + GroupTreeTableConfiguration + + SCMStatusColumn + 22 + MainColumn + 261 + + + Module + PBXSmartGroupTreeModule + Proportion + 300pt + + + Name + Morph + PreferredWidth + 300 + ServiceClasses + + XCModuleDock + PBXSmartGroupTreeModule + + TableOfContents + + 11E0B1FE06471DED0097A5F4 + + ToolbarConfiguration + xcode.toolbar.config.default.shortV3 + + + PerspectivesBarVisible + + ShelfIsVisible + + StatusbarIsVisible + + TimeStamp + 285893568.72637999 + ToolbarDisplayMode + 2 + ToolbarIsVisible + + ToolbarSizeMode + 1 + Type + Perspectives + UpdateMessage + The Default Workspace in this version of Xcode now includes support to hide and show the detail view (what has been referred to as the "Metro-Morph" feature). You must discard your current Default Workspace settings and update to the latest Default Workspace in order to gain this feature. Do you wish to update to the latest Workspace defaults for project '%@'? + WindowJustification + 5 + WindowOrderList + + 02D611C310ED3FC000B7DF2F + 1C530D57069F1CE1000CFCEE + 029ECAC410E7DB45003648D5 + 02D60DF410E988B900B7DF2F + 02D60DF510E988B900B7DF2F + 1C78EAAD065D492600B07095 + 1CD10A99069EF8BA00B06720 + 02BAC2450D2ED7E00060DD02 + /Users/creed/projects/MidiKeys/MidiKeys.xcodeproj + + WindowString + 38 39 1150 1139 0 0 1920 1178 + WindowToolsV3 + + + FirstTimeWindowDisplayed + + Identifier + windowTool.build + IsVertical + + Layout + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1CD0528F0623707200166675 + PBXProjectModuleLabel + OverlayIndicator.m + StatusBarVisibility + + + GeometryConfiguration + + Frame + {{0, 0}, {756, 314}} + RubberWindowFrame + 1083 40 756 631 0 0 1920 1178 + + Module + PBXNavigatorGroup + Proportion + 314pt + + + BecomeActive + + ContentConfiguration + + PBXProjectModuleGUID + XCMainBuildResultsModuleGUID + PBXProjectModuleLabel + Build Results + XCBuildResultsTrigger_Collapse + 1022 + XCBuildResultsTrigger_Open + 1010 + + GeometryConfiguration + + Frame + {{0, 319}, {756, 271}} + RubberWindowFrame + 1083 40 756 631 0 0 1920 1178 + + Module + PBXBuildResultsModule + Proportion + 271pt + + + Proportion + 590pt + + + Name + Build Results + ServiceClasses + + PBXBuildResultsModule + + StatusbarIsVisible + + TableOfContents + + 02BAC2450D2ED7E00060DD02 + 02D60DE810E988B700B7DF2F + 1CD0528F0623707200166675 + XCMainBuildResultsModuleGUID + + ToolbarConfiguration + xcode.toolbar.config.buildV3 + WindowString + 1083 40 756 631 0 0 1920 1178 + WindowToolGUID + 02BAC2450D2ED7E00060DD02 + WindowToolIsVisible + + + + FirstTimeWindowDisplayed + + Identifier + windowTool.debugger + IsVertical + + Layout + + + Dock + + + ContentConfiguration + + Debugger + + HorizontalSplitView + + _collapsingFrameDimension + 0.0 + _indexOfCollapsedView + 0 + _percentageOfCollapsedView + 0.0 + isCollapsed + yes + sizes + + {{0, 0}, {519, 498}} + {{0, 498}, {519, 553}} + + + VerticalSplitView + + _collapsingFrameDimension + 0.0 + _indexOfCollapsedView + 0 + _percentageOfCollapsedView + 0.0 + isCollapsed + yes + sizes + + {{0, 0}, {519, 1051}} + {{519, 0}, {924, 1051}} + + + + LauncherConfigVersion + 8 + PBXProjectModuleGUID + 1C162984064C10D400B95A72 + PBXProjectModuleLabel + Debug - GLUTExamples (Underwater) + + GeometryConfiguration + + DebugConsoleVisible + None + DebugConsoleWindowFrame + {{200, 200}, {500, 300}} + DebugSTDIOWindowFrame + {{200, 200}, {500, 300}} + Frame + {{0, 0}, {1443, 1051}} + PBXDebugSessionStackFrameViewKey + + DebugVariablesTableConfiguration + + Name + 215 + Value + 85 + Summary + 289 + + Frame + {{0, 498}, {519, 553}} + RubberWindowFrame + 201 86 1443 1092 0 0 1920 1178 + + RubberWindowFrame + 201 86 1443 1092 0 0 1920 1178 + + Module + PBXDebugSessionModule + Proportion + 1051pt + + + Proportion + 1051pt + + + Name + Debugger + ServiceClasses + + PBXDebugSessionModule + + StatusbarIsVisible + + TableOfContents + + 1CD10A99069EF8BA00B06720 + 02D60DEC10E988B900B7DF2F + 1C162984064C10D400B95A72 + 02D60DED10E988B900B7DF2F + 02D60DEE10E988B900B7DF2F + 02D60DEF10E988B900B7DF2F + 02D60DF010E988B900B7DF2F + 02D60DF110E988B900B7DF2F + + ToolbarConfiguration + xcode.toolbar.config.debugV3 + WindowString + 201 86 1443 1092 0 0 1920 1178 + WindowToolGUID + 1CD10A99069EF8BA00B06720 + WindowToolIsVisible + + + + FirstTimeWindowDisplayed + + Identifier + windowTool.find + IsVertical + + Layout + + + Dock + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1CDD528C0622207200134675 + PBXProjectModuleLabel + MidiKeyView.m + StatusBarVisibility + + + GeometryConfiguration + + Frame + {{0, 0}, {833, 439}} + RubberWindowFrame + 567 302 833 761 0 0 1920 1178 + + Module + PBXNavigatorGroup + Proportion + 833pt + + + Proportion + 439pt + + + BecomeActive + + ContentConfiguration + + PBXProjectModuleGUID + 1CD0528E0623707200166675 + PBXProjectModuleLabel + Project Find + + GeometryConfiguration + + Frame + {{0, 444}, {833, 276}} + RubberWindowFrame + 567 302 833 761 0 0 1920 1178 + + Module + PBXProjectFindModule + Proportion + 276pt + + + Proportion + 720pt + + + Name + Project Find + ServiceClasses + + PBXProjectFindModule + + StatusbarIsVisible + + TableOfContents + + 1C530D57069F1CE1000CFCEE + 02D6106310EC38FC00B7DF2F + 02D6106410EC38FC00B7DF2F + 1CDD528C0622207200134675 + 1CD0528E0623707200166675 + + WindowString + 567 302 833 761 0 0 1920 1178 + WindowToolGUID + 1C530D57069F1CE1000CFCEE + WindowToolIsVisible + + + + FirstTimeWindowDisplayed + + Identifier + MENUSEPARATOR + + + FirstTimeWindowDisplayed + + Identifier + windowTool.debuggerConsole + IsVertical + + Layout + + + Dock + + + BecomeActive + + ContentConfiguration + + PBXProjectModuleGUID + 1C78EAAC065D492600B07095 + PBXProjectModuleLabel + Debugger Console + + GeometryConfiguration + + Frame + {{0, 0}, {656, 358}} + RubberWindowFrame + 1086 40 656 399 0 0 1920 1178 + + Module + PBXDebugCLIModule + Proportion + 358pt + + + Proportion + 358pt + + + Name + Debugger Console + ServiceClasses + + PBXDebugCLIModule + + StatusbarIsVisible + + TableOfContents + + 1C78EAAD065D492600B07095 + 02D60DF210E988B900B7DF2F + 1C78EAAC065D492600B07095 + + ToolbarConfiguration + xcode.toolbar.config.consoleV3 + WindowString + 1086 40 656 399 0 0 1920 1178 + WindowToolGUID + 1C78EAAD065D492600B07095 + WindowToolIsVisible + + + + Identifier + windowTool.snapshots + Layout + + + Dock + + + Module + XCSnapshotModule + Proportion + 100% + + + Proportion + 100% + + + Name + Snapshots + ServiceClasses + + XCSnapshotModule + + StatusbarIsVisible + Yes + ToolbarConfiguration + xcode.toolbar.config.snapshots + WindowString + 315 824 300 550 0 0 1440 878 + WindowToolIsVisible + Yes + + + FirstTimeWindowDisplayed + + Identifier + windowTool.scm + IsVertical + + Layout + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1C78EAB2065D492600B07095 + PBXProjectModuleLabel + OverlayIndicator.m + StatusBarVisibility + + + GeometryConfiguration + + Frame + {{0, 0}, {656, 20}} + RubberWindowFrame + 1121 647 656 531 0 0 1920 1178 + + Module + PBXNavigatorGroup + Proportion + 20pt + + + BecomeActive + + ContentConfiguration + + PBXCVSModuleFilterTypeKey + 1032 + PBXCVSModuleTreeModuleColumnData + + PBXCVSModuleTreeModuleColumnWidthsKey + + 240 + 56 + 63 + 60 + 63 + 139 + + PBXCVSModuleTreeModuleColumnsKey + + Name + Status + Update + Revision + Author + Date + + + PBXProjectModuleGUID + 1CD052920623707200166675 + PBXProjectModuleLabel + SCM Results + SCMActivityViewerShowingDefaultKey + {{0, 316}, {656, 149}} + + GeometryConfiguration + + Frame + {{0, 25}, {656, 465}} + RubberWindowFrame + 1121 647 656 531 0 0 1920 1178 + + Module + PBXCVSModule + Proportion + 465pt + + + Proportion + 490pt + + + Name + SCM + ServiceClasses + + PBXCVSModule + + StatusbarIsVisible + + TableOfContents + + 029ECAC410E7DB45003648D5 + 02D60F0110EAFF5200B7DF2F + 1C78EAB2065D492600B07095 + 1CD052920623707200166675 + + ToolbarConfiguration + xcode.toolbar.config.scm + WindowString + 1121 647 656 531 0 0 1920 1178 + WindowToolGUID + 029ECAC410E7DB45003648D5 + WindowToolIsVisible + + + + FirstTimeWindowDisplayed + + Identifier + windowTool.breakpoints + IsVertical + + Layout + + + Dock + + + ContentConfiguration + + PBXBottomSmartGroupGIDs + + 1C77FABC04509CD000000102 + + PBXProjectModuleGUID + 1CE0B1FE06471DED0097A5F4 + PBXProjectModuleLabel + Files + PBXProjectStructureProvided + no + PBXSmartGroupTreeModuleColumnData + + PBXSmartGroupTreeModuleColumnWidthsKey + + 168 + + PBXSmartGroupTreeModuleColumnsKey_v4 + + MainColumn + + + PBXSmartGroupTreeModuleOutlineStateKey_v7 + + PBXSmartGroupTreeModuleOutlineStateExpansionKey + + 1C77FABC04509CD000000102 + + PBXSmartGroupTreeModuleOutlineStateSelectionKey + + + 0 + + + PBXSmartGroupTreeModuleOutlineStateVisibleRectKey + {{0, 0}, {168, 350}} + + PBXTopSmartGroupGIDs + + XCIncludePerspectivesSwitch + + + GeometryConfiguration + + Frame + {{0, 0}, {185, 368}} + GroupTreeTableConfiguration + + MainColumn + 168 + + RubberWindowFrame + 532 691 744 409 0 0 1920 1178 + + Module + PBXSmartGroupTreeModule + Proportion + 185pt + + + BecomeActive + + ContentConfiguration + + PBXProjectModuleGUID + 1CA1AED706398EBD00589147 + PBXProjectModuleLabel + Detail + + GeometryConfiguration + + Frame + {{190, 0}, {554, 368}} + RubberWindowFrame + 532 691 744 409 0 0 1920 1178 + + Module + XCDetailModule + Proportion + 554pt + + + Proportion + 368pt + + + MajorVersion + 3 + MinorVersion + 0 + Name + Breakpoints + ServiceClasses + + PBXSmartGroupTreeModule + XCDetailModule + + StatusbarIsVisible + + TableOfContents + + 02D611C310ED3FC000B7DF2F + 02D611C410ED3FC000B7DF2F + 1CE0B1FE06471DED0097A5F4 + 1CA1AED706398EBD00589147 + + ToolbarConfiguration + xcode.toolbar.config.breakpointsV3 + WindowString + 532 691 744 409 0 0 1920 1178 + WindowToolGUID + 02D611C310ED3FC000B7DF2F + WindowToolIsVisible + + + + FirstTimeWindowDisplayed + + Identifier + windowTool.debugAnimator + Layout + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 0275EDB309E347DD001B1D57 + PBXProjectModuleLabel + + StatusBarVisibility + + + GeometryConfiguration + + Frame + {{0, 0}, {700, 459}} + RubberWindowFrame + 31 321 700 500 0 0 1440 878 + + Module + PBXNavigatorGroup + Proportion + 459pt + + + Proportion + 459pt + + + Name + Debug Visualizer + ServiceClasses + + PBXNavigatorGroup + + StatusbarIsVisible + + ToolbarConfiguration + xcode.toolbar.config.debugAnimatorV3 + WindowString + 31 321 700 500 0 0 1440 878 + + + FirstTimeWindowDisplayed + + Identifier + windowTool.bookmarks + Layout + + + Dock + + + Module + PBXBookmarksModule + Proportion + 100% + + + Proportion + 100% + + + Name + Bookmarks + ServiceClasses + + PBXBookmarksModule + + StatusbarIsVisible + + WindowString + 538 42 401 187 0 0 1280 1002 + + + Identifier + windowTool.projectFormatConflicts + Layout + + + Dock + + + Module + XCProjectFormatConflictsModule + Proportion + 100% + + + Proportion + 100% + + + Name + Project Format Conflicts + ServiceClasses + + XCProjectFormatConflictsModule + + StatusbarIsVisible + + WindowContentMinSize + 450 300 + WindowString + 50 850 472 307 0 0 1440 877 + + + FirstTimeWindowDisplayed + + Identifier + windowTool.classBrowser + Layout + + + Dock + + + BecomeActive + 1 + ContentConfiguration + + OptionsSetName + Hierarchy, all classes + PBXProjectModuleGUID + 1CA6456E063B45B4001379D8 + PBXProjectModuleLabel + Class Browser - NSObject + + GeometryConfiguration + + ClassesFrame + {{0, 0}, {374, 96}} + ClassesTreeTableConfiguration + + PBXClassNameColumnIdentifier + 208 + PBXClassBookColumnIdentifier + 22 + + Frame + {{0, 0}, {630, 331}} + MembersFrame + {{0, 105}, {374, 395}} + MembersTreeTableConfiguration + + PBXMemberTypeIconColumnIdentifier + 22 + PBXMemberNameColumnIdentifier + 216 + PBXMemberTypeColumnIdentifier + 97 + PBXMemberBookColumnIdentifier + 22 + + PBXModuleWindowStatusBarHidden2 + 1 + RubberWindowFrame + 385 179 630 352 0 0 1440 878 + + Module + PBXClassBrowserModule + Proportion + 332pt + + + Proportion + 332pt + + + Name + Class Browser + ServiceClasses + + PBXClassBrowserModule + + StatusbarIsVisible + + TableOfContents + + 1C0AD2AF069F1E9B00FABCE6 + 1C0AD2B0069F1E9B00FABCE6 + 1CA6456E063B45B4001379D8 + + ToolbarConfiguration + xcode.toolbar.config.classbrowser + WindowString + 385 179 630 352 0 0 1440 878 + WindowToolGUID + 1C0AD2AF069F1E9B00FABCE6 + WindowToolIsVisible + + + + FirstTimeWindowDisplayed + + Identifier + windowTool.refactoring + IncludeInToolsMenu + + IsVertical + + Layout + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 029ECD1E10E94FCB003648D5 + + GeometryConfiguration + + Frame + {{0, 0}, {1852, 1137}} + RubberWindowFrame + 0 0 1852 1178 0 0 1920 1178 + XCRefactoringSplitViewLowerHeight + 959 + XCRefactoringSplitViewTotalHeight + 1077 + + Module + XCRefactoringModule + Proportion + 1137pt + + + Proportion + 1137pt + + + Name + Refactoring + ServiceClasses + + XCRefactoringModule + + StatusbarIsVisible + + TableOfContents + + 029ECD1F10E94FCB003648D5 + 029ECD2010E94FCB003648D5 + 029ECD1E10E94FCB003648D5 + + WindowString + 0 0 1852 1178 0 0 1920 1178 + WindowToolGUID + 029ECD1F10E94FCB003648D5 + WindowToolIsVisible + + + + + diff --git a/MidiKeys.xcodeproj/creed.pbxuser b/MidiKeys.xcodeproj/creed.pbxuser new file mode 100644 index 0000000..6d788a9 --- /dev/null +++ b/MidiKeys.xcodeproj/creed.pbxuser @@ -0,0 +1,1592 @@ +// !$*UTF8*$! +{ + 020631DF03EA0C5800488331 /* French */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {653, 1080}}"; + sepNavSelRange = "{268, 0}"; + sepNavVisRect = "{{0, 0}, {653, 1080}}"; + }; + }; + 020631E003EA0C5800488331 /* French */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {760, 1054}}"; + sepNavSelRange = "{226, 18}"; + sepNavVisRange = "{0, 269}"; + sepNavVisRect = "{{0, 0}, {685, 782}}"; + }; + }; + 020631E203EA0C5800488331 /* French */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {760, 1054}}"; + sepNavSelRange = "{282, 3}"; + sepNavVisRange = "{0, 736}"; + }; + }; + 020D980E03EB1FDE0031FAE0 /* Japanese */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {760, 1054}}"; + sepNavSelRange = "{226, 18}"; + sepNavVisRange = "{0, 269}"; + sepNavVisRect = "{{0, 0}, {685, 782}}"; + }; + }; + 020D981003EB1FDE0031FAE0 /* Japanese */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {760, 1054}}"; + sepNavSelRange = "{254, 3}"; + sepNavVisRange = "{0, 591}"; + }; + }; + 0255683705D5E8B2002EA660 /* MidiKeys-Info.plist */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {707, 782}}"; + sepNavSelRange = "{808, 0}"; + sepNavVisRect = "{{0, 0}, {707, 782}}"; + sepNavWindowFrame = "{{15, 24}, {838, 1149}}"; + }; + }; + 028E8E970BE56775004B2132 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = F551D3FD03621A310101F9C2 /* Octave.png */; + }; + 028E8E990BE56775004B2132 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = 02BFAFAD03EDEA94000CADE3 /* OctaveUp.png */; + }; + 028FE9A303B6D8B5006ABE44 /* English */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {760, 1054}}"; + sepNavSelRange = "{54, 0}"; + sepNavVisRange = "{0, 2315}"; + sepNavVisRect = "{{0, 0}, {707, 782}}"; + }; + }; + 028FE9A703B6D8DC006ABE44 /* German */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {653, 1080}}"; + sepNavSelRange = "{274, 0}"; + sepNavVisRect = "{{0, 0}, {653, 1080}}"; + }; + }; + 028FE9A803B6DA6C006ABE44 /* MidiKeys_Prefix.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {760, 1054}}"; + sepNavSelRange = "{59, 0}"; + sepNavVisRange = "{0, 59}"; + sepNavVisRect = "{{0, 0}, {707, 755}}"; + }; + }; + 029ECAE910E7DCCC003648D5 /* dsa_pub.pem */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {760, 1054}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{0, 1178}"; + }; + }; + 029ECBB010E842FD003648D5 /* English */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {760, 32695}}"; + sepNavSelRange = "{739, 0}"; + sepNavVisRange = "{0, 3770}"; + }; + }; + 029ECBBE10E845B5003648D5 /* German */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {760, 36387}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{0, 3817}"; + }; + }; + 029ECBC010E845CB003648D5 /* French */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {760, 36530}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{0, 3816}"; + }; + }; + 029ECBC210E845DD003648D5 /* Japanese */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {760, 36452}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{0, 3815}"; + }; + }; + 029ECBC410E845EF003648D5 /* Spanish */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {760, 36465}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{0, 3818}"; + }; + }; + 029ECBC610E84656003648D5 /* English */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {760, 40261}}"; + sepNavSelRange = "{1983, 0}"; + sepNavVisRange = "{0, 3832}"; + }; + }; + 029ECBC710E8466C003648D5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 029ECBBE10E845B5003648D5 /* German */; + name = "MainMenu.xib: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 3817; + vrLoc = 0; + }; + 029ECBC810E8466C003648D5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 029ECBC010E845CB003648D5 /* French */; + name = "MainMenu.xib: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 3816; + vrLoc = 0; + }; + 029ECBC910E8466C003648D5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 029ECBC210E845DD003648D5 /* Japanese */; + name = "MainMenu.xib: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 3815; + vrLoc = 0; + }; + 029ECBCA10E8466C003648D5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 029ECBC410E845EF003648D5 /* Spanish */; + name = "MainMenu.xib: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 3818; + vrLoc = 0; + }; + 029ECBCD10E846C9003648D5 /* German */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {760, 15886}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{0, 3853}"; + }; + }; + 029ECBCE10E846F9003648D5 /* French */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {760, 16471}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{0, 3768}"; + }; + }; + 029ECBCF10E84877003648D5 /* Japanese */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {760, 16553}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{0, 3716}"; + }; + }; + 029ECBD010E8488F003648D5 /* Spanish */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {760, 16458}}"; + sepNavSelRange = "{1682, 0}"; + sepNavVisRange = "{0, 3772}"; + }; + }; + 029ECBEB10E8606C003648D5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 029ECBCE10E846F9003648D5 /* French */; + name = "Preferences.xib: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 3768; + vrLoc = 0; + }; + 029ECBEC10E8606C003648D5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 029ECBCF10E84877003648D5 /* Japanese */; + name = "Preferences.xib: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 3716; + vrLoc = 0; + }; + 029ECC0510E91D5E003648D5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = F5BB863D036C79E401281FE2 /* MidiKeysApplication.h */; + name = "MidiKeysApplication.h: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 369; + vrLoc = 0; + }; + 029ECC0710E91D5E003648D5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = F508BD06036B684A01EFE74C /* KeyMapManager.h */; + name = "KeyMapManager.h: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 594; + vrLoc = 0; + }; + 029ECD2C10E95077003648D5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 029ECD2D10E95077003648D5 /* TextInputSources.h */; + name = "TextInputSources.h: 805"; + rLen = 105; + rLoc = 31014; + rType = 0; + vrLen = 2723; + vrLoc = 29490; + }; + 029ECD2D10E95077003648D5 /* TextInputSources.h */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = TextInputSources.h; + path = /Developer/SDKs/MacOSX10.5.sdk/System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Versions/A/Headers/TextInputSources.h; + sourceTree = ""; + }; + 029ECD2E10E95077003648D5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 029ECD2F10E95077003648D5 /* Keyboards.h */; + name = "Keyboards.h: 406"; + rLen = 39; + rLoc = 11273; + rType = 0; + vrLen = 3082; + vrLoc = 10888; + }; + 029ECD2F10E95077003648D5 /* Keyboards.h */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = Keyboards.h; + path = /Developer/SDKs/MacOSX10.5.sdk/System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Versions/A/Headers/Keyboards.h; + sourceTree = ""; + }; + 029ECD3110E95077003648D5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 02E533C70C122A2800CBD4A5 /* ShortcutRecorderCell.m */; + name = "ShortcutRecorderCell.m: 1003"; + rLen = 27; + rLoc = 30971; + rType = 0; + vrLen = 3046; + vrLoc = 29849; + }; + 02AEA56104A00671003989A9 /* OverlayIndicator.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {760, 1054}}"; + sepNavSelRange = "{553, 0}"; + sepNavVisRange = "{0, 1103}"; + sepNavVisRect = "{{0, 0}, {691, 755}}"; + }; + }; + 02AEA56204A00671003989A9 /* OverlayIndicator.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {695, 3627}}"; + sepNavSelRange = "{1943, 0}"; + sepNavVisRange = "{1943, 1085}"; + sepNavVisRect = "{{0, 0}, {595, 296}}"; + }; + }; + 02BC7011050CE08C00D77426 /* Source Control */ = { + isa = PBXSourceControlManager; + fallbackIsa = XCSourceControlManager; + isSCMEnabled = 0; + scmConfiguration = { + SubversionToolPath = /usr/local/bin/svn; + repositoryName = himiko; + repositoryNamesForRoots = { + "" = himiko; + }; + }; + scmType = scm.subversion; + }; + 02BC7012050CE08C00D77426 /* Code sense */ = { + isa = PBXCodeSenseManager; + indexTemplatePath = ""; + }; + 02BC7052050CE14900D77426 /* MidiKeys */ = { + activeExec = 0; + executables = ( + 02BC7054050CE14900D77426 /* MidiKeys */, + ); + }; + 02BC7054050CE14900D77426 /* MidiKeys */ = { + isa = PBXExecutable; + activeArgIndices = ( + ); + argumentStrings = ( + ); + autoAttachOnCrash = 1; + breakpointsEnabled = 0; + configStateDict = { + }; + customDataFormattersEnabled = 1; + dataTipCustomDataFormattersEnabled = 1; + dataTipShowTypeColumn = 1; + dataTipSortType = 0; + debuggerPlugin = GDBDebugging; + disassemblyDisplayState = 0; + dylibVariantSuffix = ""; + enableDebugStr = 1; + environmentEntries = ( + ); + executableSystemSymbolLevel = 0; + executableUserSymbolLevel = 0; + libgmallocEnabled = 0; + name = MidiKeys; + savedGlobals = { + }; + showTypeColumn = 0; + sourceDirectories = ( + ); + variableFormatDictionary = { + $cs = 1; + $ds = 1; + $eax = 1; + $ebp = 1; + $ebx = 1; + $ecx = 1; + $edi = 1; + $edx = 1; + $eflags = 1; + $eip = 1; + $es = 1; + $esi = 1; + $esp = 1; + $fctrl = 1; + $fioff = 1; + $fiseg = 1; + $fooff = 1; + $fop = 1; + $foseg = 1; + $fs = 1; + $fstat = 1; + $ftag = 1; + $gs = 1; + $mxcsr = 1; + $ss = 1; + }; + }; + 02BD73A2044E69CF000C9424 /* Spanish */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {679, 574}}"; + sepNavSelRange = "{674, 0}"; + sepNavVisRect = "{{0, 0}, {679, 438}}"; + }; + }; + 02BD73A5044E6A0D000C9424 /* Spanish */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {760, 1054}}"; + sepNavSelRange = "{272, 0}"; + sepNavVisRange = "{0, 674}"; + }; + }; + 02BD73A7044E6A2A000C9424 /* Spanish */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {760, 1054}}"; + sepNavSelRange = "{244, 0}"; + sepNavVisRange = "{0, 279}"; + sepNavVisRect = "{{0, 0}, {685, 782}}"; + }; + }; + 02BD73A8044E6A7B000C9424 /* LiesMich.rtf */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {593, 1711}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 0}, {593, 311}}"; + }; + }; + 02BD73A9044E6A7B000C9424 /* Lisez-Moi.rtf */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {593, 1533}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 0}, {593, 311}}"; + }; + }; + 02BD73AA044E6A7B000C9424 /* ReadMe (Japanese).rtf */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {593, 1942}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 0}, {593, 311}}"; + }; + }; + 02BD73AE044E6A97000C9424 /* Version history.rtf */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {774, 1290}}"; + sepNavSelRange = "{1241, 0}"; + sepNavVisRect = "{{0, 0}, {774, 1054}}"; + }; + }; + 02BEF8F01078093F00A35020 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = F508BD02036B620801EFE74C /* MidiKeyMap.h */; + name = "MidiKeyMap.h: 45"; + rLen = 17; + rLoc = 1140; + rType = 0; + vrLen = 1165; + vrLoc = 0; + }; + 02D60EB410EAFA9A00B7DF2F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 02D60EB510EAFA9A00B7DF2F /* NSText.h */; + name = "NSText.h: 65"; + rLen = 6; + rLoc = 2568; + rType = 0; + vrLen = 2560; + vrLoc = 2422; + }; + 02D60EB510EAFA9A00B7DF2F /* NSText.h */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = NSText.h; + path = /Developer/SDKs/MacOSX10.5.sdk/System/Library/Frameworks/AppKit.framework/Versions/C/Headers/NSText.h; + sourceTree = ""; + }; + 02D60EB610EAFA9A00B7DF2F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 02D60EB710EAFA9A00B7DF2F /* NSTextView.h */; + name = "NSTextView.h: 79"; + rLen = 10; + rLoc = 2569; + rType = 0; + vrLen = 4054; + vrLoc = 2852; + }; + 02D60EB710EAFA9A00B7DF2F /* NSTextView.h */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = NSTextView.h; + path = /Developer/SDKs/MacOSX10.5.sdk/System/Library/Frameworks/AppKit.framework/Versions/C/Headers/NSTextView.h; + sourceTree = ""; + }; + 02D60EB810EAFA9A00B7DF2F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 02D60EB910EAFA9A00B7DF2F /* NSControl.h */; + name = "NSControl.h: 13"; + rLen = 30; + rLoc = 234; + rType = 0; + vrLen = 2371; + vrLoc = 0; + }; + 02D60EB910EAFA9A00B7DF2F /* NSControl.h */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = NSControl.h; + path = /Developer/SDKs/MacOSX10.5.sdk/System/Library/Frameworks/AppKit.framework/Versions/C/Headers/NSControl.h; + sourceTree = ""; + }; + 02D60EBB10EAFA9A00B7DF2F /* NSTextField.h */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = NSTextField.h; + path = /Developer/SDKs/MacOSX10.5.sdk/System/Library/Frameworks/AppKit.framework/Versions/C/Headers/NSTextField.h; + sourceTree = ""; + }; + 02D60EBC10EAFA9A00B7DF2F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 02AEA56104A00671003989A9 /* OverlayIndicator.h */; + name = "OverlayIndicator.h: 23"; + rLen = 0; + rLoc = 553; + rType = 0; + vrLen = 1103; + vrLoc = 0; + }; + 02D60EC410EAFB4000B7DF2F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 02D60EBB10EAFA9A00B7DF2F /* NSTextField.h */; + name = "NSTextField.h: 12"; + rLen = 64; + rLoc = 208; + rType = 0; + vrLen = 1642; + vrLoc = 0; + }; + 02D610AE10ED073F00B7DF2F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = F5BB863E036C79E401281FE2 /* MidiKeysApplication.m */; + name = "MidiKeysApplication.m: 53"; + rLen = 0; + rLoc = 1368; + rType = 0; + vrLen = 1717; + vrLoc = 0; + }; + 02D610FE10ED232600B7DF2F /* SRRecorderControl.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {760, 1054}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{0, 1787}"; + }; + }; + 02D6110010ED232600B7DF2F /* SRValidator.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {760, 1054}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{0, 819}"; + }; + }; + 02D6116710ED317400B7DF2F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 02D6110010ED232600B7DF2F /* SRValidator.h */; + name = "SRValidator.h: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 819; + vrLoc = 0; + }; + 02D6116A10ED317400B7DF2F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 02D610FE10ED232600B7DF2F /* SRRecorderControl.h */; + name = "SRRecorderControl.h: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1787; + vrLoc = 0; + }; + 02D6123410EE6C5700B7DF2F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = F508BCFA036B5A4801EFE74C /* PreferencesController.m */; + name = "PreferencesController.m: 62"; + rLen = 0; + rLoc = 1432; + rType = 0; + vrLen = 2131; + vrLoc = 268; + }; + 02D6123510EE6C5700B7DF2F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = F508BCF9036B5A4801EFE74C /* PreferencesController.h */; + name = "PreferencesController.h: 35"; + rLen = 0; + rLoc = 1151; + rType = 0; + vrLen = 1530; + vrLoc = 0; + }; + 02D6123610EE6C5700B7DF2F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 028FE9A303B6D8B5006ABE44 /* English */; + name = "Credits.html: 3"; + rLen = 0; + rLoc = 54; + rType = 0; + vrLen = 2315; + vrLoc = 0; + }; + 02D612C610EE9BEA00B7DF2F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 02F45D0103CE8BB00067B094 /* Preferences.h */; + name = "Preferences.h: 57"; + rLen = 0; + rLoc = 1808; + rType = 0; + vrLen = 1938; + vrLoc = 0; + }; + 02D612C710EE9BEA00B7DF2F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = F546EC5F035D006C0199E6AF /* AppController.h */; + name = "AppController.h: 55"; + rLen = 0; + rLoc = 1281; + rType = 0; + vrLen = 2261; + vrLoc = 383; + }; + 02D612FD10EFD5A200B7DF2F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 02D612FE10EFD5A200B7DF2F /* MIDIServices.h */; + name = "MIDIServices.h: 203"; + rLen = 0; + rLoc = 7561; + rType = 0; + vrLen = 2492; + vrLoc = 7541; + }; + 02D612FE10EFD5A200B7DF2F /* MIDIServices.h */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = MIDIServices.h; + path = /Developer/SDKs/MacOSX10.5.sdk/System/Library/Frameworks/CoreMIDI.framework/Versions/A/Headers/MIDIServices.h; + sourceTree = ""; + }; + 02D6130010EFD5A200B7DF2F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = F5F8BC1103909790013BC55C /* AppController.m */; + name = "AppController.m: 1065"; + rLen = 22; + rLoc = 31789; + rType = 0; + vrLen = 1746; + vrLoc = 31666; + }; + 02D613CF11039EE800B7DF2F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = F546EC7E035D0D950199E6AF /* MidiKeyView.m */; + name = "MidiKeyView.m: 465"; + rLen = 0; + rLoc = 12100; + rType = 0; + vrLen = 2003; + vrLoc = 11510; + }; + 02D613D011039EE800B7DF2F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = F508BD03036B620801EFE74C /* MidiKeyMap.m */; + name = "MidiKeyMap.m: 135"; + rLen = 0; + rLoc = 2841; + rType = 0; + vrLen = 1921; + vrLoc = 1517; + }; + 02D613D111039EE800B7DF2F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = F5B7521F036765350140410E /* EndpointDefaults.m */; + name = "EndpointDefaults.m: 35"; + rLen = 12; + rLoc = 818; + rType = 0; + vrLen = 1017; + vrLoc = 0; + }; + 02D613DF1103A01000B7DF2F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 02AEA56204A00671003989A9 /* OverlayIndicator.m */; + name = "OverlayIndicator.m: 99"; + rLen = 0; + rLoc = 1970; + rType = 0; + vrLen = 3012; + vrLoc = 1720; + }; + 02D613FE1103DC7700B7DF2F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 02BD73AE044E6A97000C9424 /* Version history.rtf */; + name = "Support for 10.4."; + rLen = 17; + rLoc = 1224; + rType = 0; + vrLen = 3147; + vrLoc = 0; + }; + 02D614051103DE2A00B7DF2F /* PlistBookmark */ = { + isa = PlistBookmark; + fRef = 0255683705D5E8B2002EA660 /* MidiKeys-Info.plist */; + fallbackIsa = PBXBookmark; + isK = 0; + kPath = ( + ); + name = "/Users/creed/projects/MidiKeys/MidiKeys-Info.plist"; + rLen = 0; + rLoc = 9223372036854775808; + }; + 02D61566110A63C000B7DF2F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 02AEA56204A00671003989A9 /* OverlayIndicator.m */; + name = "OverlayIndicator.m: 99"; + rLen = 0; + rLoc = 1970; + rType = 0; + vrLen = 3012; + vrLoc = 1720; + }; + 02E533C20C122A2800CBD4A5 /* CTGradient.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {695, 819}}"; + sepNavSelRange = "{327, 22}"; + sepNavVisRange = "{0, 444}"; + sepNavVisRect = "{{0, 1}, {691, 755}}"; + }; + }; + 02E533C30C122A2800CBD4A5 /* CTGradient.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {695, 9945}}"; + sepNavSelRange = "{3799, 6}"; + sepNavVisRange = "{3523, 752}"; + sepNavVisRect = "{{0, 6831}, {691, 755}}"; + }; + }; + 02E533C70C122A2800CBD4A5 /* ShortcutRecorderCell.m */ = { + isa = PBXFileReference; + fileEncoding = 4; + lastKnownFileType = sourcecode.c.objc; + name = ShortcutRecorderCell.m; + path = /Users/creed/projects/MidiKeys/ShortcutRecorderCell.m; + sourceTree = ""; + }; + 02E533EA0C122BB500CBD4A5 /* sv */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {760, 1054}}"; + sepNavSelRange = "{24, 0}"; + sepNavVisRange = "{0, 1250}"; + sepNavVisRect = "{{0, 0}, {691, 755}}"; + }; + }; + 02E534690C13570400CBD4A5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 02E533C20C122A2800CBD4A5 /* CTGradient.h */; + name = "CTGradient.h: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1437; + vrLoc = 0; + }; + 02E534AA0C1B30FC00CBD4A5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 02E533C30C122A2800CBD4A5 /* CTGradient.m */; + name = "CTGradient.m: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1580; + vrLoc = 12631; + }; + 02F45D0103CE8BB00067B094 /* Preferences.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {760, 1031}}"; + sepNavSelRange = "{1808, 0}"; + sepNavVisRange = "{0, 1938}"; + sepNavVisRect = "{{0, 0}, {691, 755}}"; + sepNavWindowFrame = "{{38, 418}, {750, 558}}"; + }; + }; + 089C165DFE840E0CC02AAC07 /* English */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {760, 1054}}"; + sepNavSelRange = "{136, 0}"; + sepNavVisRange = "{0, 265}"; + sepNavVisRect = "{{0, 0}, {707, 782}}"; + }; + }; + 29B97313FDCFA39411CA2CEA /* Project object */ = { + activeBuildConfigurationName = Development; + activeExecutable = 02BC7054050CE14900D77426 /* MidiKeys */; + activeTarget = 02BC7052050CE14900D77426 /* MidiKeys */; + addToTargets = ( + 02BC7052050CE14900D77426 /* MidiKeys */, + ); + breakpoints = ( + ); + codeSenseManager = 02BC7012050CE08C00D77426 /* Code sense */; + executables = ( + 02BC7054050CE14900D77426 /* MidiKeys */, + ); + perUserDictionary = { + "PBXConfiguration.PBXBreakpointsDataSource.v1:1CA1AED706398EBD00589147" = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXBreakpointsDataSource_BreakpointID; + PBXFileTableDataSourceColumnWidthsKey = ( + 20, + 20, + 198, + 20, + 99, + 99, + 29, + 20, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXBreakpointsDataSource_ActionID, + PBXBreakpointsDataSource_TypeID, + PBXBreakpointsDataSource_BreakpointID, + PBXBreakpointsDataSource_UseID, + PBXBreakpointsDataSource_LocationID, + PBXBreakpointsDataSource_ConditionID, + PBXBreakpointsDataSource_IgnoreCountID, + PBXBreakpointsDataSource_ContinueID, + ); + }; + PBXConfiguration.PBXFileTableDataSource3.PBXBookmarksDataSource = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXBookmarksDataSource_NameID; + PBXFileTableDataSourceColumnWidthsKey = ( + 200, + 200, + 392, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXBookmarksDataSource_LocationID, + PBXBookmarksDataSource_NameID, + PBXBookmarksDataSource_CommentsID, + ); + }; + PBXConfiguration.PBXFileTableDataSource3.PBXErrorsWarningsDataSource = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXErrorsWarningsDataSource_LocationID; + PBXFileTableDataSourceColumnWidthsKey = ( + 20, + 434, + 255, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXErrorsWarningsDataSource_TypeID, + PBXErrorsWarningsDataSource_MessageID, + PBXErrorsWarningsDataSource_LocationID, + ); + }; + PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; + PBXFileTableDataSourceColumnWidthsKey = ( + 20, + 540, + 20, + 90, + 43, + 43, + 20, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXFileDataSource_FiletypeID, + PBXFileDataSource_Filename_ColumnID, + PBXFileDataSource_Built_ColumnID, + PBXFileDataSource_ObjectSize_ColumnID, + PBXFileDataSource_Errors_ColumnID, + PBXFileDataSource_Warnings_ColumnID, + PBXFileDataSource_Target_ColumnID, + ); + }; + PBXConfiguration.PBXTargetDataSource.PBXTargetDataSource = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; + PBXFileTableDataSourceColumnWidthsKey = ( + 20, + 498, + 60, + 20, + 92, + 43, + 43, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXFileDataSource_FiletypeID, + PBXFileDataSource_Filename_ColumnID, + PBXTargetDataSource_PrimaryAttribute, + PBXFileDataSource_Built_ColumnID, + PBXFileDataSource_ObjectSize_ColumnID, + PBXFileDataSource_Errors_ColumnID, + PBXFileDataSource_Warnings_ColumnID, + ); + }; + PBXPerProjectTemplateStateSaveDate = 285900529; + PBXPrepackagedSmartGroups_v2 = ( + { + PBXTransientLocationAtTop = bottom; + absolutePathToBundle = ""; + activationKey = OldTargetSmartGroup; + clz = PBXTargetSmartGroup; + description = "Displays all targets of the project."; + globalID = 1C37FABC04509CD000000102; + name = Targets; + preferences = { + image = Targets; + }; + }, + { + PBXTransientLocationAtTop = bottom; + absolutePathToBundle = ""; + clz = PBXTargetSmartGroup2; + description = "Displays all targets of the project as well as nested build phases."; + globalID = 1C37FBAC04509CD000000102; + name = Targets; + preferences = { + image = Targets; + }; + }, + { + PBXTransientLocationAtTop = bottom; + absolutePathToBundle = ""; + clz = PBXExecutablesSmartGroup; + description = "Displays all executables of the project."; + globalID = 1C37FAAC04509CD000000102; + name = Executables; + preferences = { + image = Executable; + }; + }, + { + " PBXTransientLocationAtTop " = bottom; + absolutePathToBundle = ""; + clz = PBXErrorsWarningsSmartGroup; + description = "Displays files with errors or warnings."; + globalID = 1C08E77C0454961000C914BD; + name = "Errors and Warnings"; + preferences = { + fnmatch = ""; + image = WarningsErrors; + recursive = 1; + regex = ""; + root = ""; + }; + }, + { + PBXTransientLocationAtTop = bottom; + absolutePathToBundle = ""; + clz = PBXFilenameSmartGroup; + description = "Filters items in a given group (potentially recursively) based on matching the name with the regular expression of the filter."; + globalID = 1CC0EA4004350EF90044410B; + name = "Implementation Files"; + preferences = { + canSave = 1; + fnmatch = ""; + image = SmartFolder; + isLeaf = 0; + recursive = 1; + regex = "?*\\.[mcMC]"; + root = ""; + }; + }, + { + PBXTransientLocationAtTop = bottom; + absolutePathToBundle = ""; + clz = PBXFilenameSmartGroup; + description = "This group displays Interface Builder NIB Files."; + globalID = 1CC0EA4004350EF90041110B; + name = "NIB Files"; + preferences = { + canSave = 1; + fnmatch = "*.nib"; + image = SmartFolder; + isLeaf = 0; + recursive = 1; + regex = ""; + root = ""; + }; + }, + { + PBXTransientLocationAtTop = no; + absolutePathToBundle = ""; + clz = PBXFindSmartGroup; + description = "Displays Find Results."; + globalID = 1C37FABC05509CD000000102; + name = "Find Results"; + preferences = { + image = spyglass; + }; + }, + { + PBXTransientLocationAtTop = no; + absolutePathToBundle = ""; + clz = PBXBookmarksSmartGroup; + description = "Displays Project Bookmarks."; + globalID = 1C37FABC05539CD112110102; + name = Bookmarks; + preferences = { + image = Bookmarks; + }; + }, + { + PBXTransientLocationAtTop = bottom; + absolutePathToBundle = ""; + clz = XCSCMSmartGroup; + description = "Displays files with interesting SCM status."; + globalID = E2644B35053B69B200211256; + name = SCM; + preferences = { + image = PBXRepository; + isLeaf = 0; + }; + }, + { + PBXTransientLocationAtTop = bottom; + absolutePathToBundle = ""; + clz = PBXSymbolsSmartGroup; + description = "Displays all symbols for the project."; + globalID = 1C37FABC04509CD000100104; + name = "Project Symbols"; + preferences = { + image = ProjectSymbols; + isLeaf = 1; + }; + }, + { + PBXTransientLocationAtTop = bottom; + absolutePathToBundle = ""; + clz = PBXFilenameSmartGroup; + description = "Filters items in a given group (potentially recursively) based on matching the name with the regular expression of the filter."; + globalID = PBXTemplateMarker; + name = "Simple Filter SmartGroup"; + preferences = { + canSave = 1; + fnmatch = "*.nib"; + image = SmartFolder; + isLeaf = 0; + recursive = 1; + regex = ""; + root = ""; + }; + }, + { + PBXTransientLocationAtTop = bottom; + absolutePathToBundle = ""; + clz = PBXFilenameSmartGroup; + description = "Filters items in a given group (potentially recursively) based on matching the name with the regular expression of the filter."; + globalID = PBXTemplateMarker; + name = "Simple Regular Expression SmartGroup"; + preferences = { + canSave = 1; + fnmatch = ""; + image = SmartFolder; + isLeaf = 0; + recursive = 1; + regex = "?*\\.[mcMC]"; + root = ""; + }; + }, + ); + PBXWorkspaceContents = ( + { + PBXProjectWorkspaceModule_StateKey_Rev39 = { + PBXProjectWorkspaceModule_DEGV_Geometry = { + _collapsingFrameDimension = 0; + _indexOfCollapsedView = 0; + _percentageOfCollapsedView = 0; + isCollapsed = yes; + sizes = ( + "{{0, 0}, {773, 0}}", + "{{0, 0}, {773, 755}}", + ); + }; + PBXProjectWorkspaceModule_DataSourceSelectionKey_Rev6 = { + BoundsStr = "{{0, 0}, {758, 300}}"; + Rows = ( + 0, + ); + VisibleRectStr = "{{0, 0}, {0, 0}}"; + }; + PBXProjectWorkspaceModule_EditorOpen = true; + PBXProjectWorkspaceModule_EmbeddedNavigatorGroup = { + PBXSplitModuleInNavigatorKey = { + Split0 = { + bookmark = 0255685105D5F1DF002EA660; + history = ( + 0255684C05D5F1DF002EA660, + 0255684D05D5F1DF002EA660, + 0255684E05D5F1DF002EA660, + 0255684F05D5F1DF002EA660, + ); + prevStack = ( + 0255685005D5F1DF002EA660, + ); + }; + SplitCount = 1; + }; + }; + PBXProjectWorkspaceModule_GeometryKey_Rev15 = { + PBXProjectWorkspaceModule_SGTM_Geometry = { + _collapsingFrameDimension = 0; + _indexOfCollapsedView = 0; + _percentageOfCollapsedView = 0; + sizes = ( + "{{0, 0}, {254, 755}}", + "{{254, 0}, {773, 755}}", + ); + }; + }; + PBXProjectWorkspaceModule_OldDetailFrame = "{{0, 0}, {773, 0}}"; + PBXProjectWorkspaceModule_OldEditorFrame = "{{0, 0}, {773, 755}}"; + PBXProjectWorkspaceModule_OldSuperviewFrame = "{{254, 0}, {773, 755}}"; + PBXProjectWorkspaceModule_SGTM = { + PBXBottomSmartGroupGIDs = ( + 1C37FBAC04509CD000000102, + 1C37FAAC04509CD000000102, + 1C08E77C0454961000C914BD, + 1CC0EA4004350EF90044410B, + 1CC0EA4004350EF90041110B, + 1C37FABC05509CD000000102, + 1C37FABC05539CD112110102, + E2644B35053B69B200211256, + 1C37FABC04509CD000100104, + ); + PBXSmartGroupTreeModuleColumnData = { + PBXSmartGroupTreeModuleColumnWidthsKey = ( + 22, + 22, + 193, + ); + PBXSmartGroupTreeModuleColumnsKey_v4 = ( + SCMStatusColumn, + TargetStatusColumn, + MainColumn, + ); + }; + PBXSmartGroupTreeModuleOutlineStateKey_v7 = { + PBXSmartGroupTreeModuleOutlineStateExpansionKey = ( + 29B97314FDCFA39411CA2CEA, + 080E96DDFE201D6D7F000001, + 29B97317FDCFA39411CA2CEA, + 1C37FBAC04509CD000000102, + ); + PBXSmartGroupTreeModuleOutlineStateSelectionKey = ( + ( + 1, + 0, + ), + ); + PBXSmartGroupTreeModuleOutlineStateVisibleRectKey = "{{0, 0}, {237, 737}}"; + }; + PBXTopSmartGroupGIDs = ( + ); + }; + }; + }, + ); + "PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXBuildResultsModule" = { + }; + "PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXCVSModule" = { + }; + "PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXDebugCLIModule" = { + }; + "PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXDebugSessionModule" = { + Debugger = { + HorizontalSplitView = { + _collapsingFrameDimension = 0; + _indexOfCollapsedView = 0; + _percentageOfCollapsedView = 0; + isCollapsed = yes; + sizes = ( + "{{0, 0}, {343, 306}}", + "{{343, 0}, {571, 306}}", + ); + }; + VerticalSplitView = { + _collapsingFrameDimension = 0; + _indexOfCollapsedView = 0; + _percentageOfCollapsedView = 0; + isCollapsed = yes; + sizes = ( + "{{0, 0}, {914, 306}}", + "{{0, 306}, {914, 320}}", + ); + }; + }; + LauncherConfigVersion = 8; + }; + "PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXNavigatorGroup" = { + Split0 = { + bookmark = 02BC70EE050CE83400D77426; + history = ( + 02BC70E7050CE83300D77426, + 02BC70E8050CE83300D77426, + ); + prevStack = ( + 02BC70E9050CE83300D77426, + ); + }; + SplitCount = 1; + }; + "PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXProjectWorkspaceModule" = { + PBXProjectWorkspaceModule_StateKey_Rev39 = { + PBXProjectWorkspaceModule_DEGV_Geometry = { + _collapsingFrameDimension = 0; + _indexOfCollapsedView = 0; + _percentageOfCollapsedView = 0; + isCollapsed = yes; + sizes = ( + "{{0, 0}, {773, 0}}", + "{{0, 0}, {773, 755}}", + ); + }; + PBXProjectWorkspaceModule_DataSourceSelectionKey_Rev6 = { + BoundsStr = "{{0, 0}, {758, 705}}"; + Rows = ( + 0, + ); + VisibleRectStr = "{{0, 0}, {0, 0}}"; + }; + PBXProjectWorkspaceModule_EditorOpen = true; + PBXProjectWorkspaceModule_EmbeddedNavigatorGroup = { + PBXSplitModuleInNavigatorKey = { + Split0 = { + bookmark = 0255683605D5E87E002EA660; + history = ( + 0255683005D5E87E002EA660, + ); + }; + SplitCount = 1; + }; + }; + PBXProjectWorkspaceModule_GeometryKey_Rev15 = { + PBXProjectWorkspaceModule_SGTM_Geometry = { + _collapsingFrameDimension = 0; + _indexOfCollapsedView = 0; + _percentageOfCollapsedView = 0; + sizes = ( + "{{0, 0}, {254, 755}}", + "{{254, 0}, {773, 755}}", + ); + }; + }; + PBXProjectWorkspaceModule_OldDetailFrame = "{{0, 0}, {773, 0}}"; + PBXProjectWorkspaceModule_OldEditorFrame = "{{0, 0}, {773, 755}}"; + PBXProjectWorkspaceModule_OldSuperviewFrame = "{{254, 0}, {773, 755}}"; + PBXProjectWorkspaceModule_SGTM = { + PBXBottomSmartGroupGIDs = ( + 1C37FBAC04509CD000000102, + 1C37FAAC04509CD000000102, + 1C08E77C0454961000C914BD, + 1CC0EA4004350EF90044410B, + 1CC0EA4004350EF90041110B, + 1C37FABC05509CD000000102, + 1C37FABC05539CD112110102, + E2644B35053B69B200211256, + 1C37FABC04509CD000100104, + ); + PBXSmartGroupTreeModuleColumnData = { + PBXSmartGroupTreeModuleColumnWidthsKey = ( + 22, + 22, + 193, + ); + PBXSmartGroupTreeModuleColumnsKey_v4 = ( + SCMStatusColumn, + TargetStatusColumn, + MainColumn, + ); + }; + PBXSmartGroupTreeModuleOutlineStateKey_v7 = { + PBXSmartGroupTreeModuleOutlineStateExpansionKey = ( + 29B97314FDCFA39411CA2CEA, + 080E96DDFE201D6D7F000001, + ); + PBXSmartGroupTreeModuleOutlineStateSelectionKey = ( + ( + 0, + ), + ); + PBXSmartGroupTreeModuleOutlineStateVisibleRectKey = "{{0, 0}, {237, 737}}"; + }; + PBXTopSmartGroupGIDs = ( + ); + }; + }; + }; + "PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXRunSessionModule" = { + LauncherConfigVersion = 3; + Runner = { + HorizontalSplitView = { + _collapsingFrameDimension = 0; + _indexOfCollapsedView = 0; + _percentageOfCollapsedView = 0; + isCollapsed = yes; + sizes = ( + "{{0, 0}, {363, 167}}", + "{{0, 176}, {363, 267}}", + ); + }; + VerticalSplitView = { + _collapsingFrameDimension = 0; + _indexOfCollapsedView = 0; + _percentageOfCollapsedView = 0; + isCollapsed = yes; + sizes = ( + "{{0, 0}, {405, 443}}", + "{{414, 0}, {514, 443}}", + ); + }; + }; + }; + PBXWorkspaceGeometries = ( + { + Frame = "{{0, 0}, {1027, 755}}"; + PBXProjectWorkspaceModule_GeometryKey_Rev15 = { + PBXProjectWorkspaceModule_DebuggerWindowVisible = true; + }; + RubberWindowFrame = "10 35 1027 797 0 0 1280 832 "; + }, + ); + "PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXBuildResultsModule" = { + Frame = "{{0, 0}, {717, 260}}"; + PBXModuleWindowStatusBarHidden = YES; + RubberWindowFrame = "425 60 717 281 0 0 1280 832 "; + }; + "PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXCVSModule" = { + Frame = "{{0, 0}, {482, 276}}"; + RubberWindowFrame = "369 293 482 318 0 0 1280 832 "; + }; + "PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXDebugCLIModule" = { + Frame = "{{0, 0}, {400, 201}}"; + PBXModuleWindowStatusBarHidden = YES; + RubberWindowFrame = "50 804 400 222 0 0 1280 832 "; + }; + "PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXDebugSessionModule" = { + DebugConsoleDrawerSize = "{100, 120}"; + DebugConsoleVisible = None; + DebugConsoleWindowFrame = "{{200, 200}, {500, 300}}"; + DebugSTDIOWindowFrame = "{{200, 200}, {500, 300}}"; + Frame = "{{0, 0}, {914, 626}}"; + RubberWindowFrame = "85 164 914 668 0 0 1280 832 "; + }; + "PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXNavigatorGroup" = { + Frame = "{{0, 0}, {751, 626}}"; + WindowFrame = "{{463, 257}, {751, 704}}"; + }; + "PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXProjectWorkspaceModule" = { + Frame = "{{0, 0}, {1027, 755}}"; + PBXProjectWorkspaceModule_GeometryKey_Rev15 = { + }; + RubberWindowFrame = "10 35 1027 797 0 0 1280 832 "; + }; + "PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXRunSessionModule" = { + Frame = "{{0, 0}, {745, 443}}"; + PBXModuleWindowStatusBarHidden = YES; + RubberWindowFrame = "425 368 745 464 0 0 1280 832 "; + }; + PBXWorkspaceStateSaveDate = 285900529; + }; + perUserProjectItems = { + 028E8E970BE56775004B2132 = 028E8E970BE56775004B2132 /* PBXBookmark */; + 028E8E990BE56775004B2132 = 028E8E990BE56775004B2132 /* PBXBookmark */; + 029ECBC710E8466C003648D5 = 029ECBC710E8466C003648D5 /* PBXTextBookmark */; + 029ECBC810E8466C003648D5 = 029ECBC810E8466C003648D5 /* PBXTextBookmark */; + 029ECBC910E8466C003648D5 = 029ECBC910E8466C003648D5 /* PBXTextBookmark */; + 029ECBCA10E8466C003648D5 = 029ECBCA10E8466C003648D5 /* PBXTextBookmark */; + 029ECBEB10E8606C003648D5 = 029ECBEB10E8606C003648D5 /* PBXTextBookmark */; + 029ECBEC10E8606C003648D5 = 029ECBEC10E8606C003648D5 /* PBXTextBookmark */; + 029ECC0510E91D5E003648D5 = 029ECC0510E91D5E003648D5 /* PBXTextBookmark */; + 029ECC0710E91D5E003648D5 = 029ECC0710E91D5E003648D5 /* PBXTextBookmark */; + 029ECD2C10E95077003648D5 = 029ECD2C10E95077003648D5 /* PBXTextBookmark */; + 029ECD2E10E95077003648D5 = 029ECD2E10E95077003648D5 /* PBXTextBookmark */; + 029ECD3110E95077003648D5 = 029ECD3110E95077003648D5 /* PBXTextBookmark */; + 02BEF8F01078093F00A35020 = 02BEF8F01078093F00A35020 /* PBXTextBookmark */; + 02D60EB410EAFA9A00B7DF2F = 02D60EB410EAFA9A00B7DF2F /* PBXTextBookmark */; + 02D60EB610EAFA9A00B7DF2F = 02D60EB610EAFA9A00B7DF2F /* PBXTextBookmark */; + 02D60EB810EAFA9A00B7DF2F = 02D60EB810EAFA9A00B7DF2F /* PBXTextBookmark */; + 02D60EBC10EAFA9A00B7DF2F = 02D60EBC10EAFA9A00B7DF2F /* PBXTextBookmark */; + 02D60EC410EAFB4000B7DF2F = 02D60EC410EAFB4000B7DF2F /* PBXTextBookmark */; + 02D610AE10ED073F00B7DF2F = 02D610AE10ED073F00B7DF2F /* PBXTextBookmark */; + 02D6116710ED317400B7DF2F = 02D6116710ED317400B7DF2F /* PBXTextBookmark */; + 02D6116A10ED317400B7DF2F = 02D6116A10ED317400B7DF2F /* PBXTextBookmark */; + 02D6123410EE6C5700B7DF2F = 02D6123410EE6C5700B7DF2F /* PBXTextBookmark */; + 02D6123510EE6C5700B7DF2F = 02D6123510EE6C5700B7DF2F /* PBXTextBookmark */; + 02D6123610EE6C5700B7DF2F = 02D6123610EE6C5700B7DF2F /* PBXTextBookmark */; + 02D612C610EE9BEA00B7DF2F = 02D612C610EE9BEA00B7DF2F /* PBXTextBookmark */; + 02D612C710EE9BEA00B7DF2F = 02D612C710EE9BEA00B7DF2F /* PBXTextBookmark */; + 02D612FD10EFD5A200B7DF2F = 02D612FD10EFD5A200B7DF2F /* PBXTextBookmark */; + 02D6130010EFD5A200B7DF2F = 02D6130010EFD5A200B7DF2F /* PBXTextBookmark */; + 02D613CF11039EE800B7DF2F = 02D613CF11039EE800B7DF2F /* PBXTextBookmark */; + 02D613D011039EE800B7DF2F = 02D613D011039EE800B7DF2F /* PBXTextBookmark */; + 02D613D111039EE800B7DF2F = 02D613D111039EE800B7DF2F /* PBXTextBookmark */; + 02D613DF1103A01000B7DF2F = 02D613DF1103A01000B7DF2F /* PBXTextBookmark */; + 02D613FE1103DC7700B7DF2F = 02D613FE1103DC7700B7DF2F /* PBXTextBookmark */; + 02D614051103DE2A00B7DF2F = 02D614051103DE2A00B7DF2F /* PlistBookmark */; + 02D61566110A63C000B7DF2F = 02D61566110A63C000B7DF2F /* PBXTextBookmark */; + 02E534690C13570400CBD4A5 = 02E534690C13570400CBD4A5 /* PBXTextBookmark */; + 02E534AA0C1B30FC00CBD4A5 = 02E534AA0C1B30FC00CBD4A5 /* PBXTextBookmark */; + F5F8BC1103909790013BC55C = F5F8BC1103909790013BC55C /* AppController.m */; + }; + sourceControlManager = 02BC7011050CE08C00D77426 /* Source Control */; + userBookmarkGroup = F508BCF1036B4D0D01EFE74C /* PBXBookmarkGroup */; + userBuildSettings = { + }; + }; + F508BCF1036B4D0D01EFE74C /* PBXBookmarkGroup */ = { + isa = PBXBookmarkGroup; + children = ( + F508BD0E036B7DF001EFE74C /* PBXTextBookmark */, + ); + name = Root; + }; + F508BCF9036B5A4801EFE74C /* PreferencesController.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {760, 1054}}"; + sepNavSelRange = "{1151, 0}"; + sepNavVisRange = "{0, 1530}"; + sepNavVisRect = "{{0, 0}, {691, 755}}"; + }; + }; + F508BCFA036B5A4801EFE74C /* PreferencesController.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {863, 3354}}"; + sepNavSelRange = "{3285, 0}"; + sepNavVisRange = "{660, 2640}"; + sepNavVisRect = "{{0, 2157}, {691, 755}}"; + }; + }; + F508BD00036B5E0F01EFE74C /* KeyMaps.plist */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {686, 2953}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 0}, {595, 296}}"; + }; + }; + F508BD02036B620801EFE74C /* MidiKeyMap.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {745, 762}}"; + sepNavSelRange = "{1140, 17}"; + sepNavVisRange = "{0, 1165}"; + sepNavVisRect = "{{0, 0}, {691, 755}}"; + }; + }; + F508BD03036B620801EFE74C /* MidiKeyMap.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {760, 3835}}"; + sepNavSelRange = "{2841, 0}"; + sepNavVisRange = "{1517, 1921}"; + sepNavVisRect = "{{0, 1760}, {707, 782}}"; + }; + }; + F508BD06036B684A01EFE74C /* KeyMapManager.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {760, 1054}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{0, 594}"; + sepNavVisRect = "{{0, 0}, {691, 755}}"; + }; + }; + F508BD07036B684A01EFE74C /* KeyMapManager.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {760, 1508}}"; + sepNavSelRange = "{293, 0}"; + sepNavVisRange = "{0, 1744}"; + sepNavVisRect = "{{0, 0}, {595, 296}}"; + }; + }; + F508BD0A036B783D01EFE74C /* ColourDefaults.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {691, 755}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 0}, {691, 755}}"; + }; + }; + F508BD0B036B783D01EFE74C /* ColourDefaults.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {707, 761}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 0}, {707, 761}}"; + }; + }; + F508BD0E036B7DF001EFE74C /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = F508BCFA036B5A4801EFE74C /* PreferencesController.m */; + name = "PreferencesController.mm: 76"; + rLen = 0; + rLoc = 4163; + rType = 0; + vrLen = 1489; + vrLoc = 615; + }; + F546EC5F035D006C0199E6AF /* AppController.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {595, 1937}}"; + sepNavSelRange = "{2120, 20}"; + sepNavVisRange = "{2142, 32}"; + sepNavVisRect = "{{0, 238}, {691, 755}}"; + sepNavWindowFrame = "{{463, 174}, {751, 704}}"; + }; + }; + F546EC7D035D0D950199E6AF /* MidiKeyView.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {691, 1078}}"; + sepNavSelRange = "{865, 13}"; + sepNavVisRect = "{{0, 196}, {691, 755}}"; + }; + }; + F546EC7E035D0D950199E6AF /* MidiKeyView.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {772, 7176}}"; + sepNavSelRange = "{12555, 22}"; + sepNavVisRange = "{12131, 958}"; + sepNavVisRect = "{{0, 6460}, {691, 758}}"; + }; + }; + F5B7521E036765350140410E /* EndpointDefaults.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {691, 755}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 0}, {691, 755}}"; + }; + }; + F5B7521F036765350140410E /* EndpointDefaults.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {760, 1031}}"; + sepNavSelRange = "{818, 12}"; + sepNavVisRange = "{0, 1017}"; + sepNavVisRect = "{{0, 0}, {595, 296}}"; + }; + }; + F5BB863D036C79E401281FE2 /* MidiKeysApplication.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {760, 1054}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{0, 369}"; + sepNavVisRect = "{{0, 0}, {691, 755}}"; + }; + }; + F5BB863E036C79E401281FE2 /* MidiKeysApplication.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {760, 1054}}"; + sepNavSelRange = "{1368, 0}"; + sepNavVisRange = "{0, 1717}"; + sepNavVisRect = "{{0, 76}, {707, 761}}"; + }; + }; + F5C9F6B5036761780140410E /* main.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {711, 428}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 0}, {711, 428}}"; + }; + }; + F5D5FEF10371F1130140410E /* English */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {760, 1054}}"; + sepNavSelRange = "{476, 0}"; + sepNavVisRange = "{0, 1717}"; + sepNavVisRect = "{{0, 0}, {691, 755}}"; + }; + }; + F5D5FEF30371F1200140410E /* German */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {760, 1054}}"; + sepNavSelRange = "{2004, 0}"; + sepNavVisRange = "{0, 2004}"; + sepNavVisRect = "{{0, 0}, {691, 755}}"; + }; + }; + F5D5FEF40371F30D0140410E /* MidiParser.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {691, 755}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 0}, {691, 755}}"; + }; + }; + F5D5FEF50371F30D0140410E /* MidiParser.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {595, 2477}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 0}, {595, 296}}"; + }; + }; + F5D5FEF80371F4BC0140410E /* German */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {760, 1054}}"; + sepNavSelRange = "{226, 18}"; + sepNavVisRange = "{0, 273}"; + sepNavVisRect = "{{0, 0}, {685, 782}}"; + }; + }; + F5F8BC1103909790013BC55C /* AppController.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {760, 16562}}"; + sepNavSelRange = "{31789, 22}"; + sepNavVisRange = "{31666, 1746}"; + sepNavVisRect = "{{0, 11947}, {691, 761}}"; + sepNavWindowFrame = "{{15, -5}, {777, 878}}"; + }; + }; +} diff --git a/MidiKeys.xcodeproj/creed.perspective b/MidiKeys.xcodeproj/creed.perspective new file mode 100644 index 0000000..1d53065 --- /dev/null +++ b/MidiKeys.xcodeproj/creed.perspective @@ -0,0 +1,1449 @@ + + + + + ActivePerspectiveName + Build + AllowedModules + + + BundleLoadPath + + MaxInstances + n + Module + PBXSmartGroupTreeModule + Name + Groups and Files Outline View + + + BundleLoadPath + + MaxInstances + n + Module + PBXNavigatorGroup + Name + Editor + + + BundleLoadPath + + MaxInstances + n + Module + XCTaskListModule + Name + Task List + + + BundleLoadPath + + MaxInstances + n + Module + XCDetailModule + Name + File and Smart Group Detail Viewer + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXBuildResultsModule + Name + Detailed Build Results Viewer + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXProjectFindModule + Name + Project Batch Find Tool + + + BundleLoadPath + + MaxInstances + n + Module + PBXRunSessionModule + Name + Run Log + + + BundleLoadPath + + MaxInstances + n + Module + PBXBookmarksModule + Name + Bookmarks Tool + + + BundleLoadPath + + MaxInstances + n + Module + PBXClassBrowserModule + Name + Class Browser + + + BundleLoadPath + + MaxInstances + n + Module + PBXCVSModule + Name + Source Code Control Tool + + + BundleLoadPath + + MaxInstances + n + Module + PBXDebugBreakpointsModule + Name + Debug Breakpoints Tool + + + BundleLoadPath + + MaxInstances + n + Module + XCDockableInspector + Name + Inspector + + + BundleLoadPath + + MaxInstances + n + Module + PBXOpenQuicklyModule + Name + Open Quickly Tool + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXDebugSessionModule + Name + Debugger + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXDebugCLIModule + Name + Debug Console + + + Description + AIODescriptionKey + DockingSystemVisible + + Extension + perspective + FavBarConfig + + PBXProjectModuleGUID + 0293AF3B081FE3CD00947C5C + XCBarModuleItemNames + + XCBarModuleItems + + + FirstTimeWindowDisplayed + + Identifier + com.apple.perspectives.project.default + MajorVersion + 33 + MinorVersion + 0 + Name + All-In-One + Notifications + + OpenEditors + + PerspectiveWidths + + 932 + 932 + 932 + + Perspectives + + + ChosenToolbarItems + + XCToolbarPerspectiveControl + NSToolbarSeparatorItem + active-target-popup + action + NSToolbarFlexibleSpaceItem + buildOrClean + build-and-runOrDebug + com.apple.ide.PBXToolbarStopButton + get-info + toggle-editor + NSToolbarFlexibleSpaceItem + com.apple.pbx.toolbar.searchfield + + ControllerClassBaseName + + IconName + WindowOfProject + Identifier + perspective.project + IsVertical + + Layout + + + ContentConfiguration + + PBXBottomSmartGroupGIDs + + 1C37FBAC04509CD000000102 + 1C37FAAC04509CD000000102 + 1C08E77C0454961000C914BD + 1C37FABC05509CD000000102 + 1C37FABC05539CD112110102 + E2644B35053B69B200211256 + 1C37FABC04509CD000100104 + 1CC0EA4004350EF90044410B + 1CC0EA4004350EF90041110B + + PBXProjectModuleGUID + 1CA23ED40692098700951B8B + PBXProjectModuleLabel + Files + PBXProjectStructureProvided + yes + PBXSmartGroupTreeModuleColumnData + + PBXSmartGroupTreeModuleColumnWidthsKey + + 210 + + PBXSmartGroupTreeModuleColumnsKey_v4 + + MainColumn + + + PBXSmartGroupTreeModuleOutlineStateKey_v7 + + PBXSmartGroupTreeModuleOutlineStateExpansionKey + + 29B97314FDCFA39411CA2CEA + 080E96DDFE201D6D7F000001 + 29B97317FDCFA39411CA2CEA + 028FE9A503B6D8C1006ABE44 + 089C165CFE840E0CC02AAC07 + 1C37FBAC04509CD000000102 + 1C08E77C0454961000C914BD + + PBXSmartGroupTreeModuleOutlineStateSelectionKey + + + 52 + + + PBXSmartGroupTreeModuleOutlineStateVisibleRectKey + {{0, 0}, {210, 1084}} + + PBXTopSmartGroupGIDs + + XCIncludePerspectivesSwitch + + + GeometryConfiguration + + Frame + {{0, 0}, {227, 1102}} + GroupTreeTableConfiguration + + MainColumn + 210 + + + Module + PBXSmartGroupTreeModule + Proportion + 227pt + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 0293AF34081FE3CD00947C5C + PBXProjectModuleLabel + Credits.html + PBXSplitModuleInNavigatorKey + + Split0 + + PBXProjectModuleGUID + 0293AF35081FE3CD00947C5C + PBXProjectModuleLabel + Credits.html + _historyCapacity + 0 + bookmark + 0225C05208573DAC00B30E71 + history + + 0266CF360844F09300DE3050 + 0266CF400844F0F400DE3050 + 0266CF4C0844F1D000DE3050 + 0266CF4D0844F1D000DE3050 + 0266CF4E0844F1D000DE3050 + 0266CF4F0844F1D000DE3050 + 0266CF500844F1D000DE3050 + 0266CF620844F24900DE3050 + 0266CF630844F24900DE3050 + 0266CF640844F24900DE3050 + 0266CF650844F24900DE3050 + 0225C05008573C0400B30E71 + + prevStack + + 0266CF380844F09300DE3050 + 0266CF420844F0F400DE3050 + 0266CF520844F1D000DE3050 + 0266CF530844F1D000DE3050 + 0266CF540844F1D000DE3050 + 0266CF550844F1D000DE3050 + 0266CF560844F1D000DE3050 + 0266CF570844F1D000DE3050 + 0266CF680844F24900DE3050 + 0266CF690844F24900DE3050 + 0266CF6A0844F24900DE3050 + 0266CF6B0844F24900DE3050 + + + SplitCount + 1 + + StatusBarVisibility + + XCSharingToken + com.apple.Xcode.CommonNavigatorGroupSharingToken + + GeometryConfiguration + + Frame + {{0, 0}, {700, 768}} + + Module + PBXNavigatorGroup + Proportion + 768pt + + + Proportion + 329pt + Tabs + + + ContentConfiguration + + PBXProjectModuleGUID + 1CA23EDF0692099D00951B8B + PBXProjectModuleLabel + Detail + + GeometryConfiguration + + Frame + {{10, 27}, {700, 302}} + + Module + XCDetailModule + + + ContentConfiguration + + PBXProjectModuleGUID + 1CA23EE00692099D00951B8B + PBXProjectModuleLabel + Project Find + + GeometryConfiguration + + Frame + {{10, 31}, {603, 297}} + + Module + PBXProjectFindModule + + + ContentConfiguration + + PBXProjectModuleGUID + 1CA23EE10692099D00951B8B + PBXProjectModuleLabel + SCM Results + + GeometryConfiguration + + Frame + {{10, 31}, {603, 297}} + + Module + PBXCVSModule + + + + + Proportion + 700pt + + + Name + Project + ServiceClasses + + XCModuleDock + PBXSmartGroupTreeModule + XCModuleDock + PBXNavigatorGroup + XCDockableTabModule + XCDetailModule + PBXProjectFindModule + PBXCVSModule + + TableOfContents + + 0225C05308573DAC00B30E71 + 1CA23ED40692098700951B8B + 0225C05408573DAC00B30E71 + 0293AF34081FE3CD00947C5C + 0225C05508573DAC00B30E71 + 1CA23EDF0692099D00951B8B + 1CA23EE00692099D00951B8B + 1CA23EE10692099D00951B8B + + ToolbarConfiguration + xcode.toolbar.config.default + + + ChosenToolbarItems + + XCToolbarPerspectiveControl + NSToolbarSeparatorItem + active-target-popup + active-executable-popup + active-buildstyle-popup + NSToolbarFlexibleSpaceItem + build + clean + NSToolbarSeparatorItem + run + debug + + ControllerClassBaseName + + IconName + BuildTabIcon + Identifier + perspective.build + IsVertical + + Layout + + + ContentConfiguration + + PBXBottomSmartGroupGIDs + + PBXProjectModuleGUID + 1CA23EE50692099D00951B8B + PBXProjectModuleLabel + Files + PBXProjectStructureProvided + yes + PBXSmartGroupTreeModuleColumnData + + PBXSmartGroupTreeModuleColumnWidthsKey + + 184 + + PBXSmartGroupTreeModuleColumnsKey_v4 + + MainColumn + + + PBXSmartGroupTreeModuleOutlineStateKey_v7 + + PBXSmartGroupTreeModuleOutlineStateExpansionKey + + PBXSmartGroupTreeModuleOutlineStateSelectionKey + + + 0 + + + PBXSmartGroupTreeModuleOutlineStateVisibleRectKey + {{0, 0}, {184, 1084}} + + PBXTopSmartGroupGIDs + + XCIncludePerspectivesSwitch + + + GeometryConfiguration + + Frame + {{0, 0}, {201, 1102}} + GroupTreeTableConfiguration + + MainColumn + 184 + + RubberWindowFrame + 225 35 932 1143 0 0 1600 1178 + + Module + PBXSmartGroupTreeModule + Proportion + 201pt + + + Dock + + + BecomeActive + + ContentConfiguration + + PBXProjectModuleGUID + 0293AF34081FE3CD00947C5C + PBXProjectModuleLabel + Credits.html + PBXSplitModuleInNavigatorKey + + Split0 + + PBXProjectModuleGUID + 0293AF35081FE3CD00947C5C + PBXProjectModuleLabel + Credits.html + _historyCapacity + 0 + bookmark + 0225C05608573DAC00B30E71 + history + + 0266CF3B0844F09400DE3050 + 0266CF450844F0F400DE3050 + 0266CF4C0844F1D000DE3050 + 0266CF4D0844F1D000DE3050 + 0266CF4E0844F1D000DE3050 + 0266CF4F0844F1D000DE3050 + 0266CF500844F1D000DE3050 + 0266CF630844F24900DE3050 + 0266CF640844F24900DE3050 + 0266CF650844F24900DE3050 + 0266CF6F0844F24900DE3050 + 0225C05108573C1000B30E71 + + prevStack + + 0266CF380844F09300DE3050 + 0266CF420844F0F400DE3050 + 0266CF520844F1D000DE3050 + 0266CF530844F1D000DE3050 + 0266CF540844F1D000DE3050 + 0266CF550844F1D000DE3050 + 0266CF560844F1D000DE3050 + 0266CF570844F1D000DE3050 + 0266CF680844F24900DE3050 + 0266CF690844F24900DE3050 + 0266CF6A0844F24900DE3050 + 0266CF6B0844F24900DE3050 + + + SplitCount + 1 + + StatusBarVisibility + + XCSharingToken + com.apple.Xcode.CommonNavigatorGroupSharingToken + + GeometryConfiguration + + Frame + {{0, 0}, {726, 455}} + RubberWindowFrame + 225 35 932 1143 0 0 1600 1178 + + Module + PBXNavigatorGroup + Proportion + 455pt + + + Proportion + 642pt + Tabs + + + ContentConfiguration + + PBXBuildLogShowsTranscriptDefaultKey + {{0, 438}, {726, 177}} + PBXProjectModuleGUID + XCMainBuildResultsModuleGUID + PBXProjectModuleLabel + Build + XCBuildResultsTrigger_Collapse + 1021 + XCBuildResultsTrigger_Open + 1011 + + GeometryConfiguration + + Frame + {{10, 27}, {726, 615}} + RubberWindowFrame + 225 35 932 1143 0 0 1600 1178 + + Module + PBXBuildResultsModule + + + ContentConfiguration + + LauncherConfigVersion + 3 + PBXProjectModuleGUID + 1CA23EE80692099D00951B8B + PBXProjectModuleLabel + Run + Runner + + HorizontalSplitView + + _collapsingFrameDimension + 0.0 + _indexOfCollapsedView + 0 + _percentageOfCollapsedView + 0.0 + isCollapsed + yes + sizes + + {{0, 0}, {367, 168}} + {{0, 173}, {367, 270}} + + + VerticalSplitView + + _collapsingFrameDimension + 0.0 + _indexOfCollapsedView + 0 + _percentageOfCollapsedView + 0.0 + isCollapsed + yes + sizes + + {{0, 0}, {406, 443}} + {{411, 0}, {517, 443}} + + + + + GeometryConfiguration + + Frame + {{10, 27}, {726, 416}} + + Module + PBXRunSessionModule + + + + + Proportion + 726pt + + + Name + Build + ServiceClasses + + XCModuleDock + PBXSmartGroupTreeModule + XCModuleDock + PBXNavigatorGroup + XCDockableTabModule + PBXBuildResultsModule + PBXRunSessionModule + XCConsole + + TableOfContents + + 0225C05708573DAC00B30E71 + 1CA23EE50692099D00951B8B + 0225C05808573DAC00B30E71 + 0293AF34081FE3CD00947C5C + 0225C05908573DAC00B30E71 + XCMainBuildResultsModuleGUID + 1CA23EE80692099D00951B8B + 0225C05A08573DAC00B30E71 + + ToolbarConfiguration + xcode.toolbar.config.buildAndRun + + + ChosenToolbarItems + + XCToolbarPerspectiveControl + NSToolbarSeparatorItem + build-and-debug + debug + NSToolbarFlexibleSpaceItem + debugger-fix-and-continue + debugger-restart-executable + debugger-pause + debugger-continue + debugger-step-over + debugger-step-into + debugger-step-out + debugger-step-instruction + NSToolbarFlexibleSpaceItem + + ControllerClassBaseName + PBXDebugSessionModule + IconName + DebugTabIcon + Identifier + perspective.debug + IsVertical + 1 + Layout + + + ContentConfiguration + + PBXProjectModuleGUID + 1CCC7628064C1048000F2A68 + PBXProjectModuleLabel + Debugger Console + + GeometryConfiguration + + Frame + {{0, 0}, {810, 0}} + + Module + PBXDebugCLIModule + Proportion + 0% + + + ContentConfiguration + + Debugger + + HorizontalSplitView + + _collapsingFrameDimension + 0.0 + _indexOfCollapsedView + 0 + _percentageOfCollapsedView + 0.0 + isCollapsed + yes + sizes + + {{0, 0}, {395, 213}} + {{395, 0}, {415, 213}} + + + VerticalSplitView + + _collapsingFrameDimension + 0.0 + _indexOfCollapsedView + 0 + _percentageOfCollapsedView + 0.0 + isCollapsed + yes + sizes + + {{0, 0}, {810, 213}} + {{0, 213}, {810, 225}} + + + + LauncherConfigVersion + 8 + PBXProjectModuleGUID + 1CCC7629064C1048000F2A68 + PBXProjectModuleLabel + Debug + + GeometryConfiguration + + DebugConsoleDrawerSize + {100, 120} + DebugConsoleVisible + None + DebugConsoleWindowFrame + {{200, 200}, {500, 300}} + DebugSTDIOWindowFrame + {{200, 200}, {500, 300}} + Frame + {{0, 7}, {810, 438}} + + Module + PBXDebugSessionModule + Proportion + 443pt + + + Name + Debug + ServiceClasses + + XCModuleDock + XCModuleDock + PBXDebugCLIModule + PBXDebugSessionModule + XCConsole + + TableOfContents + + 1CC8E6A5069209BD00BB180A + 1CC8E6A6069209BD00BB180A + 1CCC7628064C1048000F2A68 + 1CCC7629064C1048000F2A68 + 1CC8E6A7069209BD00BB180A + + ToolbarConfiguration + xcode.toolbar.config.debug + + + PerspectivesBarVisible + + ShelfIsVisible + + SourceDescription + file at '/System/Library/PrivateFrameworks/DevToolsInterface.framework/Versions/A/Resources/XCPerspectivesSpecification.xcperspec' + StatusbarIsVisible + + TimeStamp + 0.0 + ToolbarDisplayMode + 2 + ToolbarIsVisible + + ToolbarSizeMode + 2 + Type + Perspectives + UpdateMessage + + WindowJustification + 5 + WindowOrderList + + /Users/creed/projects/MidiKeys/MidiKeys.xcodeproj + + WindowString + 225 35 932 1143 0 0 1600 1178 + WindowTools + + + Identifier + windowTool.find + Layout + + + Dock + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1CDD528C0622207200134675 + PBXProjectModuleLabel + <No Editor> + PBXSplitModuleInNavigatorKey + + Split0 + + PBXProjectModuleGUID + 1CD0528D0623707200166675 + + SplitCount + 1 + + StatusBarVisibility + 1 + + GeometryConfiguration + + Frame + {{0, 0}, {781, 167}} + RubberWindowFrame + 62 385 781 470 0 0 1440 878 + + Module + PBXNavigatorGroup + Proportion + 781pt + + + Proportion + 50% + + + BecomeActive + 1 + ContentConfiguration + + PBXProjectModuleGUID + 1CD0528E0623707200166675 + PBXProjectModuleLabel + Project Find + + GeometryConfiguration + + Frame + {{8, 0}, {773, 254}} + RubberWindowFrame + 62 385 781 470 0 0 1440 878 + + Module + PBXProjectFindModule + Proportion + 50% + + + Proportion + 428pt + + + Name + Project Find + ServiceClasses + + PBXProjectFindModule + + StatusbarIsVisible + 1 + TableOfContents + + 1C530D57069F1CE1000CFCEE + 1C530D58069F1CE1000CFCEE + 1C530D59069F1CE1000CFCEE + 1CDD528C0622207200134675 + 1C530D5A069F1CE1000CFCEE + 1CE0B1FE06471DED0097A5F4 + 1CD0528E0623707200166675 + + WindowString + 62 385 781 470 0 0 1440 878 + WindowToolGUID + 1C530D57069F1CE1000CFCEE + WindowToolIsVisible + 0 + + + Identifier + windowTool.run + Layout + + + Dock + + + ContentConfiguration + + LauncherConfigVersion + 3 + PBXProjectModuleGUID + 1CD0528B0623707200166675 + PBXProjectModuleLabel + Run - cocoapp112 - cocoapp112 + Runner + + HorizontalSplitView + + _collapsingFrameDimension + 0.0 + _indexOfCollapsedView + 0 + _percentageOfCollapsedView + 0.0 + isCollapsed + yes + sizes + + {{0, 0}, {365, 167}} + {{0, 176}, {365, 267}} + + + VerticalSplitView + + _collapsingFrameDimension + 0.0 + _indexOfCollapsedView + 0 + _percentageOfCollapsedView + 0.0 + isCollapsed + yes + sizes + + {{0, 0}, {405, 443}} + {{414, 0}, {514, 443}} + + + + + GeometryConfiguration + + Frame + {{0, 0}, {456, 192}} + RubberWindowFrame + 741 130 456 234 0 0 1280 1002 + + Module + PBXRunSessionModule + Proportion + 192pt + + + Proportion + 192pt + + + Name + Run Log + ServiceClasses + + PBXRunSessionModule + + StatusbarIsVisible + 1 + TableOfContents + + 1C78EAAF065D492600B07095 + 1C78EAB0065D492600B07095 + 1CD0528B0623707200166675 + 1C78EAB1065D492600B07095 + + ToolbarConfiguration + xcode.toolbar.config.run + WindowString + 741 130 456 234 0 0 1280 1002 + + + Identifier + windowTool.scm + Layout + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1C78EAB2065D492600B07095 + PBXProjectModuleLabel + <No Editor> + PBXSplitModuleInNavigatorKey + + Split0 + + PBXProjectModuleGUID + 1C78EAB3065D492600B07095 + + SplitCount + 1 + + StatusBarVisibility + 1 + + GeometryConfiguration + + Frame + {{0, 0}, {452, 0}} + RubberWindowFrame + 743 379 452 308 0 0 1280 1002 + + Module + PBXNavigatorGroup + Proportion + 0pt + + + BecomeActive + 1 + ContentConfiguration + + PBXProjectModuleGUID + 1CD052920623707200166675 + PBXProjectModuleLabel + SCM + + GeometryConfiguration + + ConsoleFrame + {{0, 259}, {452, 0}} + Frame + {{0, 7}, {452, 259}} + RubberWindowFrame + 743 379 452 308 0 0 1280 1002 + TableConfiguration + + Status + 30 + FileName + 199 + Path + 197.09500122070312 + + TableFrame + {{0, 0}, {452, 250}} + + Module + PBXCVSModule + Proportion + 262pt + + + Proportion + 266pt + + + Name + SCM + ServiceClasses + + PBXCVSModule + + StatusbarIsVisible + 1 + TableOfContents + + 1C78EAB4065D492600B07095 + 1C78EAB5065D492600B07095 + 1C78EAB2065D492600B07095 + 1CD052920623707200166675 + + ToolbarConfiguration + xcode.toolbar.config.scm + WindowString + 743 379 452 308 0 0 1280 1002 + + + Identifier + windowTool.breakpoints + IsVertical + + Layout + + + Dock + + + BecomeActive + + ContentConfiguration + + PBXBottomSmartGroupGIDs + + 1C77FABC04509CD000000102 + + PBXProjectModuleGUID + 1CE0B1FE06471DED0097A5F4 + PBXProjectModuleLabel + Files + PBXProjectStructureProvided + no + PBXSmartGroupTreeModuleColumnData + + PBXSmartGroupTreeModuleColumnWidthsKey + + 168 + + PBXSmartGroupTreeModuleColumnsKey_v4 + + MainColumn + + + PBXSmartGroupTreeModuleOutlineStateKey_v7 + + PBXSmartGroupTreeModuleOutlineStateExpansionKey + + 1C77FABC04509CD000000102 + + PBXSmartGroupTreeModuleOutlineStateSelectionKey + + + 0 + + + PBXSmartGroupTreeModuleOutlineStateVisibleRectKey + {{0, 0}, {168, 350}} + + PBXTopSmartGroupGIDs + + XCIncludePerspectivesSwitch + + + GeometryConfiguration + + Frame + {{0, 0}, {185, 368}} + GroupTreeTableConfiguration + + MainColumn + 168 + + RubberWindowFrame + 315 424 744 409 0 0 1440 878 + + Module + PBXSmartGroupTreeModule + Proportion + 185pt + + + ContentConfiguration + + PBXProjectModuleGUID + 1CA1AED706398EBD00589147 + PBXProjectModuleLabel + Detail + + GeometryConfiguration + + Frame + {{190, 0}, {554, 368}} + RubberWindowFrame + 315 424 744 409 0 0 1440 878 + + Module + XCDetailModule + Proportion + 554pt + + + Proportion + 368pt + + + MajorVersion + 2 + MinorVersion + 0 + Name + Breakpoints + ServiceClasses + + PBXSmartGroupTreeModule + XCDetailModule + + StatusbarIsVisible + + TableOfContents + + 1CDDB66807F98D9800BB5817 + 1CDDB66907F98D9800BB5817 + 1CE0B1FE06471DED0097A5F4 + 1CA1AED706398EBD00589147 + + ToolbarConfiguration + xcode.toolbar.config.breakpoints + WindowString + 315 424 744 409 0 0 1440 878 + WindowToolGUID + 1CDDB66807F98D9800BB5817 + WindowToolIsVisible + + + + Identifier + windowTool.debugAnimator + Layout + + + Dock + + + Module + PBXNavigatorGroup + Proportion + 100% + + + Proportion + 100% + + + Name + Debug Visualizer + ServiceClasses + + PBXNavigatorGroup + + StatusbarIsVisible + + ToolbarConfiguration + xcode.toolbar.config.debugAnimator + WindowString + 100 100 700 500 0 0 1280 1002 + + + Identifier + windowTool.bookmarks + Layout + + + Dock + + + Module + PBXBookmarksModule + Proportion + 166pt + + + Proportion + 166pt + + + Name + Bookmarks + ServiceClasses + + PBXBookmarksModule + + StatusbarIsVisible + 0 + WindowString + 538 42 401 187 0 0 1280 1002 + + + Identifier + windowTool.classBrowser + Layout + + + Dock + + + BecomeActive + 1 + ContentConfiguration + + OptionsSetName + Hierarchy, all classes + PBXProjectModuleGUID + 1CA6456E063B45B4001379D8 + PBXProjectModuleLabel + Class Browser - NSObject + + GeometryConfiguration + + ClassesFrame + {{0, 0}, {369, 96}} + ClassesTreeTableConfiguration + + PBXClassNameColumnIdentifier + 208 + PBXClassBookColumnIdentifier + 22 + + Frame + {{0, 0}, {616, 353}} + MembersFrame + {{0, 105}, {369, 395}} + MembersTreeTableConfiguration + + PBXMemberTypeIconColumnIdentifier + 22 + PBXMemberNameColumnIdentifier + 216 + PBXMemberTypeColumnIdentifier + 94 + PBXMemberBookColumnIdentifier + 22 + + PBXModuleWindowStatusBarHidden2 + 1 + RubberWindowFrame + 597 125 616 374 0 0 1280 1002 + + Module + PBXClassBrowserModule + Proportion + 354pt + + + Proportion + 354pt + + + Name + Class Browser + ServiceClasses + + PBXClassBrowserModule + + StatusbarIsVisible + 0 + TableOfContents + + 1C78EABA065D492600B07095 + 1C78EABB065D492600B07095 + 1CA6456E063B45B4001379D8 + + ToolbarConfiguration + xcode.toolbar.config.classbrowser + WindowString + 597 125 616 374 0 0 1280 1002 + + + + diff --git a/MidiKeys.xcodeproj/project.pbxproj b/MidiKeys.xcodeproj/project.pbxproj new file mode 100644 index 0000000..52a6495 --- /dev/null +++ b/MidiKeys.xcodeproj/project.pbxproj @@ -0,0 +1,570 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 029ECAD410E7DB9C003648D5 /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 029ECAD310E7DB9C003648D5 /* Sparkle.framework */; }; + 029ECAE210E7DBAD003648D5 /* Sparkle.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 029ECAD310E7DB9C003648D5 /* Sparkle.framework */; }; + 029ECAEA10E7DCCC003648D5 /* dsa_pub.pem in Resources */ = {isa = PBXBuildFile; fileRef = 029ECAE910E7DCCC003648D5 /* dsa_pub.pem */; }; + 029ECBB110E8440B003648D5 /* Preferences.xib in Resources */ = {isa = PBXBuildFile; fileRef = 029ECBAF10E842FD003648D5 /* Preferences.xib */; }; + 029ECBC510E84636003648D5 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 029ECBBD10E845B5003648D5 /* MainMenu.xib */; }; + 029ECDB210E95822003648D5 /* Quartz.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 029ECDB110E95822003648D5 /* Quartz.framework */; }; + 02BC7055050CE73B00D77426 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = F5C9F6B5036761780140410E /* main.m */; }; + 02BC7059050CE73F00D77426 /* AppController.m in Sources */ = {isa = PBXBuildFile; fileRef = F5F8BC1103909790013BC55C /* AppController.m */; }; + 02BC705B050CE74000D77426 /* ColourDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = F508BD0B036B783D01EFE74C /* ColourDefaults.m */; }; + 02BC705D050CE74100D77426 /* EndpointDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = F5B7521F036765350140410E /* EndpointDefaults.m */; }; + 02BC705F050CE74200D77426 /* KeyMapManager.m in Sources */ = {isa = PBXBuildFile; fileRef = F508BD07036B684A01EFE74C /* KeyMapManager.m */; }; + 02BC7061050CE74300D77426 /* MidiKeyMap.m in Sources */ = {isa = PBXBuildFile; fileRef = F508BD03036B620801EFE74C /* MidiKeyMap.m */; }; + 02BC7063050CE74400D77426 /* MidiKeysApplication.m in Sources */ = {isa = PBXBuildFile; fileRef = F5BB863E036C79E401281FE2 /* MidiKeysApplication.m */; }; + 02BC7065050CE74500D77426 /* MidiKeyView.m in Sources */ = {isa = PBXBuildFile; fileRef = F546EC7E035D0D950199E6AF /* MidiKeyView.m */; }; + 02BC7067050CE74600D77426 /* MidiParser.m in Sources */ = {isa = PBXBuildFile; fileRef = F5D5FEF50371F30D0140410E /* MidiParser.m */; }; + 02BC7069050CE74700D77426 /* OverlayIndicator.m in Sources */ = {isa = PBXBuildFile; fileRef = 02AEA56204A00671003989A9 /* OverlayIndicator.m */; }; + 02BC706B050CE74800D77426 /* PreferencesController.m in Sources */ = {isa = PBXBuildFile; fileRef = F508BCFA036B5A4801EFE74C /* PreferencesController.m */; }; + 02BC706C050CE74B00D77426 /* Credits.html in Resources */ = {isa = PBXBuildFile; fileRef = 028FE9A503B6D8C1006ABE44 /* Credits.html */; }; + 02BC706D050CE74C00D77426 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; }; + 02BC706E050CE74D00D77426 /* KeyMapNames.strings in Resources */ = {isa = PBXBuildFile; fileRef = F5D503210371FB6A0140410E /* KeyMapNames.strings */; }; + 02BC706F050CE74D00D77426 /* KeyMaps.plist in Resources */ = {isa = PBXBuildFile; fileRef = F508BD00036B5E0F01EFE74C /* KeyMaps.plist */; }; + 02BC7070050CE74D00D77426 /* LiesMich.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 02BD73A8044E6A7B000C9424 /* LiesMich.rtf */; }; + 02BC7071050CE74E00D77426 /* Lisez-Moi.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 02BD73A9044E6A7B000C9424 /* Lisez-Moi.rtf */; }; + 02BC7072050CE74E00D77426 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = F5D5FEF00371F1130140410E /* Localizable.strings */; }; + 02BC7074050CE75000D77426 /* MidiKeys.icns in Resources */ = {isa = PBXBuildFile; fileRef = F5B75228036773F30140410E /* MidiKeys.icns */; }; + 02BC7075050CE75000D77426 /* Octave.png in Resources */ = {isa = PBXBuildFile; fileRef = F551D3FD03621A310101F9C2 /* Octave.png */; }; + 02BC7076050CE75000D77426 /* OctaveDown.png in Resources */ = {isa = PBXBuildFile; fileRef = 02BFAFAC03EDEA94000CADE3 /* OctaveDown.png */; }; + 02BC7077050CE75100D77426 /* OctaveUp.png in Resources */ = {isa = PBXBuildFile; fileRef = 02BFAFAD03EDEA94000CADE3 /* OctaveUp.png */; }; + 02BC7079050CE75200D77426 /* ReadMe (Japanese).rtf in Resources */ = {isa = PBXBuildFile; fileRef = 02BD73AA044E6A7B000C9424 /* ReadMe (Japanese).rtf */; }; + 02BC707A050CE75300D77426 /* ReadMe.rtf in Resources */ = {isa = PBXBuildFile; fileRef = F58735E2C5B04BC501FD2FC7 /* ReadMe.rtf */; }; + 02BC70F0050CE8EB00D77426 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F527A938036C845101ACC053 /* Carbon.framework */; }; + 02BC7184050CE8EB00D77426 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; + 02BC7188050CE8EC00D77426 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F546ED0A035D17E50199E6AF /* CoreAudio.framework */; }; + 02BC7190050CE8EC00D77426 /* CoreMIDI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F546EC63035D01E20199E6AF /* CoreMIDI.framework */; }; + 02D6110210ED232600B7DF2F /* SRCommon.m in Sources */ = {isa = PBXBuildFile; fileRef = 02D610F910ED232600B7DF2F /* SRCommon.m */; }; + 02D6110310ED232600B7DF2F /* SRKeyCodeTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 02D610FB10ED232600B7DF2F /* SRKeyCodeTransformer.m */; }; + 02D6110410ED232600B7DF2F /* SRRecorderCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 02D610FD10ED232600B7DF2F /* SRRecorderCell.m */; }; + 02D6110510ED232600B7DF2F /* SRRecorderControl.m in Sources */ = {isa = PBXBuildFile; fileRef = 02D610FF10ED232600B7DF2F /* SRRecorderControl.m */; }; + 02D6110610ED232600B7DF2F /* SRValidator.m in Sources */ = {isa = PBXBuildFile; fileRef = 02D6110110ED232600B7DF2F /* SRValidator.m */; }; + 02E533C90C122A2800CBD4A5 /* CTGradient.m in Sources */ = {isa = PBXBuildFile; fileRef = 02E533C30C122A2800CBD4A5 /* CTGradient.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 027CBF610FFE9E7E0038B96A /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 029ECAE210E7DBAD003648D5 /* Sparkle.framework in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 020631DF03EA0C5800488331 /* French */ = {isa = PBXFileReference; lastKnownFileType = text.html; name = French; path = French.lproj/Credits.html; sourceTree = ""; }; + 020631E003EA0C5800488331 /* French */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = French; path = French.lproj/InfoPlist.strings; sourceTree = ""; }; + 020631E103EA0C5800488331 /* French */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = French; path = French.lproj/KeyMapNames.strings; sourceTree = ""; }; + 020631E203EA0C5800488331 /* French */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = French; path = French.lproj/Localizable.strings; sourceTree = ""; }; + 020D980E03EB1FDE0031FAE0 /* Japanese */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Japanese; path = Japanese.lproj/InfoPlist.strings; sourceTree = ""; }; + 020D980F03EB1FDE0031FAE0 /* Japanese */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Japanese; path = Japanese.lproj/KeyMapNames.strings; sourceTree = ""; }; + 020D981003EB1FDE0031FAE0 /* Japanese */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Japanese; path = Japanese.lproj/Localizable.strings; sourceTree = ""; }; + 0255683705D5E8B2002EA660 /* MidiKeys-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "MidiKeys-Info.plist"; sourceTree = ""; }; + 028FE9A303B6D8B5006ABE44 /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; name = English; path = English.lproj/Credits.html; sourceTree = ""; }; + 028FE9A703B6D8DC006ABE44 /* German */ = {isa = PBXFileReference; lastKnownFileType = text.html; name = German; path = German.lproj/Credits.html; sourceTree = ""; }; + 028FE9A803B6DA6C006ABE44 /* MidiKeys_Prefix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MidiKeys_Prefix.h; sourceTree = ""; }; + 029ECAD310E7DB9C003648D5 /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Sparkle.framework; sourceTree = ""; }; + 029ECAE910E7DCCC003648D5 /* dsa_pub.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = dsa_pub.pem; sourceTree = ""; }; + 029ECBB010E842FD003648D5 /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = English; path = English.lproj/Preferences.xib; sourceTree = ""; }; + 029ECBBE10E845B5003648D5 /* German */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = German; path = German.lproj/MainMenu.xib; sourceTree = ""; }; + 029ECBC010E845CB003648D5 /* French */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = French; path = French.lproj/MainMenu.xib; sourceTree = ""; }; + 029ECBC210E845DD003648D5 /* Japanese */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Japanese; path = Japanese.lproj/MainMenu.xib; sourceTree = ""; }; + 029ECBC410E845EF003648D5 /* Spanish */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Spanish; path = Spanish.lproj/MainMenu.xib; sourceTree = ""; }; + 029ECBC610E84656003648D5 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/MainMenu.xib; sourceTree = ""; }; + 029ECBCD10E846C9003648D5 /* German */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = German; path = German.lproj/Preferences.xib; sourceTree = ""; }; + 029ECBCE10E846F9003648D5 /* French */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = French; path = French.lproj/Preferences.xib; sourceTree = ""; }; + 029ECBCF10E84877003648D5 /* Japanese */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Japanese; path = Japanese.lproj/Preferences.xib; sourceTree = ""; }; + 029ECBD010E8488F003648D5 /* Spanish */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Spanish; path = Spanish.lproj/Preferences.xib; sourceTree = ""; }; + 029ECDB110E95822003648D5 /* Quartz.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quartz.framework; path = /System/Library/Frameworks/Quartz.framework; sourceTree = ""; }; + 02AEA56104A00671003989A9 /* OverlayIndicator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OverlayIndicator.h; sourceTree = ""; }; + 02AEA56204A00671003989A9 /* OverlayIndicator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OverlayIndicator.m; sourceTree = ""; }; + 02BC7053050CE14900D77426 /* MidiKeys.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MidiKeys.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 02BD73A2044E69CF000C9424 /* Spanish */ = {isa = PBXFileReference; lastKnownFileType = text.html; name = Spanish; path = Spanish.lproj/Credits.html; sourceTree = ""; }; + 02BD73A5044E6A0D000C9424 /* Spanish */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Spanish; path = Spanish.lproj/Localizable.strings; sourceTree = ""; }; + 02BD73A6044E6A20000C9424 /* Spanish */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Spanish; path = Spanish.lproj/KeyMapNames.strings; sourceTree = ""; }; + 02BD73A7044E6A2A000C9424 /* Spanish */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Spanish; path = Spanish.lproj/InfoPlist.strings; sourceTree = ""; }; + 02BD73A8044E6A7B000C9424 /* LiesMich.rtf */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; path = LiesMich.rtf; sourceTree = ""; }; + 02BD73A9044E6A7B000C9424 /* Lisez-Moi.rtf */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; path = "Lisez-Moi.rtf"; sourceTree = ""; }; + 02BD73AA044E6A7B000C9424 /* ReadMe (Japanese).rtf */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; path = "ReadMe (Japanese).rtf"; sourceTree = ""; }; + 02BD73AE044E6A97000C9424 /* Version history.rtf */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; path = "Version history.rtf"; sourceTree = ""; }; + 02BFAFAC03EDEA94000CADE3 /* OctaveDown.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = OctaveDown.png; sourceTree = ""; }; + 02BFAFAD03EDEA94000CADE3 /* OctaveUp.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = OctaveUp.png; sourceTree = ""; }; + 02D610F810ED232600B7DF2F /* SRCommon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SRCommon.h; sourceTree = ""; }; + 02D610F910ED232600B7DF2F /* SRCommon.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SRCommon.m; sourceTree = ""; }; + 02D610FA10ED232600B7DF2F /* SRKeyCodeTransformer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SRKeyCodeTransformer.h; sourceTree = ""; }; + 02D610FB10ED232600B7DF2F /* SRKeyCodeTransformer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SRKeyCodeTransformer.m; sourceTree = ""; }; + 02D610FC10ED232600B7DF2F /* SRRecorderCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SRRecorderCell.h; sourceTree = ""; }; + 02D610FD10ED232600B7DF2F /* SRRecorderCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SRRecorderCell.m; sourceTree = ""; }; + 02D610FE10ED232600B7DF2F /* SRRecorderControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SRRecorderControl.h; sourceTree = ""; }; + 02D610FF10ED232600B7DF2F /* SRRecorderControl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SRRecorderControl.m; sourceTree = ""; }; + 02D6110010ED232600B7DF2F /* SRValidator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SRValidator.h; sourceTree = ""; }; + 02D6110110ED232600B7DF2F /* SRValidator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SRValidator.m; sourceTree = ""; }; + 02E533C20C122A2800CBD4A5 /* CTGradient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CTGradient.h; sourceTree = ""; }; + 02E533C30C122A2800CBD4A5 /* CTGradient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CTGradient.m; sourceTree = ""; }; + 02E533EA0C122BB500CBD4A5 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Localizable.strings; sourceTree = ""; }; + 02F45D0103CE8BB00067B094 /* Preferences.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Preferences.h; sourceTree = ""; }; + 089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; + 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; + 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; + 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; + F508BCF9036B5A4801EFE74C /* PreferencesController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PreferencesController.h; sourceTree = ""; }; + F508BCFA036B5A4801EFE74C /* PreferencesController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = PreferencesController.m; sourceTree = ""; }; + F508BD00036B5E0F01EFE74C /* KeyMaps.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = KeyMaps.plist; sourceTree = ""; }; + F508BD02036B620801EFE74C /* MidiKeyMap.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = MidiKeyMap.h; sourceTree = ""; }; + F508BD03036B620801EFE74C /* MidiKeyMap.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = MidiKeyMap.m; sourceTree = ""; }; + F508BD06036B684A01EFE74C /* KeyMapManager.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = KeyMapManager.h; sourceTree = ""; }; + F508BD07036B684A01EFE74C /* KeyMapManager.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = KeyMapManager.m; sourceTree = ""; }; + F508BD0A036B783D01EFE74C /* ColourDefaults.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ColourDefaults.h; sourceTree = ""; }; + F508BD0B036B783D01EFE74C /* ColourDefaults.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = ColourDefaults.m; sourceTree = ""; }; + F527A938036C845101ACC053 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = ""; }; + F546EC5F035D006C0199E6AF /* AppController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = AppController.h; sourceTree = ""; }; + F546EC63035D01E20199E6AF /* CoreMIDI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = /System/Library/Frameworks/CoreMIDI.framework; sourceTree = ""; }; + F546EC7D035D0D950199E6AF /* MidiKeyView.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = MidiKeyView.h; sourceTree = ""; }; + F546EC7E035D0D950199E6AF /* MidiKeyView.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = MidiKeyView.m; sourceTree = ""; }; + F546ED0A035D17E50199E6AF /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = /System/Library/Frameworks/CoreAudio.framework; sourceTree = ""; }; + F551D3FD03621A310101F9C2 /* Octave.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Octave.png; sourceTree = ""; }; + F58735E2C5B04BC501FD2FC7 /* ReadMe.rtf */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; path = ReadMe.rtf; sourceTree = ""; }; + F5B7521E036765350140410E /* EndpointDefaults.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = EndpointDefaults.h; sourceTree = ""; }; + F5B7521F036765350140410E /* EndpointDefaults.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = EndpointDefaults.m; sourceTree = ""; }; + F5B75228036773F30140410E /* MidiKeys.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = MidiKeys.icns; sourceTree = ""; }; + F5BB863D036C79E401281FE2 /* MidiKeysApplication.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = MidiKeysApplication.h; sourceTree = ""; }; + F5BB863E036C79E401281FE2 /* MidiKeysApplication.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = MidiKeysApplication.m; sourceTree = ""; }; + F5C9F6B5036761780140410E /* main.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + F5D503220371FB6A0140410E /* KeyMapNames.strings */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = KeyMapNames.strings; path = English.lproj/KeyMapNames.strings; sourceTree = ""; }; + F5D503240371FB830140410E /* KeyMapNames.strings */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = KeyMapNames.strings; path = German.lproj/KeyMapNames.strings; sourceTree = ""; }; + F5D5FEF10371F1130140410E /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/Localizable.strings; sourceTree = ""; }; + F5D5FEF30371F1200140410E /* German */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = German; path = German.lproj/Localizable.strings; sourceTree = ""; }; + F5D5FEF40371F30D0140410E /* MidiParser.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = MidiParser.h; sourceTree = ""; }; + F5D5FEF50371F30D0140410E /* MidiParser.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = MidiParser.m; sourceTree = ""; }; + F5D5FEF80371F4BC0140410E /* German */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = German; path = German.lproj/InfoPlist.strings; sourceTree = ""; }; + F5F8BC1103909790013BC55C /* AppController.m */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.c.objc; path = AppController.m; sourceTree = ""; usesTabs = 1; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 02BC7051050CE14900D77426 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 02BC70F0050CE8EB00D77426 /* Carbon.framework in Frameworks */, + 02BC7184050CE8EB00D77426 /* Cocoa.framework in Frameworks */, + 02BC7188050CE8EC00D77426 /* CoreAudio.framework in Frameworks */, + 02BC7190050CE8EC00D77426 /* CoreMIDI.framework in Frameworks */, + 029ECAD410E7DB9C003648D5 /* Sparkle.framework in Frameworks */, + 029ECDB210E95822003648D5 /* Quartz.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 02AEA56504A01467003989A9 /* Documentation */ = { + isa = PBXGroup; + children = ( + F58735E2C5B04BC501FD2FC7 /* ReadMe.rtf */, + 02BD73A9044E6A7B000C9424 /* Lisez-Moi.rtf */, + 02BD73A8044E6A7B000C9424 /* LiesMich.rtf */, + 02BD73AA044E6A7B000C9424 /* ReadMe (Japanese).rtf */, + ); + name = Documentation; + sourceTree = ""; + }; + 02D610F710ED232600B7DF2F /* ShortcutRecorder */ = { + isa = PBXGroup; + children = ( + 02D610F810ED232600B7DF2F /* SRCommon.h */, + 02D610F910ED232600B7DF2F /* SRCommon.m */, + 02D610FA10ED232600B7DF2F /* SRKeyCodeTransformer.h */, + 02D610FB10ED232600B7DF2F /* SRKeyCodeTransformer.m */, + 02D610FC10ED232600B7DF2F /* SRRecorderCell.h */, + 02D610FD10ED232600B7DF2F /* SRRecorderCell.m */, + 02D610FE10ED232600B7DF2F /* SRRecorderControl.h */, + 02D610FF10ED232600B7DF2F /* SRRecorderControl.m */, + 02D6110010ED232600B7DF2F /* SRValidator.h */, + 02D6110110ED232600B7DF2F /* SRValidator.m */, + ); + path = ShortcutRecorder; + sourceTree = ""; + }; + 080E96DDFE201D6D7F000001 /* Classes */ = { + isa = PBXGroup; + children = ( + 02D610F710ED232600B7DF2F /* ShortcutRecorder */, + F546EC5F035D006C0199E6AF /* AppController.h */, + F5F8BC1103909790013BC55C /* AppController.m */, + F508BD0A036B783D01EFE74C /* ColourDefaults.h */, + F508BD0B036B783D01EFE74C /* ColourDefaults.m */, + 02E533C20C122A2800CBD4A5 /* CTGradient.h */, + 02E533C30C122A2800CBD4A5 /* CTGradient.m */, + F5B7521E036765350140410E /* EndpointDefaults.h */, + F5B7521F036765350140410E /* EndpointDefaults.m */, + F508BD06036B684A01EFE74C /* KeyMapManager.h */, + F508BD07036B684A01EFE74C /* KeyMapManager.m */, + F508BD02036B620801EFE74C /* MidiKeyMap.h */, + F508BD03036B620801EFE74C /* MidiKeyMap.m */, + F5BB863D036C79E401281FE2 /* MidiKeysApplication.h */, + F5BB863E036C79E401281FE2 /* MidiKeysApplication.m */, + F546EC7D035D0D950199E6AF /* MidiKeyView.h */, + F546EC7E035D0D950199E6AF /* MidiKeyView.m */, + F5D5FEF40371F30D0140410E /* MidiParser.h */, + F5D5FEF50371F30D0140410E /* MidiParser.m */, + 02AEA56104A00671003989A9 /* OverlayIndicator.h */, + 02AEA56204A00671003989A9 /* OverlayIndicator.m */, + 02F45D0103CE8BB00067B094 /* Preferences.h */, + F508BCF9036B5A4801EFE74C /* PreferencesController.h */, + F508BCFA036B5A4801EFE74C /* PreferencesController.m */, + ); + name = Classes; + sourceTree = ""; + }; + 19C28FACFE9D520D11CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + 02BC7053050CE14900D77426 /* MidiKeys.app */, + ); + name = Products; + sourceTree = ""; + }; + 29B97314FDCFA39411CA2CEA /* MidiKeys */ = { + isa = PBXGroup; + children = ( + 080E96DDFE201D6D7F000001 /* Classes */, + 29B97315FDCFA39411CA2CEA /* Other Sources */, + 29B97317FDCFA39411CA2CEA /* Resources */, + 29B97323FDCFA39411CA2CEA /* Frameworks */, + 19C28FACFE9D520D11CA2CBB /* Products */, + ); + name = MidiKeys; + sourceTree = ""; + }; + 29B97315FDCFA39411CA2CEA /* Other Sources */ = { + isa = PBXGroup; + children = ( + F5C9F6B5036761780140410E /* main.m */, + 028FE9A803B6DA6C006ABE44 /* MidiKeys_Prefix.h */, + ); + name = "Other Sources"; + sourceTree = ""; + }; + 29B97317FDCFA39411CA2CEA /* Resources */ = { + isa = PBXGroup; + children = ( + 029ECAE910E7DCCC003648D5 /* dsa_pub.pem */, + 0255683705D5E8B2002EA660 /* MidiKeys-Info.plist */, + F551D3FD03621A310101F9C2 /* Octave.png */, + 02BFAFAC03EDEA94000CADE3 /* OctaveDown.png */, + 02BFAFAD03EDEA94000CADE3 /* OctaveUp.png */, + F5B75228036773F30140410E /* MidiKeys.icns */, + F508BD00036B5E0F01EFE74C /* KeyMaps.plist */, + 028FE9A503B6D8C1006ABE44 /* Credits.html */, + 029ECBAF10E842FD003648D5 /* Preferences.xib */, + 029ECBBD10E845B5003648D5 /* MainMenu.xib */, + 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */, + F5D5FEF00371F1130140410E /* Localizable.strings */, + F5D503210371FB6A0140410E /* KeyMapNames.strings */, + 02AEA56504A01467003989A9 /* Documentation */, + 02BD73AE044E6A97000C9424 /* Version history.rtf */, + ); + name = Resources; + sourceTree = ""; + }; + 29B97323FDCFA39411CA2CEA /* Frameworks */ = { + isa = PBXGroup; + children = ( + 029ECDB110E95822003648D5 /* Quartz.framework */, + 029ECAD310E7DB9C003648D5 /* Sparkle.framework */, + F527A938036C845101ACC053 /* Carbon.framework */, + 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, + F546ED0A035D17E50199E6AF /* CoreAudio.framework */, + F546EC63035D01E20199E6AF /* CoreMIDI.framework */, + 29B97325FDCFA39411CA2CEA /* Foundation.framework */, + 29B97324FDCFA39411CA2CEA /* AppKit.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 02BC7052050CE14900D77426 /* MidiKeys */ = { + isa = PBXNativeTarget; + buildConfigurationList = 0225C04708573BF200B30E71 /* Build configuration list for PBXNativeTarget "MidiKeys" */; + buildPhases = ( + 02BC704F050CE14900D77426 /* Resources */, + 02BC7050050CE14900D77426 /* Sources */, + 02BC7051050CE14900D77426 /* Frameworks */, + 027CBF610FFE9E7E0038B96A /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = MidiKeys; + productName = "MidiKeys App"; + productReference = 02BC7053050CE14900D77426 /* MidiKeys.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 29B97313FDCFA39411CA2CEA /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0420; + }; + buildConfigurationList = 0225C04B08573BF200B30E71 /* Build configuration list for PBXProject "MidiKeys" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 1; + knownRegions = ( + English, + Japanese, + French, + German, + Spanish, + sv, + ); + mainGroup = 29B97314FDCFA39411CA2CEA /* MidiKeys */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 02BC7052050CE14900D77426 /* MidiKeys */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 02BC704F050CE14900D77426 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 02BC706C050CE74B00D77426 /* Credits.html in Resources */, + 02BC706D050CE74C00D77426 /* InfoPlist.strings in Resources */, + 02BC706E050CE74D00D77426 /* KeyMapNames.strings in Resources */, + 02BC706F050CE74D00D77426 /* KeyMaps.plist in Resources */, + 02BC7070050CE74D00D77426 /* LiesMich.rtf in Resources */, + 02BC7071050CE74E00D77426 /* Lisez-Moi.rtf in Resources */, + 02BC7072050CE74E00D77426 /* Localizable.strings in Resources */, + 02BC7074050CE75000D77426 /* MidiKeys.icns in Resources */, + 02BC7075050CE75000D77426 /* Octave.png in Resources */, + 02BC7076050CE75000D77426 /* OctaveDown.png in Resources */, + 02BC7077050CE75100D77426 /* OctaveUp.png in Resources */, + 02BC7079050CE75200D77426 /* ReadMe (Japanese).rtf in Resources */, + 02BC707A050CE75300D77426 /* ReadMe.rtf in Resources */, + 029ECAEA10E7DCCC003648D5 /* dsa_pub.pem in Resources */, + 029ECBB110E8440B003648D5 /* Preferences.xib in Resources */, + 029ECBC510E84636003648D5 /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 02BC7050050CE14900D77426 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 02BC7055050CE73B00D77426 /* main.m in Sources */, + 02BC7059050CE73F00D77426 /* AppController.m in Sources */, + 02BC705B050CE74000D77426 /* ColourDefaults.m in Sources */, + 02BC705D050CE74100D77426 /* EndpointDefaults.m in Sources */, + 02BC705F050CE74200D77426 /* KeyMapManager.m in Sources */, + 02BC7061050CE74300D77426 /* MidiKeyMap.m in Sources */, + 02BC7063050CE74400D77426 /* MidiKeysApplication.m in Sources */, + 02BC7065050CE74500D77426 /* MidiKeyView.m in Sources */, + 02BC7067050CE74600D77426 /* MidiParser.m in Sources */, + 02BC7069050CE74700D77426 /* OverlayIndicator.m in Sources */, + 02BC706B050CE74800D77426 /* PreferencesController.m in Sources */, + 02E533C90C122A2800CBD4A5 /* CTGradient.m in Sources */, + 02D6110210ED232600B7DF2F /* SRCommon.m in Sources */, + 02D6110310ED232600B7DF2F /* SRKeyCodeTransformer.m in Sources */, + 02D6110410ED232600B7DF2F /* SRRecorderCell.m in Sources */, + 02D6110510ED232600B7DF2F /* SRRecorderControl.m in Sources */, + 02D6110610ED232600B7DF2F /* SRValidator.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 028FE9A503B6D8C1006ABE44 /* Credits.html */ = { + isa = PBXVariantGroup; + children = ( + 028FE9A303B6D8B5006ABE44 /* English */, + 028FE9A703B6D8DC006ABE44 /* German */, + 020631DF03EA0C5800488331 /* French */, + 02BD73A2044E69CF000C9424 /* Spanish */, + ); + name = Credits.html; + sourceTree = ""; + }; + 029ECBAF10E842FD003648D5 /* Preferences.xib */ = { + isa = PBXVariantGroup; + children = ( + 029ECBB010E842FD003648D5 /* English */, + 029ECBCD10E846C9003648D5 /* German */, + 029ECBCE10E846F9003648D5 /* French */, + 029ECBCF10E84877003648D5 /* Japanese */, + 029ECBD010E8488F003648D5 /* Spanish */, + ); + name = Preferences.xib; + sourceTree = ""; + }; + 029ECBBD10E845B5003648D5 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 029ECBC610E84656003648D5 /* English */, + 029ECBBE10E845B5003648D5 /* German */, + 029ECBC010E845CB003648D5 /* French */, + 029ECBC210E845DD003648D5 /* Japanese */, + 029ECBC410E845EF003648D5 /* Spanish */, + ); + name = MainMenu.xib; + sourceTree = ""; + }; + 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 089C165DFE840E0CC02AAC07 /* English */, + F5D5FEF80371F4BC0140410E /* German */, + 020631E003EA0C5800488331 /* French */, + 020D980E03EB1FDE0031FAE0 /* Japanese */, + 02BD73A7044E6A2A000C9424 /* Spanish */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + F5D503210371FB6A0140410E /* KeyMapNames.strings */ = { + isa = PBXVariantGroup; + children = ( + F5D503220371FB6A0140410E /* KeyMapNames.strings */, + F5D503240371FB830140410E /* KeyMapNames.strings */, + 020631E103EA0C5800488331 /* French */, + 020D980F03EB1FDE0031FAE0 /* Japanese */, + 02BD73A6044E6A20000C9424 /* Spanish */, + ); + name = KeyMapNames.strings; + sourceTree = ""; + }; + F5D5FEF00371F1130140410E /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + F5D5FEF10371F1130140410E /* English */, + F5D5FEF30371F1200140410E /* German */, + 020631E203EA0C5800488331 /* French */, + 020D981003EB1FDE0031FAE0 /* Japanese */, + 02BD73A5044E6A0D000C9424 /* Spanish */, + 02E533EA0C122BB500CBD4A5 /* sv */, + ); + name = Localizable.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 0225C04808573BF200B30E71 /* Development */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)\"", + ); + GCC_GENERATE_DEBUGGING_SYMBOLS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = MidiKeys_Prefix.h; + GCC_WARN_FOUR_CHARACTER_CONSTANTS = NO; + GCC_WARN_UNKNOWN_PRAGMAS = NO; + INFOPLIST_FILE = "MidiKeys-Info.plist"; + INSTALL_PATH = "$(USER_APPS_DIR)"; + ONLY_ACTIVE_ARCH = YES; + OTHER_LDFLAGS = ( + "-framework", + Foundation, + "-framework", + AppKit, + ); + PRODUCT_NAME = MidiKeys; + WARNING_CFLAGS = "-Wmost"; + }; + name = Development; + }; + 0225C04908573BF200B30E71 /* Deployment */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)\"", + ); + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = MidiKeys_Prefix.h; + GCC_WARN_FOUR_CHARACTER_CONSTANTS = NO; + GCC_WARN_UNKNOWN_PRAGMAS = NO; + INFOPLIST_FILE = "MidiKeys-Info.plist"; + INSTALL_PATH = "$(USER_APPS_DIR)"; + OTHER_LDFLAGS = ( + "-framework", + Foundation, + "-framework", + AppKit, + ); + PRODUCT_NAME = MidiKeys; + WARNING_CFLAGS = "-Wmost"; + }; + name = Deployment; + }; + 0225C04C08573BF200B30E71 /* Development */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + SDKROOT = ""; + }; + name = Development; + }; + 0225C04D08573BF200B30E71 /* Deployment */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + SDKROOT = ""; + }; + name = Deployment; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 0225C04708573BF200B30E71 /* Build configuration list for PBXNativeTarget "MidiKeys" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 0225C04808573BF200B30E71 /* Development */, + 0225C04908573BF200B30E71 /* Deployment */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Deployment; + }; + 0225C04B08573BF200B30E71 /* Build configuration list for PBXProject "MidiKeys" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 0225C04C08573BF200B30E71 /* Development */, + 0225C04D08573BF200B30E71 /* Deployment */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Deployment; + }; +/* End XCConfigurationList section */ + }; + rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; +} diff --git a/MidiKeys.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/MidiKeys.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..f5f09f5 --- /dev/null +++ b/MidiKeys.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/MidiKeys.xcodeproj/project.xcworkspace/xcshareddata/MidiKeys.xccheckout b/MidiKeys.xcodeproj/project.xcworkspace/xcshareddata/MidiKeys.xccheckout new file mode 100644 index 0000000..1965f7b --- /dev/null +++ b/MidiKeys.xcodeproj/project.xcworkspace/xcshareddata/MidiKeys.xccheckout @@ -0,0 +1,46 @@ + + + + + IDESourceControlProjectFavoriteDictionaryKey + + IDESourceControlProjectIdentifier + C56180C3-F612-4901-BFF8-D2799CFFEF60 + IDESourceControlProjectName + MidiKeys + IDESourceControlProjectOriginsDictionary + + 16C17E10-D637-4CCA-8138-24FC791BB562 + svn://himiko.local/svnroot/MidiKeys/trunk + + IDESourceControlProjectPath + MidiKeys.xcodeproj/project.xcworkspace + IDESourceControlProjectRelativeInstallPathDictionary + + 16C17E10-D637-4CCA-8138-24FC791BB562 + ../.. + + IDESourceControlProjectRepositoryRootDictionary + + 16C17E10-D637-4CCA-8138-24FC791BB562 + svn://himiko.local/svnroot + + IDESourceControlProjectURL + svn://himiko.local/svnroot/MidiKeys/trunk/MidiKeys.xcodeproj + IDESourceControlProjectVersion + 110 + IDESourceControlProjectWCCIdentifier + 16C17E10-D637-4CCA-8138-24FC791BB562 + IDESourceControlProjectWCConfigurations + + + IDESourceControlRepositoryExtensionIdentifierKey + public.vcs.subversion + IDESourceControlWCCIdentifierKey + 16C17E10-D637-4CCA-8138-24FC791BB562 + IDESourceControlWCCName + MidiKeys + + + + diff --git a/MidiKeys.xcodeproj/project.xcworkspace/xcuserdata/creed.xcuserdatad/WorkspaceSettings.xcsettings b/MidiKeys.xcodeproj/project.xcworkspace/xcuserdata/creed.xcuserdatad/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..06c7d50 --- /dev/null +++ b/MidiKeys.xcodeproj/project.xcworkspace/xcuserdata/creed.xcuserdatad/WorkspaceSettings.xcsettings @@ -0,0 +1,10 @@ + + + + + IDEWorkspaceUserSettings_HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges + + IDEWorkspaceUserSettings_SnapshotAutomaticallyBeforeSignificantChanges + + + diff --git a/MidiKeys.xcodeproj/xcuserdata/creed.xcuserdatad/xcschemes/MidiKeys.xcscheme b/MidiKeys.xcodeproj/xcuserdata/creed.xcuserdatad/xcschemes/MidiKeys.xcscheme new file mode 100644 index 0000000..d2d1b99 --- /dev/null +++ b/MidiKeys.xcodeproj/xcuserdata/creed.xcuserdatad/xcschemes/MidiKeys.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MidiKeys.xcodeproj/xcuserdata/creed.xcuserdatad/xcschemes/xcschememanagement.plist b/MidiKeys.xcodeproj/xcuserdata/creed.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..9f7f79a --- /dev/null +++ b/MidiKeys.xcodeproj/xcuserdata/creed.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,22 @@ + + + + + SchemeUserState + + MidiKeys.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + 02BC7052050CE14900D77426 + + primary + + + + + diff --git a/MidiKeysApplication.h b/MidiKeysApplication.h new file mode 100644 index 0000000..c49e34b --- /dev/null +++ b/MidiKeysApplication.h @@ -0,0 +1,22 @@ +// +// MidiKeysApplication.h +// MidiKeys +// +// Created by Chris Reed on Sun Oct 27 2002. +// Copyright (c) 2002 Chris Reed. All rights reserved. +// + +#import + + +@interface MidiKeysApplication : NSApplication + +@end + +@interface NSObject (HotKeysDelegateMethods) + +- (void)hotKeyPressed:(UInt32)identifier; +- (void)hotKeyReleased:(UInt32)identifier; + +@end + diff --git a/MidiKeysApplication.m b/MidiKeysApplication.m new file mode 100644 index 0000000..8f954e9 --- /dev/null +++ b/MidiKeysApplication.m @@ -0,0 +1,76 @@ +// +// MidiKeysApplication.m +// MidiKeys +// +// Created by Chris Reed on Sun Oct 27 2002. +// Copyright (c) 2002 Chris Reed. All rights reserved. +// + +#import "MidiKeysApplication.h" + + +enum { + // NSEvent subtypes for hotkey events (undocumented). + kEventHotKeyPressedSubtype = 6, + kEventHotKeyReleasedSubtype = 9 +}; + +static struct { + BOOL valid; + BOOL pressed; + BOOL released; +} cachedDelegateHandles = { NO, NO, NO }; + +@implementation MidiKeysApplication + +- (void)sendEvent:(NSEvent *)theEvent +{ + if ([theEvent type] == NSSystemDefined) + { + // cache the results of these -respondsToSelector: messages so + // we handle hot keys as fast as possible (even though it's only + // a few method calls, it does affect the note on latency) + if (!cachedDelegateHandles.valid) + { + if ([self delegate]) + { + cachedDelegateHandles.pressed = [[self delegate] respondsToSelector:@selector(hotKeyPressed:)]; + cachedDelegateHandles.released = [[self delegate] respondsToSelector:@selector(hotKeyReleased:)]; + } + else + { + cachedDelegateHandles.pressed = NO; + cachedDelegateHandles.released = NO; + } + cachedDelegateHandles.valid = YES; + } + // pass the hot key event on to the delegate. + switch ([theEvent subtype]) + { + case kEventHotKeyPressedSubtype: + if (cachedDelegateHandles.pressed) + { + [[self delegate] hotKeyPressed:[theEvent data1]]; + } + break; + case kEventHotKeyReleasedSubtype: + if (cachedDelegateHandles.released) + { + [[self delegate] hotKeyReleased:[theEvent data1]]; + } + break; + } + } + + [super sendEvent:theEvent]; +} + +// invalidate the cache +- (void)setDelegate:(id)delegate +{ + cachedDelegateHandles.valid = NO; + [super setDelegate:delegate]; +} + +@end + diff --git a/MidiKeys_Prefix.h b/MidiKeys_Prefix.h new file mode 100644 index 0000000..6f5be5c --- /dev/null +++ b/MidiKeys_Prefix.h @@ -0,0 +1,2 @@ +#import +#import \ No newline at end of file diff --git a/MidiParser.h b/MidiParser.h new file mode 100644 index 0000000..88b99ea --- /dev/null +++ b/MidiParser.h @@ -0,0 +1,29 @@ +// +// MidiParser.h +// MidiKeys +// +// Created by Chris Reed on Thu Oct 31 2002. +// Copyright (c) 2002 Chris Reed. All rights reserved. +// + +#import +#import + +@interface MidiParser : NSObject +{ + const MIDIPacketList *_packetList; + MIDIPacket *_packet; + int _packetCount; + int _byteNum; + int _dataBytesRequired; + MIDIPacket _resultPacket; + MIDIPacket _realtimePacket; +} + ++ parserWithMidiPacketList:(const MIDIPacketList *)packetList; +- initWithMidiPacketList:(const MIDIPacketList *)packetList; + +// Returns a pointer to the next complete packet, or NULL. +- (MIDIPacket *)nextMidiPacket; + +@end diff --git a/MidiParser.m b/MidiParser.m new file mode 100644 index 0000000..e6a1942 --- /dev/null +++ b/MidiParser.m @@ -0,0 +1,176 @@ +// +// MidiParser.m +// MidiKeys +// +// Created by Chris Reed on Thu Oct 31 2002. +// Copyright (c) 2002 Chris Reed. All rights reserved. +// + +#import "MidiParser.h" + +#define kInSysEx -1 + +@interface MidiParser (PrivateMethods) + +- (MIDIPacket *)processByte:(Byte)theByte; + +@end + +@implementation MidiParser + ++ parserWithMidiPacketList:(const MIDIPacketList *)packetList +{ + return [[[self alloc] initWithMidiPacketList:packetList] autorelease]; +} + +// Designated initialiser. +- initWithMidiPacketList:(const MIDIPacketList *)packetList +{ + self = [super init]; + if (self) + { + _packetList = packetList; + _packetCount = _packetList->numPackets; + _packet = (MIDIPacket *)_packetList->packet; // remove const (!) + _byteNum = 0; + } + return self; +} + +// Figure out what to do with a single byte. If the byte completes a packet, then the +// packet description is filled in and a pointer to it is returned. Otherwise, this +// method quietly processes the byte and returns NULL. +- (MIDIPacket *)processByte:(Byte)theByte +{ + if (theByte & 0x80) + { + // status byte + if (theByte >= 0xf8) + { + // realtime message + switch (theByte) + { + case 0xf8: // clock + case 0xfa: // start + case 0xfb: // continue + case 0xfc: // stop + case 0xff: // system reset + // fill in the realtime packet and return it + _realtimePacket.timeStamp = _packet->timeStamp; + _realtimePacket.length = 1; + _realtimePacket.data[0] = theByte; + ++_byteNum; // start at next byte next time through + return &_realtimePacket; + + case 0xfe: // active sensing (ignored) + default: + break; + } + } + else + { + // non realtime message. always begins packet + + // XXX handle status cancleling sysex + + // set up resulting packet + _resultPacket.timeStamp = _packet->timeStamp; + _resultPacket.length = 1; + _resultPacket.data[0] = theByte; + + if (theByte < 0xf0) + { + // channel message + _dataBytesRequired = ((theByte & 0xe0) == 0xc0) ? 1 : 2; + } + else + { + // system message + switch (theByte) + { + case 0xf0: + _dataBytesRequired = kInSysEx; + break; + case 0xf1: // MTC quarter frame + case 0xf3: // song select + _dataBytesRequired = 1; + break; + case 0xf2: // song ptr + _dataBytesRequired = 2; + break; + case 0xf6: // tune request + _dataBytesRequired = 0; + ++_byteNum; + return &_resultPacket; + case 0xf4: // undefined + case 0xf5: // undefined + case 0xf7: // EOX handled above + _dataBytesRequired = 0; + break; + } + } + } + } + else + { + // data byte + if (_dataBytesRequired > 0) + { + _resultPacket.data[_resultPacket.length++] = theByte; + if (--_dataBytesRequired == 0) + { + ++_byteNum; // start at next byte the next time through + return &_resultPacket; + } + } + else if (_dataBytesRequired == kInSysEx) + { + // XXX handle sysex + } + } + return NULL; +} + +// This method fills in our standalone packet while parsing the packet list we were initialised +// with. The spec for MIDIPackets as defined in the MIDIServices.h header says that a packet +// may contain more than one event, but it will always contain whole events. Unless it's sysex, +// which may be split across packets. +- (MIDIPacket *)nextMidiPacket +{ + // have we parsed all the packets? + if (_packetCount <= 0) + return NULL; + + // check byte num. this the normal way we advance to the next packet in the list. + if (_packet && _byteNum >= _packet->length) + { + _packet = (--_packetCount > 0) ? MIDIPacketNext(_packet) : NULL; + _byteNum = 0; + } + + // bail if there's still not a packet + if (!_packet) + return NULL; + + // process bytes in this packet + do { + _dataBytesRequired = 0; + for (; _byteNum < _packet->length; ++_byteNum) + { + MIDIPacket *result = [self processByte:_packet->data[_byteNum]]; + if (result != NULL) + return result; + } + + // we have exited the loop (process all bytes in the packet) without sending + // a packet out. so advance to the next packet and try again. + _packet = (--_packetCount > 0) ? MIDIPacketNext(_packet) : NULL; + _byteNum = 0; + } while (_packet); + + // there is no next packet + return NULL; +} + +@end + diff --git a/Octave.png b/Octave.png new file mode 100644 index 0000000000000000000000000000000000000000..2ba0860f4aceb9498b09403324981ece34956582 GIT binary patch literal 1364 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 t + +//! Margin around the image. +#define kOverlayIndicatorMargin 40.0f + +/*! + * @brief Manages an indicator popup window. + * + * This class manages a one-shot overlay window that displays an arbitrary + * image. It is very similar to the overlay that appears when you adjust + * volume or contrast from the keyboard. + */ +@interface OverlayIndicator : NSObject +{ + NSView * _contentView; + NSWindow *_overlayWindow; + NSTimer *_timer; + id _delegate; + NSString * _message; +} + +//! @brief Designated initializer. +- initWithView:(NSView *)theView; + +//! @brief Create an overlay showing an image. +- initWithImage:(NSImage *)theImage; + +- (void)setDelegate:(id)theDelegate; +- (id)delegate; + +- (NSString *)message; +- (void)setMessage:(NSString *)theMessage; + +- (void)showUntilDate:(NSDate *)hideDate; +- (void)close; + +@end + +@interface NSObject (OverlayIndicatorDelegate) + +- (void)overlayIndicatorDidClose:(OverlayIndicator *)theIndicator; + +@end diff --git a/OverlayIndicator.m b/OverlayIndicator.m new file mode 100644 index 0000000..a38c6dd --- /dev/null +++ b/OverlayIndicator.m @@ -0,0 +1,273 @@ +// +// OverlayIndicator.m +// MidiKeys +// +// Created by Chris Reed on Tue Jun 17 2003. +// Copyright (c) 2003 Chris Reed. All rights reserved. +// + +#import "OverlayIndicator.h" +#import +#import + +//! Font size of the overlay message. +#define OVERLAY_MESSAGE_FONT_SIZE 32.0 + +// Internal methods. +@interface OverlayIndicator () + +- (void)buildOverlayWindow; +- (void)hideOverlay:(NSTimer *)theTimer; + +@end + +@interface OverlayBackgroundView : NSView + +@end + +@implementation OverlayIndicator + +- initWithView:(NSView *)theView +{ + self = [super init]; + if (self) + { + _contentView = [theView retain]; + } + + return self; +} + +- initWithImage:(NSImage *)theImage +{ + NSRect viewFrame; + viewFrame.origin.x = 0.0f; + viewFrame.origin.y = 0.0f; + viewFrame.size = [theImage size]; + + // Create an image view to hold the given image. + NSImageView *imageView = [[[NSImageView alloc] initWithFrame:viewFrame] autorelease]; + [imageView setImage:theImage]; + [imageView setImageAlignment:NSImageAlignCenter]; + [imageView setImageFrameStyle:NSImageFrameNone]; + [imageView setEditable:NO]; + [imageView setWantsLayer:YES]; + + // Apply a shadow to the image. + NSShadow * shadow = [[[NSShadow alloc] init] autorelease]; + [shadow setShadowColor:[NSColor colorWithCalibratedWhite:0.0 alpha:0.85]]; + [shadow setShadowOffset:NSMakeSize(1.0, -1.0)]; + [shadow setShadowBlurRadius:2.0]; + [imageView setShadow:shadow]; + + return [self initWithView:imageView]; +} + +- (void)dealloc +{ + [self close]; + [_overlayWindow release]; + [_contentView release]; + + [super dealloc]; +} + +- (void)setDelegate:(id)theDelegate +{ + _delegate = theDelegate; +} + +- (id)delegate +{ + return _delegate; +} + +- (NSString *)message +{ + return _message; +} + +- (void)setMessage:(NSString *)theMessage +{ + [_message autorelease]; + _message = [theMessage copy]; +} + +- (void)buildOverlayWindow +{ + NSTextField * messageView = nil; + NSSize messageSize= {0}; + if (_message) + { + NSShadow * shadow = [[[NSShadow alloc] init] autorelease]; + [shadow setShadowOffset:NSMakeSize(2.0, -2.0)]; + [shadow setShadowBlurRadius:1.0]; + + // Build the attributes dictionary. + NSDictionary * attrs = [NSDictionary dictionaryWithObjectsAndKeys: + [NSFont boldSystemFontOfSize:OVERLAY_MESSAGE_FONT_SIZE], NSFontAttributeName, + shadow, NSShadowAttributeName, + [NSColor whiteColor], NSForegroundColorAttributeName, + [NSColor blackColor], NSStrokeColorAttributeName, + [NSNumber numberWithFloat:-1.0], NSStrokeWidthAttributeName, +// [NSNumber numberWithFloat:0.12], NSExpansionAttributeName, + nil, nil]; + + NSAttributedString * attributedMessage = [[NSAttributedString alloc] initWithString:_message attributes:attrs]; + + // Compute the bounding rect of the message. + NSRect messageFrame; + messageSize = [attributedMessage size]; + messageFrame.size = messageSize; + messageFrame.size.width += 5; + messageFrame.origin.x = 0; + messageFrame.origin.y = 0; + + messageView = [[[NSTextField alloc] initWithFrame:messageFrame] autorelease]; + [messageView setAttributedStringValue:attributedMessage]; + [messageView setBordered:NO]; + [messageView setBezeled:NO]; + [messageView setEditable:NO]; + [messageView setSelectable:NO]; + [messageView setDrawsBackground:NO]; + } + + // Calculate window rect. + NSScreen *mainScreen = [NSScreen mainScreen]; + NSRect screenFrame = [mainScreen visibleFrame]; + NSRect viewFrame = [_contentView frame]; + + float width = NSWidth(viewFrame) + kOverlayIndicatorMargin * 2.0f; + float height = NSHeight(viewFrame) + kOverlayIndicatorMargin * 2.0f; + + if (messageView) + { + if (width < messageSize.width + kOverlayIndicatorMargin * 2.0f) + { + width = messageSize.width + kOverlayIndicatorMargin * 2.0f; + } + + height += messageSize.height + kOverlayIndicatorMargin / 2.0; + } + + NSRect contentRect = NSMakeRect((NSWidth(screenFrame) - width) / 2.0f, (NSHeight(screenFrame) - height) / 2.0f, width, height); + + // create overlay window + _overlayWindow = [[NSWindow alloc] initWithContentRect:contentRect styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:YES screen:mainScreen]; + [_overlayWindow setOpaque:NO]; + [_overlayWindow setHasShadow:NO]; +// [_overlayWindow setAlphaValue:0.75f]; + [_overlayWindow setLevel:NSStatusWindowLevel]; + [_overlayWindow setIgnoresMouseEvents:YES]; + [_overlayWindow setBackgroundColor:[NSColor clearColor]]; + + // add background view to window + NSRect backFrame = NSMakeRect(0.0f, 0.0f, width, height); + OverlayBackgroundView *backView = [[[OverlayBackgroundView alloc] initWithFrame:backFrame] autorelease]; + [backView setWantsLayer:YES]; + [_overlayWindow setContentView: backView]; + + // Add subviews to background view and reposition it. + [backView addSubview:_contentView]; + + NSPoint newOrigin; + newOrigin.x = (width - NSWidth(viewFrame)) / 2.0; + newOrigin.y = height - NSHeight(viewFrame) - kOverlayIndicatorMargin; + [_contentView setFrameOrigin:newOrigin]; + + if (messageView) + { + [backView addSubview:messageView]; + + newOrigin.x = (width - messageSize.width) / 2.0; + newOrigin.y = kOverlayIndicatorMargin / 2.0; + [messageView setFrameOrigin:newOrigin]; + } +} + +- (void)showUntilDate:(NSDate *)hideDate +{ + [self buildOverlayWindow]; + [_overlayWindow makeKeyAndOrderFront:nil]; + + // schedule timer + _timer = [NSTimer scheduledTimerWithTimeInterval:[hideDate timeIntervalSinceNow] target:self selector:@selector(hideOverlay:) userInfo:nil repeats:NO]; +} + +- (void)hideOverlay:(NSTimer *)theTimer +{ + // Fade window out + CALayer * theLayer = [[_overlayWindow contentView] layer]; + +// CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"opacity"]; +// anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; +// anim.fromValue = [NSNumber numberWithFloat:1]; +// anim.toValue = [NSNumber numberWithFloat:0]; +// anim.duration = 0.4; +// // We make ourselves the delegate to get notified when the animation ends +// anim.delegate = self; +// +// [theLayer addAnimation:anim forKey:@"alpha"]; + + // Create an explicit transaction to animate the opacity change. + [CATransaction begin]; + [CATransaction setValue:[NSNumber numberWithFloat:0.5f] forKey:kCATransactionAnimationDuration]; + theLayer.opacity=0.0; + [CATransaction commit]; + + _timer = nil; + + // inform delegate + if (_delegate && [_delegate respondsToSelector:@selector(overlayIndicatorDidClose:)]) + { + [_delegate overlayIndicatorDidClose:self]; + } +} + +- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag +{ + NSLog(@"anim did stop: %@ flag:%d", anim, (int)flag); + [_overlayWindow close]; +// [self close]; +} + +- (void)close +{ + if (_timer) + { + [_timer invalidate]; + _timer = nil; + } + + [[[_overlayWindow contentView] layer] removeAllAnimations]; + [_overlayWindow close]; + + // inform delegate + if (_delegate && [_delegate respondsToSelector:@selector(overlayIndicatorDidClose:)]) + { + [_delegate overlayIndicatorDidClose:self]; + } +} + +@end + +// These values produce a background that exactly matches Apple's bezel overlays. +#define OVERLAY_BACKGROUND_GRAYSCALE 0.2f +#define OVERLAY_BACKGROUND_RADIUS 20.0f +#define OVERLAY_BACKGROUND_ALPHA 0.2f + +@implementation OverlayBackgroundView + +- (BOOL)isOpaque +{ + return NO; +} + +- (void)drawRect:(NSRect)rect +{ + [[NSColor colorWithCalibratedWhite:OVERLAY_BACKGROUND_GRAYSCALE alpha:OVERLAY_BACKGROUND_ALPHA] set]; + [[NSBezierPath bezierPathWithRoundedRect:[self bounds] xRadius:OVERLAY_BACKGROUND_RADIUS yRadius:OVERLAY_BACKGROUND_RADIUS] fill]; +} + +@end + diff --git a/Preferences.h b/Preferences.h new file mode 100644 index 0000000..07e74f0 --- /dev/null +++ b/Preferences.h @@ -0,0 +1,65 @@ +// +// Preferences.h +// MidiKeys +// +// Created by Chris Reed on Thu Jan 09 2003. +// Copyright (c) 2002-2003 Chris Reed. All rights reserved. +// + +//! @name Preference Keys +//@{ + +// Preferences without direct user control +#define kVelocityPrefKey @"Velocity" +#define kChannelPrefKey @"Channel" +#define kOctaveOffsetPrefKey @"OctaveOffset" +#define kDestinationPrefKey @"DestinationUID" +#define kSourcePrefKey @"SourceUID" +#define kIsWindowToggledPrefKey @"IsWindowToggled" +#define kMidiThruPrefKey @"MidiThru" +#define kOverlayTimeoutPrefKey @"OverlayTimeout" + +// Preferences set in the Preferences panel +#define kKeyMapPrefKey @"KeyMap" +#define kHighlightColourPrefKey @"HighlightColour" +#define kUseHotKeysPrefKey @"UseHotKeys" +#define kFloatWindowPrefKey @"Floating" +#define kWindowTransparencyPrefKey @"WindowTransparency" +#define kHotKeysModifiersPrefKey @"HotKeysModifiers" +#define kSolidOnTopPrefKey @"SolidOnTop" +#define kClickThroughPrefKey @"ClickThrough" +#define SHOW_HOT_KEYS_OVERLAYS_PREF_KEY @"ShowHotKeysTogglingOverlays" +#define SHOW_OCTAVE_SHIFT_OVERLAYS_PREF_KEY @"ShowOctaveShiftOverlays" +#define SHOW_VELOCITY_OVERLAYS_PREF_KEY @"ShowVelocityOverlays" +#define kShowKeyCapsPrefKey @"ShowKeyCaps" + +#define kToggleHotKeysShortcutPrefKey @"ToggleHotKeysShortcut" + +// Dictionary keys for shortcut preferences. +#define SHORTCUT_FLAGS_KEY @"flags" +#define SHORTCUT_KEYCODE_KEY @"keycode" + +// Hidden preferences +#define kVelocityRepeatIntervalPrefKey @"VelocityRepeatInterval" +#define kVelocityHotKeyDeltaPrefKey @"VelocityHotKeyDelta" + +//@} + +//! @name Preference Defaults +//@{ + +// Default values for preferences +#define kDefaultHighlightRed 0.0 +#define kDefaultHighlightGreen 1.0 +#define kDefaultHighlightBlue 0.0 + +#define kDefaultHighlightTransparency 0.75 +#define kDefaultWindowTransparency 1.0 + +#define kDefaultHotKeysModifiers 0 + +#define kDefaultVelocityRepeatInterval 0.25 +#define kDefaultVelocityHotKeyDelta 10.0 + +//@} + diff --git a/PreferencesController.h b/PreferencesController.h new file mode 100644 index 0000000..b0cc7fc --- /dev/null +++ b/PreferencesController.h @@ -0,0 +1,57 @@ +// +// PreferencesController.h +// MidiKeys +// +// Created by Chris Reed on Sat Oct 26 2002. +// Copyright (c) 2002 Chris Reed. All rights reserved. +// + +#import +#import "Preferences.h" +#import "SRRecorderControl.h" + +/*! + * @brief Manages the preferences panel. + */ +@interface PreferencesController : NSWindowController +{ + IBOutlet NSWindow * _prefsWindow; + IBOutlet NSPopUpButton *keymapPopup; + IBOutlet NSColorWell *highlightColourWell; + IBOutlet NSButton *useHotKeysCheckbox; + IBOutlet NSButton *floatWindowCheckbox; + IBOutlet NSSlider *windowTransparencySlider; + IBOutlet NSButton *controlModifierCheckbox; + IBOutlet NSButton *shiftModifierCheckbox; + IBOutlet NSButton *optionModifierCheckbox; + IBOutlet NSButton *commandModifierCheckbox; + IBOutlet NSButton *solidOnTopCheckbox; + IBOutlet NSButton * showKeyCapsCheckbox; + IBOutlet NSButton * _clickThroughCheckbox; + IBOutlet SRRecorderControl * _toggleHotKeysShortcut; + IBOutlet NSButton * _hotKeysOverlaysCheckbox; + IBOutlet NSButton * _octaveShiftOverlaysCheckbox; + IBOutlet NSButton * _velocityOverlaysCheckbox; + IBOutlet id delegate; //!< Preferences controller delegate. +} + +@property(nonatomic, assign) id delegate; //!< Preferences controller delegate. + ++ sharedInstance; + +- init; + +- (void)showPanel:(id)sender; +- (void)updateWindow; +- (BOOL)commitChanges; + +- (IBAction)ok:(id)sender; +- (IBAction)cancel:(id)sender; + +- (IBAction)keyboardFloatsDidChange:(id)sender; + +@end + +// Notification +extern NSString *kPreferencesChangedNotification; + diff --git a/PreferencesController.m b/PreferencesController.m new file mode 100644 index 0000000..9890a8c --- /dev/null +++ b/PreferencesController.m @@ -0,0 +1,245 @@ +// +// PreferencesController.mm +// MidiKeys +// +// Created by Chris Reed on Sat Oct 26 2002. +// Copyright (c) 2002 Chris Reed. All rights reserved. +// + +#import "PreferencesController.h" +#import "ColourDefaults.h" +#import "KeyMapManager.h" +#import + +//! The name of the notification sent when preferences changes have been committed. +NSString *kPreferencesChangedNotification = @"PreferencesChanged"; + +//! Storage for the singleton preferences controller object. +static PreferencesController *_sharedPrefsController = nil; + +@implementation PreferencesController + +@synthesize delegate; + ++ sharedInstance +{ + if (_sharedPrefsController == nil) + { + _sharedPrefsController = [[self alloc] init]; + } + return _sharedPrefsController; +} + +- init +{ + self = [super initWithWindowNibName:@"Preferences"]; + if (self) + { + if (_sharedPrefsController == nil) + { + _sharedPrefsController = self; + } + } + return self; +} + +- (void)dealloc +{ + [super dealloc]; +} + +- (void)windowDidLoad +{ + // Configure the window a little. + _prefsWindow = [self window]; + [_prefsWindow setExcludedFromWindowsMenu:YES]; + [_prefsWindow setMenu:nil]; + [_prefsWindow center]; + + // Add our delegate as an observer for some notifications. + NSNotificationCenter * center = [NSNotificationCenter defaultCenter]; + [center addObserver:delegate selector:@selector(preferencesDidChange:) name:kPreferencesChangedNotification object:nil]; + + [_toggleHotKeysShortcut setCanCaptureGlobalHotKeys:YES]; +} + +- (void)showPanel:(id)sender +{ + // Force the window to load if it hasn't already been loaded so we can set up the + // controls properly. + [self window]; + + // Refresh controls to match current prefs. + [self updateWindow]; + + // Bring the window to front and show it. + [self showWindow:nil]; +} + +//! Set values of window widgets based on preferences. Default preference +//! values have already been set by AppController. +- (void)updateWindow +{ + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + + // set keymap popup + KeyMapManager *keyMgr = [KeyMapManager sharedInstance]; + [keymapPopup removeAllItems]; + [keymapPopup addItemsWithTitles:[keyMgr allKeyMapLocalisedNames]]; + NSString *keymapPref = [defaults stringForKey:kKeyMapPrefKey]; + + // fill in nonlocalised/global names as the represented object + int i; + for (i=0; i < [keymapPopup numberOfItems]; ++i) + { + NSMenuItem * thisItem = [keymapPopup itemAtIndex:i]; + id globalName = [keyMgr nameForKeyMapWithLocalisedName:[thisItem title]]; + [thisItem setRepresentedObject:globalName]; + // select the keymap whose global name matches the pref + if ([globalName isEqualToString:keymapPref]) + { + [keymapPopup selectItemAtIndex:i]; + } + } + + // other widgets + [highlightColourWell setColor:[defaults colorForKey:kHighlightColourPrefKey]]; + [floatWindowCheckbox setIntValue:[defaults boolForKey:kFloatWindowPrefKey]]; + BOOL isUsingHotKeys = [defaults boolForKey:kUseHotKeysPrefKey]; + [useHotKeysCheckbox setIntValue:isUsingHotKeys]; + [windowTransparencySlider setFloatValue:(1.0 - [defaults floatForKey:kWindowTransparencyPrefKey]) * 100.]; + [solidOnTopCheckbox setIntValue:[defaults boolForKey:kSolidOnTopPrefKey]]; + [showKeyCapsCheckbox setIntValue:[defaults boolForKey:kShowKeyCapsPrefKey]]; + [_clickThroughCheckbox setIntValue:[defaults boolForKey:kClickThroughPrefKey]]; + [self keyboardFloatsDidChange:nil]; + + [_hotKeysOverlaysCheckbox setIntValue:[defaults boolForKey:SHOW_HOT_KEYS_OVERLAYS_PREF_KEY]]; + [_octaveShiftOverlaysCheckbox setIntValue:[defaults boolForKey:SHOW_OCTAVE_SHIFT_OVERLAYS_PREF_KEY]]; + [_velocityOverlaysCheckbox setIntValue:[defaults boolForKey:SHOW_VELOCITY_OVERLAYS_PREF_KEY]]; + + // modifier checkboxes + int modifiers = [defaults integerForKey:kHotKeysModifiersPrefKey]; + BOOL controlChecked = (modifiers & controlKey) > 0; + BOOL shiftChecked = (modifiers & shiftKey) > 0; + BOOL optionChecked = (modifiers & optionKey) > 0; + BOOL commandChecked = (modifiers & cmdKey) > 0; + [controlModifierCheckbox setIntValue:controlChecked]; + [shiftModifierCheckbox setIntValue:shiftChecked]; + [optionModifierCheckbox setIntValue:optionChecked]; + [commandModifierCheckbox setIntValue:commandChecked]; + + // Update toggle hot keys key combo. + NSDictionary * toggleDict = [defaults dictionaryForKey:kToggleHotKeysShortcutPrefKey]; + KeyCombo combo; + if (toggleDict) + { + combo.flags = [_toggleHotKeysShortcut carbonToCocoaFlags:[[toggleDict objectForKey:SHORTCUT_FLAGS_KEY] intValue]]; + combo.code = [[toggleDict objectForKey:SHORTCUT_KEYCODE_KEY] intValue]; + } + else + { + combo.flags = 0; + combo.code = -1; + } + [_toggleHotKeysShortcut setKeyCombo:combo]; +} + +//! @brief Save preferences to defaults and send prefs changed notification. +//! @return A boolean indicating if the window should be closed. +- (BOOL)commitChanges +{ + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + + // hotkeys + BOOL isUsingHotKeys = [useHotKeysCheckbox intValue]; + [defaults setBool:isUsingHotKeys forKey:kUseHotKeysPrefKey]; + + // modifiers + BOOL controlChecked = [controlModifierCheckbox intValue]; + BOOL shiftChecked = [shiftModifierCheckbox intValue]; + BOOL optionChecked = [optionModifierCheckbox intValue]; + BOOL commandChecked = [commandModifierCheckbox intValue]; + + int newModifiers = 0; + if (controlChecked) + { + newModifiers += controlKey; + } + if (shiftChecked) + { + newModifiers += shiftKey; + } + if (optionChecked) + { + newModifiers += optionKey; + } + if (commandChecked) + { + newModifiers += cmdKey; + } + // Default to the Fn key if no other modifiers are set. + if (newModifiers == 0) + { + newModifiers = kEventKeyModifierFnMask; + } + [defaults setInteger:newModifiers forKey:kHotKeysModifiersPrefKey]; + + // show keycaps + [defaults setBool:[showKeyCapsCheckbox intValue] forKey:kShowKeyCapsPrefKey]; + + // float window checkbox + [defaults setBool:[floatWindowCheckbox intValue] forKey:kFloatWindowPrefKey]; + + // solid on top checkbox + [defaults setBool:[solidOnTopCheckbox intValue] forKey:kSolidOnTopPrefKey]; + + // click through checkbox + [defaults setBool:[_clickThroughCheckbox intValue] forKey:kClickThroughPrefKey]; + + // keymap -- the represented object is the nonlocalised keymap name + [defaults setObject:[[keymapPopup selectedItem] representedObject] forKey:kKeyMapPrefKey]; + + // colour + [defaults setColor:[highlightColourWell color] forKey:kHighlightColourPrefKey]; + [defaults setFloat:(1.0 - [windowTransparencySlider floatValue] / 100.) forKey:kWindowTransparencyPrefKey]; + + // overlays + [defaults setBool:[_hotKeysOverlaysCheckbox intValue] forKey:SHOW_HOT_KEYS_OVERLAYS_PREF_KEY]; + [defaults setBool:[_octaveShiftOverlaysCheckbox intValue] forKey:SHOW_OCTAVE_SHIFT_OVERLAYS_PREF_KEY]; + [defaults setBool:[_velocityOverlaysCheckbox intValue] forKey:SHOW_VELOCITY_OVERLAYS_PREF_KEY]; + + // Toggle hot keys shortcut. + KeyCombo combo = [_toggleHotKeysShortcut keyCombo]; + int carbonFlags = [_toggleHotKeysShortcut cocoaToCarbonFlags:combo.flags]; + NSDictionary * comboDict = [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithInt:carbonFlags], SHORTCUT_FLAGS_KEY, + [NSNumber numberWithInt:combo.code], SHORTCUT_KEYCODE_KEY, + nil, nil]; + [defaults setObject:comboDict forKey:kToggleHotKeysShortcutPrefKey]; + + // send notification that the prefs have changed + [[NSNotificationCenter defaultCenter] postNotificationName:kPreferencesChangedNotification object:nil]; + + return YES; +} + +- (IBAction)ok:(id)sender +{ + if ([self commitChanges]) + { + [self close]; + } +} + +- (IBAction)cancel:(id)sender +{ + [self close]; +} + +- (IBAction)keyboardFloatsDidChange:(id)sender +{ + [_clickThroughCheckbox setEnabled:(BOOL)[floatWindowCheckbox intValue]]; +} + +@end + diff --git a/README.md b/README.md new file mode 100644 index 0000000..2dab059 --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +MidiKeys +========== + + diff --git a/ReadMe (Japanese).rtf b/ReadMe (Japanese).rtf new file mode 100644 index 0000000..afa657e --- /dev/null +++ b/ReadMe (Japanese).rtf @@ -0,0 +1,245 @@ +{\rtf1\mac\ansicpg10001\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica-Bold;\f1\fswiss\fcharset77 Helvetica;\f2\fnil\fcharset78 HiraKakuPro-W6; +\f3\fnil\fcharset78 HiraKakuPro-W3;} +{\colortbl;\red255\green255\blue255;} +\vieww12000\viewh13940\viewkind0 +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural + +\f0\b\fs32 \cf0 MidiKeys 1.6 +\f1\b0\fs24 \ + +\fs20 Copyright \'a9 2002-2003 Chris Reed. All rights reserved. +\fs24 \ +\ + +\f0\b\fs26 \ + +\f2 \'83\'43\'83\'93\'83\'67\'83\'8d\'83\'5f\'83\'4e\'83\'56\'83\'87\'83\'93 +\f1\b0\fs24 \ +\ + +\f3\fs22 MidiKeys \'82\'cd\'83\'58\'83\'4e\'83\'8a\'81\'5b\'83\'93\'8f\'e3\'82\'c5\'8f\'ac\'82\'b3\'82\'ad\'83\'4f\'83\'89\'83\'74\'83\'42\'83\'4a\'83\'8b\'82\'c8MIDI\'83\'4c\'81\'5b\'83\'7b\'81\'5b\'83\'68\'82\'cc\'83\'41\'83\'76\'83\'8a\'83\'50\'81\'5b\'83\'56\'83\'87\'83\'93\'82\'c5\'82\'b7\'81\'42\'83\'52\'83\'93\'83\'73\'83\'85\'81\'5b\'83\'5e\'82\'cc\'83\'4c\'81\'5b\'82\'f0\'83\'4e\'83\'8a\'83\'62\'83\'4e\'82\'e0\'82\'b5\'82\'ad\'82\'cd\'83\'5e\'83\'43\'83\'76\'82\'b7\'82\'e9\'82\'b1\'82\'c6\'82\'c5\'91\'49\'91\'f0\'82\'b3\'82\'ea\'82\'bdMIDI\'82\'cc\'91\'97\'90\'4d\'90\'e6\'82\'c9MIDI\'83\'6d\'81\'5b\'83\'67\'82\'f0\'91\'97\'82\'e8\'82\'dc\'82\'b7\'81\'42\'82\'a0\'82\'c8\'82\'bd\'82\'cdMidiKeys\'82\'f0\'8e\'67\'82\'c1\'82\'c4\'82\'c7\'82\'b1\'82\'c5\'82\'c5\'82\'e0\'82\'a0\'82\'c8\'82\'bd\'82\'cc\'8d\'44\'82\'ab\'82\'c8\'83\'56\'81\'5b\'83\'50\'83\'93\'83\'54\'81\'5b\'82\'c6\'91\'67\'82\'dd\'95\'b9\'82\'b9\'82\'c4\'8d\'ec\'8b\'c8\'82\'b7\'82\'e9\'82\'b1\'82\'c6\'82\'aa\'8f\'6f\'97\'88\'82\'dc\'82\'b7\'81\'42\'82\'dc\'82\'bd\'81\'41\'90\'56\'82\'b5\'82\'a2\'83\'5c\'83\'74\'83\'67\'83\'56\'83\'93\'83\'5a\'82\'f0\'8e\'8e\'82\'b7\'82\'b1\'82\'c6\'82\'e0\'8f\'6f\'97\'88\'82\'e9\'82\'c5\'82\'b5\'82\'e5\'82\'a4\'81\'42MidiKeys \'82\'cd\'82\'a2\'82\'eb\'82\'a2\'82\'eb\'82\'c8\'8f\'ea\'96\'ca\'82\'c5\'97\'4c\'8c\'f8\'82\'c8\'83\'63\'81\'5b\'83\'8b\'82\'c5\'82\'b7\'81\'42 +\f1 \ +\ + +\f3 \'82\'a0\'82\'e7\'82\'a9\'82\'b6\'82\'df\'92\'6d\'82\'c1\'82\'c4\'82\'a8\'82\'a2\'82\'c4\'82\'d9\'82\'b5\'82\'a2\'82\'cc\'82\'cdMidiKeys\'82\'cd\'82\'bb\'82\'ea\'8e\'a9\'91\'cc\'82\'aa\'89\'b9\'82\'f0\'8f\'6f\'82\'b7\'82\'ed\'82\'af\'82\'c5\'82\'cd\'82\'c8\'82\'ad\'81\'41\'82\'a0\'82\'ad\'82\'dc\'82\'c5MIDI\'83\'6d\'81\'5b\'83\'67\'83\'43\'83\'78\'83\'93\'83\'67\'82\'f0\'91\'97\'82\'e9\'82\'be\'82\'af\'82\'be\'82\'c6\'8c\'be\'82\'a4\'82\'b1\'82\'c6\'82\'c5\'82\'b7\'81\'42\'82\'a0\'82\'c8\'82\'bd\'82\'cd\'89\'bd\'82\'e7\'82\'a9\'82\'cc\'89\'b9\'82\'f0\'95\'b7\'82\'ad\'82\'c9\'82\'cd\'91\'bc\'82\'ccMIDI\'8b\'40\'8a\'ed\'82\'f0\'90\'da\'91\'b1\'82\'b5\'82\'c8\'82\'af\'82\'ea\'82\'ce\'82\'c8\'82\'e8\'82\'dc\'82\'b9\'82\'f1\'81\'42\'90\'da\'91\'b1\'82\'b7\'82\'e9\'8b\'40\'8a\'ed\'82\'cdUSB MIDI \'83\'43\'83\'93\'83\'5e\'81\'5b\'83\'74\'83\'46\'81\'5b\'83\'58\'82\'f0\'92\'ca\'82\'b5\'82\'c4\'90\'da\'91\'b1\'82\'b3\'82\'ea\'82\'bd\'83\'6e\'81\'5b\'83\'68\'83\'45\'83\'46\'83\'41\'81\'41\'83\'5c\'83\'74\'83\'67\'83\'45\'83\'46\'83\'41\'83\'56\'83\'93\'83\'5a\'83\'54\'83\'43\'83\'55\'81\'5b\'82\'c5\'82\'e0\'82\'a9\'82\'dc\'82\'a2\'82\'dc\'82\'b9\'82\'f1\'81\'42 +\f1 \ + +\f2\b\fs26 \ +\'93\'ae\'8d\'ec\'8a\'c2\'8b\'ab +\f1\b0\fs24 \ +\ + +\f3\fs22 \'81\'45MacOSX 10.2\'88\'c8\'8f\'e3\'82\'cc\'83\'49\'83\'79\'83\'8c\'81\'5b\'83\'65\'83\'42\'83\'93\'83\'4f\'83\'56\'83\'58\'83\'65\'83\'80\ +\'81\'45\'83\'5c\'83\'74\'83\'67\'83\'45\'83\'46\'83\'41\'83\'56\'83\'93\'83\'5a\'83\'54\'83\'43\'83\'55\'81\'5b\'81\'41MIDI\'83\'56\'81\'5b\'83\'50\'83\'93\'83\'54\'81\'5b\'81\'41\'82\'dc\'82\'bd\'82\'cd\'8a\'4f\'95\'94MIDI\'8b\'40\'8a\'ed\'82\'c6MIDI\'83\'43\'83\'93\'83\'5e\'81\'5b\'83\'74\'83\'46\'81\'5b\'83\'58\'81\'42\'8e\'84\'82\'cd +\fs24 Pete Yandell +\fs22 \'82\'aa\'8d\'ec\'82\'c1\'82\'bd" +\f1\fs24 SimpleSynth +\fs22 " +\f3 \'81\'41\'82\'dc\'82\'bd\'82\'cd +\f1\fs24 Robert Grant +\f3\fs22 \'82\'aa\'8d\'ec\'82\'c1\'82\'bd" +\fs24 Rax +\fs22 "\'82\'f0\'82\'a8\'82\'b7\'82\'b7\'82\'df\'82\'b5\'82\'dc\'82\'b7\'81\'42\'82\'bb\'82\'ea\'82\'e7\'82\'cc\'83\'5c\'83\'74\'83\'67\'83\'45\'83\'46\'83\'41\'82\'cd +\f1\fs24 versiontracker.com +\f3\fs22 \'82\'dc\'82\'bd\'82\'cd +\f1\fs24 macupdate.com +\f3\fs22 \'82\'a9\'82\'e7\'8e\'e8\'82\'c9\'93\'fc\'82\'ea\'82\'e9\'82\'b1\'82\'c6\'82\'aa\'8f\'6f\'97\'88\'82\'e9\'82\'c5\'82\'b5\'82\'e5\'82\'a4\'81\'42 +\f1 \ + +\f0\b\fs26 \ + +\f2 \'83\'43\'83\'93\'83\'58\'83\'67\'81\'5b\'83\'8b +\f1\b0\fs24 \ +\ +MidiKeys +\f3\fs22 \'82\'f0\'82\'a0\'82\'c8\'82\'bd\'82\'aa\'91\'49\'82\'f1\'82\'be +\fs24 Applications +\fs22 \'83\'74\'83\'48\'83\'8b\'83\'5f\'81\'5b\'82\'c9\'83\'52\'83\'73\'81\'5b\'82\'b7\'82\'e9\'82\'be\'82\'af\'82\'c5\'82\'b7\'81\'42 +\f1 \ + +\f0\b\fs26 \ +MidiKeys +\f2 \'82\'cc\'8e\'67\'82\'a2\'95\'fb\ + +\f1\b0\fs24 \ + +\f3 MidiKeys +\fs22 \'82\'c9\'82\'cd\'82\'51\'92\'ca\'82\'e8\'82\'cc\'8e\'67\'82\'a2\'95\'fb\'82\'aa\'82\'a0\'82\'e8\'82\'dc\'82\'b7\'81\'42\'82\'dc\'82\'b8\'8e\'6e\'82\'df\'82\'c9\'81\'41 +\fs24 MIDI +\fs22 \'91\'97\'90\'4d\'83\'7c\'81\'5b\'83\'67\'82\'f0"\'89\'bc\'91\'7a +\fs24 MIDI +\fs22 \'83\'7c\'81\'5b\'83\'67"\'82\'c9\'90\'dd\'92\'e8\'8f\'6f\'97\'88\'82\'dc\'82\'b7\'81\'42\'82\'b1\'82\'ea\'82\'cd\'83\'66\'83\'74\'83\'48\'83\'8b\'83\'67\'82\'cc\'91\'97\'90\'4d\'90\'e6\'82\'c5\'82\'b7\'81\'42\'91\'97\'90\'4d\'90\'e6\'82\'c9"\'89\'bc\'91\'7a +\fs24 MIDI +\fs22 \'83\'7c\'81\'5b\'83\'67"\'82\'f0\'91\'49\'82\'d4\'82\'f1\'82\'be\'8f\'ea\'8d\'87\'81\'41 +\fs24 MidiKeys +\fs22 \'82\'cd\'82\'a0\'82\'c8\'82\'bd\'82\'aa\'8e\'67\'82\'c1\'82\'c4\'82\'a2\'82\'e9\'83\'5c\'83\'74\'83\'67\'83\'45\'83\'46\'83\'41\'82\'c5\'93\'fc\'97\'cd\'90\'e6\'82\'c6\'82\'b5\'82\'c4\'91\'49\'82\'ce\'82\'ea\'82\'c8\'82\'ad\'82\'c4\'82\'cd\'82\'c8\'82\'e8\'82\'dc\'82\'b9\'82\'f1\'81\'42\'81\'69\'97\'e1\'81\'46 +\fs24 Ableton +\fs22 +\fs24 Live +\fs22 \'82\'c5\'82\'cd\'81\'41\'8a\'c2\'8b\'ab\'90\'dd\'92\'e8\'82\'f0\'8a\'4a\'82\'ab\'81\'41 +\fs24 Midi/Sync +\fs22 \'83\'5e\'83\'75\'82\'cc" +\fs24 input +\fs22 +\fs24 source +\fs22 "\'83\'7c\'83\'62\'83\'76\'83\'41\'83\'62\'83\'76\'83\'81\'83\'6a\'83\'85\'81\'5b\'82\'a9\'82\'e7 +\fs24 MidiKeys +\fs22 \'82\'aa\'91\'49\'82\'ce\'82\'ea\'82\'c8\'82\'ad\'82\'c4\'82\'cd\'82\'c8\'82\'e8\'82\'dc\'82\'b9\'82\'f1\'81\'42\'81\'6a\ + +\f1 \ + +\f3 \'82\'51\'82\'c2\'96\'da\'82\'cc\'95\'fb\'96\'40\'82\'cd\'81\'41" +\fs24 MIDI +\fs22 \'91\'97\'90\'4d\'83\'7c\'81\'5b\'83\'67"\'82\'c5\'88\'e1\'82\'c1\'82\'bd\'91\'97\'90\'4d\'90\'e6\'82\'f0\'91\'49\'91\'f0\'82\'b7\'82\'e9\'95\'fb\'96\'40\'82\'c5\'82\'b7\'81\'42\'91\'bc\'82\'c5\'93\'ae\'82\'a2\'82\'c4\'82\'e9\'83\'41\'83\'76\'83\'8a\'83\'50\'81\'5b\'83\'56\'83\'87\'83\'93\'82\'c5\'8d\'ec\'82\'e7\'82\'ea\'82\'bd\'89\'bc\'91\'7a\'82\'cc\'91\'97\'90\'4d\'90\'e6\'82\'c6\'93\'af\'82\'b6\'82\'e6\'82\'a4\'82\'c9\'81\'41\'8e\'c0\'8d\'db\'82\'c9\'97\'4c\'82\'e9\'83\'6e\'81\'5b\'83\'68\'83\'45\'83\'46\'83\'41\'82\'cc +\fs24 MIDI +\fs22 \'83\'7c\'81\'5b\'83\'67\'82\'aa\'83\'8a\'83\'58\'83\'67\'82\'c5\'95\'5c\'8e\'a6\'82\'b3\'82\'ea\'82\'c4\'82\'a2\'82\'e9\'82\'c5\'82\'b5\'82\'e5\'82\'a4\'81\'42\'82\'a0\'82\'c8\'82\'bd\'82\'aa\'8e\'67\'97\'70\'82\'b5\'82\'bd\'82\'a2\'83\'41\'83\'76\'83\'8a\'83\'50\'81\'5b\'83\'56\'83\'87\'83\'93\'82\'cd\'82\'b1\'82\'b1\'82\'c5\'83\'8a\'83\'58\'83\'67\'82\'b3\'82\'ea\'82\'e9\'82\'bd\'82\'df\'82\'cc\'89\'bc\'91\'7a\'82\'cc\'91\'97\'90\'4d\'90\'e6\'82\'f0\'8d\'ec\'82\'e7\'82\'c8\'82\'af\'82\'ea\'82\'ce\'82\'c8\'82\'e8\'82\'dc\'82\'b9\'82\'f1\'81\'42 +\f1 \ +\ + +\f3 \'82\'e0\'82\'b5\'82\'a0\'82\'c8\'82\'bd\'82\'aa"\'89\'bc\'91\'7a +\fs24 MIDI +\fs22 \'83\'7c\'81\'5b\'83\'67"\'82\'f0\'97\'70\'82\'a2\'82\'e9\'8f\'ea\'8d\'87\'81\'41\'82\'a2\'82\'ad\'82\'c2\'82\'a9\'82\'cc\'83\'76\'83\'8d\'83\'4f\'83\'89\'83\'80\'82\'c9\'82\'e6\'82\'c1\'82\'c4\'82\'cdMIDI\'83\'7c\'81\'5b\'83\'67\'82\'cc\'83\'8a\'83\'58\'83\'67\'82\'f0\'95\'5c\'8e\'a6\'82\'b7\'82\'e9\'82\'bd\'82\'df\'82\'c9MikiKeys\'82\'f0\'90\'e6\'82\'c9\'8b\'4e\'93\'ae\'82\'b7\'82\'e9\'95\'4b\'97\'76\'82\'aa\'82\'a0\'82\'e9\'82\'c5\'82\'b5\'82\'e5\'82\'a4\'81\'42 +\f1 \ +\ + +\f3\fs24 MidiKeys +\fs22 \'82\'cd\'91\'bc\'82\'cc\'83\'4c\'81\'5b\'83\'7b\'81\'5b\'83\'68\'82\'c5\'83\'76\'83\'8c\'83\'43\'82\'b3\'82\'ea\'82\'bd\'89\'b9\'92\'f6\'82\'f0\'83\'56\'81\'5b\'83\'50\'83\'93\'83\'54\'81\'5b\'82\'c9\'82\'e6\'82\'e9\'83\'41\'83\'45\'83\'67\'83\'76\'83\'62\'83\'67\'82\'f0 +\fs24 MidiKeys +\fs22 \'82\'cc\'83\'4c\'81\'5b\'83\'7b\'81\'5b\'83\'68\'8f\'e3\'82\'c9\'95\'5c\'8e\'a6\'82\'b7\'82\'e9\'82\'b1\'82\'c6\'82\'aa\'8f\'6f\'97\'88\'82\'dc\'82\'b7\'81\'42\'83\'81\'83\'43\'83\'93\'83\'45\'83\'43\'83\'93\'83\'68\'83\'45\'82\'c5\'81\'41" +\fs24 MIDI +\fs22 \'8e\'f3\'90\'4d\'83\'7c\'81\'5b\'83\'67"\'83\'7c\'83\'62\'83\'76\'83\'41\'83\'62\'83\'76\'83\'81\'83\'6a\'83\'85\'81\'5b\'82\'f0\'8e\'67\'82\'c1\'82\'c4\'8e\'f3\'90\'4d\'82\'b5\'82\'bd\'82\'a2 +\fs24 MIDI +\fs22 \'82\'cc\'8e\'f3\'90\'4d\'8c\'b3\'82\'f0\'91\'49\'82\'f1\'82\'c5\'82\'ad\'82\'be\'82\'b3\'82\'a2\'81\'42\'82\'a2\'82\'c1\'82\'bd\'82\'f1\'8e\'f3\'90\'4d\'8c\'b3\'82\'aa\'91\'49\'82\'ce\'82\'ea\'82\'e9\'82\'c6\'93\'fc\'82\'c1\'82\'c4\'82\'ad\'82\'e9\'83\'6d\'81\'5b\'83\'67\'83\'43\'83\'78\'83\'93\'83\'67\'82\'cd +\fs24 MidiKeys +\fs22 \'82\'cc\'8c\'ae\'94\'d5\'82\'c9\'83\'6e\'83\'43\'83\'89\'83\'43\'83\'67\'82\'b3\'82\'ea\'82\'e9\'82\'dc\'82\'b7\'81\'42\'83\'6d\'81\'5b\'83\'67\'83\'43\'83\'78\'83\'93\'83\'67\'82\'cd\'81\'69\'91\'49\'82\'ce\'82\'ea\'82\'bd\'8e\'f3\'90\'4d\'83\'7c\'81\'5b\'83\'67\'82\'cc\'81\'6a\'82\'b7\'82\'d7\'82\'c4\'82\'cc\'83\'60\'83\'83\'83\'93\'83\'6c\'83\'8b\'82\'cc\'83\'6d\'81\'5b\'83\'67\'83\'43\'83\'78\'83\'93\'83\'67\'82\'aa\'95\'5c\'8e\'a6\'82\'b3\'82\'ea\'82\'dc\'82\'b7\'81\'42" +\fs24 MIDI +\fs22 \'8e\'f3\'90\'4d\'83\'7c\'81\'5b\'83\'67"\'83\'7c\'83\'62\'83\'76\'83\'41\'83\'62\'83\'76\'83\'81\'83\'6a\'83\'85\'81\'5b\'82\'cc\'97\'d7\'82\'cc"\'83\'58\'83\'8b\'81\'5b"\'83\'60\'83\'46\'83\'62\'83\'4e\'83\'7b\'83\'62\'83\'4e\'83\'58\'82\'aa\'91\'49\'91\'f0\'82\'b3\'82\'ea\'82\'c4\'82\'a2\'82\'e9\'82\'c6\'81\'41\'93\'fc\'97\'cd\'82\'b3\'82\'ea\'82\'bd\'83\'6d\'81\'5b\'83\'67\'83\'43\'83\'78\'83\'93\'83\'67\'82\'cd +\fs24 MidiKeys +\fs22 \'82\'cc\'8c\'ae\'94\'d5\'82\'c9\'95\'5c\'8e\'a6\'82\'b3\'82\'ea\'81\'41\'91\'97\'90\'4d\'90\'e6\'82\'c9\'8f\'6f\'97\'cd\'82\'b3\'82\'ea\'82\'dc\'82\'b7\'81\'42\ + +\f1 \ + +\f3 \'8c\'ae\'94\'d5\'82\'cc\'92\'e1\'89\'b9\'82\'dc\'82\'bd\'82\'cd\'8d\'82\'89\'b9\'82\'f0\'92\'65\'82\'ad\'82\'c9\'82\'cd\'81\'41" +\fs24 Keys +\fs22 "\'83\'81\'83\'6a\'83\'85\'81\'5b\'82\'cc\'92\'86\'82\'a9\'82\'e7"\'83\'49\'83\'4e\'83\'5e\'81\'5b\'83\'75\'8f\'e3\'82\'b0\'82\'e9""\'83\'49\'83\'4e\'83\'5e\'81\'5b\'83\'75\'89\'ba\'82\'b0\'82\'e9"\'82\'f0\'8e\'67\'82\'a2\'82\'dc\'82\'b7\'81\'42\'8d\'c5\'8d\'82\'82\'c5\'8f\'e3\'89\'ba\'82\'c9\'82\'51\'83\'49\'83\'4e\'83\'5e\'81\'5b\'83\'75\'82\'cc\'88\'da\'93\'ae\'82\'aa\'89\'c2\'94\'5c\'82\'c5\'82\'b7\'81\'42\'93\'af\'82\'b6\'82\'ad" +\fs24 Keys +\fs22 "\'83\'81\'83\'6a\'83\'85\'81\'5b\'82\'cc"\'83\'49\'81\'5b\'83\'8b\'83\'6d\'81\'5b\'83\'67\'83\'49\'83\'74\'82\'f0\'91\'97\'82\'e9"\'83\'52\'83\'7d\'83\'93\'83\'68\'82\'cd\'82\'b7\'82\'d7\'82\'c4\'82\'cc\'8c\'ae\'94\'d5\'82\'c9\'83\'49\'81\'5b\'83\'8b\'83\'6d\'81\'5b\'83\'67\'83\'49\'83\'74\'82\'f0\'91\'97\'82\'e9\'82\'b1\'82\'c6\'82\'aa\'8f\'6f\'97\'88\'82\'dc\'82\'b7\'81\'69\'96\'f3\'8e\'d2\'92\'8d\'81\'46\'89\'b9\'82\'aa\'8f\'6f\'82\'c1\'82\'cf\'82\'c8\'82\'b5\'82\'c5\'8e\'7e\'82\'dc\'82\'e7\'82\'c8\'82\'ad\'82\'c8\'82\'c1\'82\'bd\'82\'c6\'82\'ab\'82\'c8\'82\'c7\'82\'c9\'8e\'67\'82\'a2\'82\'dc\'82\'b7\'81\'6a\'81\'42\'82\'b1\'82\'ea\'82\'cd\'83\'6d\'81\'5b\'83\'67\'8f\'ee\'95\'f1\'82\'aa\'83\'58\'83\'5e\'83\'62\'83\'4e\'82\'b5\'82\'c4\'82\'b5\'82\'dc\'82\'c1\'82\'bd\'8f\'ea\'8d\'87\'82\'c9\'95\'d6\'97\'98\'82\'c5\'82\'b7\'81\'42 +\f1\fs24 \ + +\f0\b\fs26 \ + +\f2 \'8a\'c2\'8b\'ab\'90\'dd\'92\'e8\ + +\f1\b0\fs24 \ + +\f3\fs22 "\'8a\'c2\'8b\'ab\'90\'dd\'92\'e8"\'82\'f0\'8a\'4a\'82\'ad\'82\'c9\'82\'cd\'83\'41\'83\'76\'83\'8a\'83\'50\'81\'5b\'83\'56\'83\'87\'83\'93\'83\'81\'83\'6a\'83\'85\'81\'5b\'82\'a9\'82\'e7"\'8a\'c2\'8b\'ab\'90\'dd\'92\'e8"\'82\'f0\'91\'49\'91\'f0\'82\'b5\'82\'c4\'82\'ad\'82\'be\'82\'b3\'82\'a2\'81\'42\'95\'cf\'8d\'58\'82\'cd\'82\'a0\'82\'c8\'82\'bd\'82\'aa" +\fs24 OK +\fs22 "\'82\'f0\'83\'4e\'83\'8a\'83\'62\'83\'4e\'82\'b7\'82\'e9\'82\'dc\'82\'c5\'93\'4b\'97\'70\'82\'b3\'82\'ea\'82\'dc\'82\'b9\'82\'f1\'82\'b5\'81\'41"\'83\'4c\'83\'83\'83\'93\'83\'5a\'83\'8b"\'82\'aa\'83\'4e\'83\'8a\'83\'62\'83\'4e\'82\'b3\'82\'ea\'82\'bd\'82\'c8\'82\'e7\'82\'e0\'82\'bf\'82\'eb\'82\'f1\'95\'cf\'8d\'58\'82\'cd\'93\'4b\'97\'70\'82\'b3\'82\'ea\'82\'dc\'82\'b9\'82\'f1\'81\'42 +\f1 \ +\ +" +\f3 \'92\'65\'82\'a2\'82\'c4\'82\'a2\'82\'e9\'8c\'ae\'94\'d5\'82\'f0\'8e\'9f\'82\'cc\'90\'46\'82\'c5\'95\'5c\'8e\'a6 +\f1 " +\f3 \'82\'c5\'91\'49\'82\'ce\'82\'ea\'82\'bd\'90\'46\'82\'c5\'89\'89\'91\'74\'92\'86\'82\'cc\'8c\'ae\'94\'d5\'82\'f0\'83\'6e\'83\'43\'83\'89\'83\'43\'83\'67\'82\'b7\'82\'e9\'82\'b1\'82\'c6\'82\'aa\'8f\'6f\'97\'88\'82\'dc\'82\'b7\'81\'42\'82\'dc\'82\'bd\'81\'41\'90\'46\'82\'cc\'93\'a7\'96\'be\'93\'78\'82\'f0\'92\'b2\'90\'ae\'82\'b7\'82\'e9\'82\'b1\'82\'c6\'82\'e0\'8f\'6f\'97\'88\'82\'dc\'82\'b7\'81\'42 +\f1 \ +\ + +\f3 \'90\'56\'82\'bd\'82\'c9\'82\'51\'82\'c2\'82\'cc\'83\'4c\'81\'5b\'83\'7d\'83\'62\'83\'76\'82\'aa\'89\'c1\'82\'ed\'82\'e8\'82\'dc\'82\'b5\'82\'bd\'81\'42\'81\'68\'83\'74\'83\'8b"\'83\'4c\'81\'5b\'83\'7d\'83\'62\'83\'76\'82\'cd\'83\'52\'83\'93\'83\'73\'83\'85\'81\'5b\'83\'5e\'81\'5b\'82\'cc\'83\'4c\'81\'5b\'83\'7b\'81\'5b\'83\'68\'8f\'e3\'82\'c9\'82\'51\'83\'49\'83\'4e\'83\'5e\'81\'5b\'83\'75\'88\'c8\'8f\'e3\'82\'cc\'95\'60\'82\'ab\'82\'dc\'82\'b7\'81\'42 +\f1\fs24 ZXCV +\fs22 +\f3 \'82\'c6 +\f1\fs24 QWER +\fs22 +\f3 \'82\'c5\'8e\'6e\'82\'dc\'82\'e9\'89\'a1\'97\'f1\'82\'cd\'94\'92\'8c\'ae\'82\'c9\'8a\'84\'82\'e8\'93\'96\'82\'c4\'82\'e7\'82\'ea\'81\'41 +\f1\fs24 ASDF +\fs22 +\f3 \'82\'c6 +\f1\fs24 1234 +\fs22 +\f3 \'82\'c5\'8e\'6e\'82\'dc\'82\'e9\'89\'a1\'97\'f1\'82\'cd\'8d\'95\'8c\'ae\'82\'c9\'8a\'84\'82\'e8\'93\'96\'82\'c4\'82\'e7\'82\'ea\'82\'c4\'82\'a2\'82\'dc\'82\'b7\'81\'42"\'83\'56\'83\'93\'83\'4f\'83\'8b\'81\'69\'8e\'e8\'91\'4f\'81\'6a"\'83\'4c\'81\'5b\'83\'7d\'83\'62\'83\'76\'82\'cd +\fs24 Z +\fs22 \'82\'c6 +\fs24 A +\fs22 \'82\'cc\'89\'a1\'97\'f1\'82\'c9\'8a\'84\'82\'e8\'93\'96\'82\'c4\'82\'e7\'82\'ea\'82\'c4\'82\'a2\'82\'dc\'82\'b7\'81\'42\'8c\'ae\'94\'d5\'82\'cc\'94\'7a\'92\'75\'82\'cd"\'83\'74\'83\'8b"\'83\'4c\'81\'5b\'83\'7d\'83\'62\'83\'76\'82\'c6\'93\'af\'82\'b6\'82\'c5\'82\'b7\'82\'aa\'81\'41\'8c\'ae\'94\'d5\'82\'cc\'94\'cd\'88\'cd\'82\'cd\'82\'50\'83\'49\'83\'4e\'83\'5e\'81\'5b\'83\'75\'82\'c5\'82\'b7\'81\'42"\'83\'56\'83\'93\'83\'4f\'83\'8b\'81\'69\'89\'9c\'81\'6a"\'83\'4c\'81\'5b\'83\'7d\'83\'62\'83\'76\'82\'cd"\'83\'56\'83\'93\'83\'4f\'83\'8b\'81\'69\'8e\'e8\'91\'4f\'81\'6a"\'83\'4c\'81\'5b\'83\'7d\'83\'62\'83\'76\'82\'c6\'93\'af\'82\'b6\'83\'49\'83\'4e\'83\'5e\'81\'5b\'83\'75\'82\'f0\'89\'89\'91\'74\'8f\'6f\'97\'88\'82\'dc\'82\'b7\'82\'aa\'81\'41\'91\'e3\'82\'ed\'82\'e8\'82\'c9 +\f1\fs24 QWER +\fs22 +\f3 \'82\'c6 +\fs24 1234 +\fs22 \'82\'cc\'89\'a1\'97\'f1\'82\'f0\'8e\'67\'82\'a2\'82\'dc\'82\'b7\'81\'42"\'83\'74\'83\'8b\'81\'69\'83\'8a\'83\'6f\'81\'5b\'83\'58\'81\'6a"\'83\'4c\'81\'5b\'83\'7d\'83\'62\'83\'76\'82\'cd"\'83\'74\'83\'8b"\'83\'4c\'81\'5b\'83\'7d\'83\'62\'83\'76\'82\'f0\'94\'bd\'93\'5d\'82\'b5\'82\'c4\'82\'a2\'82\'e9\'82\'be\'82\'af\'82\'c5\'82\'b7\'81\'42 +\f1 \ +\ + +\f3 "\'83\'7a\'83\'62\'83\'67\'83\'4c\'81\'5b"\'83\'49\'83\'76\'83\'56\'83\'87\'83\'93\'82\'f0\'91\'49\'91\'f0\'82\'b5\'82\'c4\'82\'a2\'82\'e9\'82\'c6\'81\'41\'91\'bc\'82\'cc\'83\'41\'83\'76\'83\'8a\'83\'50\'81\'5b\'83\'56\'83\'87\'83\'93\'82\'aa\'91\'4f\'96\'ca\'82\'c9\'97\'88\'82\'c4\'82\'a2\'82\'e9\'8d\'db\'82\'c9 +\fs24 MidiKeys +\fs22 \'82\'cc\'8c\'ae\'94\'d5\'82\'f0\'89\'89\'91\'74\'82\'b7\'82\'e9\'82\'b1\'82\'c6\'82\'aa\'8f\'6f\'97\'88\'82\'dc\'82\'b7\'81\'42\'83\'4c\'81\'5b\'83\'7d\'83\'62\'83\'76\'82\'cc\'90\'dd\'92\'e8\'82\'cd\'82\'b1\'82\'b1\'82\'c5\'82\'cc\'89\'89\'91\'74\'82\'c9\'82\'e0\'8a\'d6\'82\'ed\'82\'e8\'82\'dc\'82\'b7\'81\'42\'82\'b7\'82\'d7\'82\'c4\'82\'cc\'83\'4c\'81\'5b\'82\'aa\'83\'7a\'83\'62\'83\'67\'83\'4c\'81\'5b\'82\'c6\'82\'b5\'82\'c4\'8e\'67\'82\'a4\'82\'b1\'82\'c6\'82\'aa\'8f\'6f\'97\'88\'82\'e9\'82\'ed\'82\'af\'82\'cd\'97\'4c\'82\'e8\'82\'dc\'82\'b9\'82\'f1\'81\'42\'82\'bb\'82\'ea\'82\'cd\'82\'a0\'82\'c8\'82\'bd\'82\'aa\'83\'43\'83\'93\'83\'58\'83\'67\'81\'5b\'83\'8b\'82\'b5\'82\'c4\'82\'a2\'82\'e9\'82\'d9\'82\'a9\'82\'cc\'83\'41\'83\'76\'83\'8a\'83\'50\'81\'5b\'83\'56\'83\'87\'83\'93\'82\'c9\'82\'e6\'82\'c1\'82\'c4\'95\'cf\'89\'bb\'82\'b5\'81\'41\'8f\'ea\'8d\'87\'82\'c9\'82\'e6\'82\'c1\'82\'c4\'82\'cd\'83\'7a\'83\'62\'83\'67\'83\'4c\'81\'5b\'82\'cc\'90\'94\'82\'f0\'8c\'b8\'82\'e7\'82\'b7\'95\'4b\'97\'76\'82\'aa\'82\'a0\'82\'e9\'82\'a9\'82\'e0\'82\'b5\'82\'ea\'82\'dc\'82\'b9\'82\'f1\'81\'42 +\f1 \ +\ + +\f3 "\'83\'7a\'83\'62\'83\'67\'83\'4c\'81\'5b"\'83\'60\'83\'46\'83\'62\'83\'4e\'83\'7b\'83\'62\'83\'4e\'83\'58\'82\'cc\'89\'ba\'82\'c9\'97\'4c\'82\'e9\'83\'60\'83\'46\'83\'62\'83\'4e\'83\'7b\'83\'62\'83\'4e\'83\'58\'82\'c5\'82\'c7\'82\'cc\'83\'4c\'81\'5b\'82\'f0\'83\'7a\'83\'62\'83\'67\'83\'4c\'81\'5b\'82\'c6\'82\'b5\'82\'c4\'8b\'96\'89\'c2\'82\'b7\'82\'e9\'82\'a9\'91\'49\'91\'f0\'82\'b7\'82\'e9\'95\'4b\'97\'76\'82\'aa\'82\'a0\'82\'e8\'82\'dc\'82\'b7\'81\'42\'8f\'ad\'82\'c8\'82\'ad\'82\'c6\'82\'e0\'88\'ea\'82\'c2\'82\'cc\'83\'4c\'81\'5b\'82\'aa\'83\'7a\'83\'62\'83\'67\'83\'4c\'81\'5b\'82\'c6\'82\'b5\'82\'c4\'91\'49\'91\'f0\'82\'b3\'82\'ea\'82\'c4\'82\'a2\'96\'b3\'82\'af\'82\'ea\'82\'ce\'82\'c8\'82\'e8\'82\'dc\'82\'b9\'82\'f1\'81\'42\'82\'bd\'82\'be\'82\'b5\'81\'41 +\fs24 caps lock +\fs22 \'82\'cd +\fs24 OS +\fs22 \'82\'c9\'83\'54\'83\'7c\'81\'5b\'83\'67\'82\'b3\'82\'ea\'82\'c4\'82\'a2\'82\'c8\'82\'a2\'8e\'96\'82\'f0\'96\'4b\'82\'cb\'82\'e7\'82\'ea\'82\'e9\'91\'4f\'82\'c9\'82\'a8\'93\'60\'82\'a6\'82\'b5\'82\'c4\'82\'a8\'82\'ab\'82\'dc\'82\'b7\'81\'69\'82\'a8\'82\'bb\'82\'e7\'82\'ad\'8f\'ad\'82\'c8\'82\'ad\'82\'c4\'82\'e0\'88\'ea\'82\'c2\'82\'cc\'83\'7a\'83\'62\'83\'67\'83\'4c\'81\'5b\'82\'aa\'96\'b3\'82\'af\'82\'ea\'82\'ce\'82\'c8\'82\'e7\'82\'c8\'82\'a2\'82\'cc\'82\'c6\'93\'af\'82\'b6\'97\'9d\'97\'52\'82\'c5\'82\'b7\'81\'6a\'81\'42 +\f1 \ +\ + +\f3 \'83\'56\'81\'5b\'83\'50\'83\'93\'83\'54\'81\'5b\'82\'cc\'97\'6c\'82\'c8\'83\'76\'83\'8d\'83\'4f\'83\'89\'83\'80\'82\'cd\'91\'e5\'92\'ef\'82\'cc\'8f\'ea\'8d\'87\'83\'58\'83\'4e\'83\'8a\'81\'5b\'83\'93\'82\'cc\'97\'cc\'88\'e6\'82\'cc\'91\'e5\'95\'94\'95\'aa\'82\'f0\'8e\'67\'82\'c1\'82\'c4\'82\'b5\'82\'dc\'82\'a4\'82\'cc\'82\'c5\'81\'41 +\fs24 MidiKeys +\fs22 \'82\'c9\'82\'cd\'91\'bc\'82\'cc\'82\'b7\'82\'d7\'82\'c4\'82\'cc\'83\'41\'83\'76\'83\'8a\'83\'50\'81\'5b\'83\'56\'83\'87\'83\'93\'82\'cc\'8e\'e8\'91\'4f\'82\'c9\'83\'4c\'81\'5b\'83\'7b\'81\'5b\'83\'68\'83\'45\'83\'43\'83\'93\'83\'68\'83\'45\'82\'f0\'95\'82\'82\'a9\'82\'b9\'82\'c4\'95\'5c\'8e\'a6\'82\'b7\'82\'e9\'83\'49\'83\'76\'83\'56\'83\'87\'83\'93\'82\'aa\'97\'70\'88\'d3\'82\'b3\'82\'ea\'82\'c4\'82\'a2\'82\'dc\'82\'b7\'81\'42\'8f\'ed\'82\'c9\'91\'4f\'96\'ca\'82\'c9\'95\'5c\'8e\'a6\'82\'b7\'82\'e9\'82\'c9\'82\'cd" +\fs24 MidiKeys +\fs22 \'82\'f0\'8f\'ed\'82\'c9\'91\'4f\'96\'ca\'82\'c9\'95\'5c\'8e\'a6"\'83\'60\'83\'46\'83\'62\'83\'4e\'83\'7b\'83\'62\'83\'4e\'83\'58\'82\'f0\'83\'60\'83\'46\'83\'62\'83\'4e\'82\'b5\'82\'c4\'82\'ad\'82\'be\'82\'b3\'82\'a2\'81\'42\'83\'4c\'81\'5b\'83\'7b\'81\'5b\'83\'68\'82\'cc\'83\'45\'83\'43\'83\'93\'83\'68\'83\'45\'82\'cc\'93\'a7\'96\'be\'93\'78\'82\'e0\'83\'58\'83\'89\'83\'43\'83\'5f\'81\'5b\'82\'f0\'8e\'67\'82\'c1\'82\'c4\'90\'dd\'92\'e8\'8f\'6f\'97\'88\'82\'e9\'82\'cc\'82\'c5\'81\'41\'89\'89\'91\'74\'82\'cc\'8a\'d4\'82\'a0\'82\'c8\'82\'bd\'82\'cd\'83\'6f\'83\'62\'83\'4e\'82\'c9\'89\'f4\'82\'c1\'82\'bd\'82\'a0\'82\'c8\'82\'bd\'82\'cc\'83\'41\'83\'76\'83\'8a\'83\'50\'81\'5b\'83\'56\'83\'87\'83\'93\'82\'f1\'82\'aa\'82\'c7\'82\'cc\'82\'e6\'82\'a4\'82\'c9\'93\'ad\'82\'a2\'82\'c4\'82\'a2\'82\'e9\'82\'a9\'82\'f0\'8c\'a9\'82\'e9\'82\'b1\'82\'c6\'82\'aa\'8f\'6f\'97\'88\'82\'dc\'82\'b7\'81\'42" +\fs24 Midikeys +\fs22 \'82\'aa\'91\'4f\'96\'ca\'82\'c9\'82\'a0\'82\'e9\'82\'c6\'82\'ab\'95\'73\'93\'a7\'96\'be\'82\'c9\'82\'b7\'82\'e9"\'83\'49\'83\'76\'83\'56\'83\'87\'83\'93\'82\'cd +\fs24 MidiKeys +\fs22 \'82\'aa\'83\'41\'83\'4e\'83\'65\'83\'42\'83\'75\'82\'c9\'82\'c8\'82\'c1\'82\'bd\'82\'c6\'82\'ab\'82\'c9\'81\'41\'95\'5c\'8e\'a6\'82\'f0\'95\'73\'93\'a7\'96\'be\'82\'c9\'96\'df\'82\'b5\'82\'dc\'82\'b7\'81\'42\'91\'bc\'82\'cc\'83\'41\'83\'76\'83\'8a\'83\'50\'81\'5b\'83\'56\'83\'87\'83\'93\'82\'f0\'91\'4f\'96\'ca\'82\'c9\'8e\'9d\'82\'c1\'82\'c4\'82\'ad\'82\'ea\'82\'ce\'81\'69\'82\'c2\'82\'dc\'82\'e8 +\fs24 MidiKeys +\fs22 \'82\'aa\'94\'f1\'83\'41\'83\'4e\'83\'65\'83\'42\'83\'75\'82\'c9\'82\'c8\'82\'e9\'81\'6a +\fs24 MidiKeys +\fs22 \'82\'cd\'93\'a7\'89\'df\'82\'b3\'82\'ea\'82\'bd\'8f\'f3\'91\'d4\'82\'c9\'96\'df\'82\'e8\'82\'dc\'82\'b7\'81\'42 +\f1 \ + +\f2\b\fs26 \ +\'8e\'fc\'92\'6d\'82\'cc\'96\'e2\'91\'e8\ + +\fs24 \ + +\f3\b0\fs22 \'81\'45\'82\'a2\'82\'ad\'82\'c2\'82\'a9\'82\'cc\'83\'66\'83\'58\'83\'4e\'83\'67\'83\'62\'83\'76\'83\'56\'83\'58\'83\'65\'83\'80\'82\'dc\'82\'bd\'82\'cd\'83\'4c\'81\'5b\'83\'7b\'81\'5b\'83\'68\'82\'c5\'82\'cd\'93\'af\'8e\'9e\'82\'c9\'82\'55\'82\'c2\'91\'c5\'8c\'ae\'82\'dc\'82\'c5\'82\'c9\'90\'a7\'8c\'c0\'82\'b3\'82\'ea\'82\'c4\'82\'a2\'82\'e9\'82\'e6\'82\'a4\'82\'c5\'82\'b7\'81\'42\'82\'b5\'82\'a9\'82\'b5\'81\'41\'8e\'84\'82\'cc +\fs24 PowerBook +\fs22 \'82\'c5\'82\'cd\'8f\'ad\'82\'c8\'82\'ad\'82\'c6\'82\'e0\'93\'af\'8e\'9e\'82\'c9\'82\'57\'82\'c2\'82\'dc\'82\'c5\'82\'cc\'91\'c5\'8c\'ae\'82\'f0\'8f\'88\'97\'9d\'82\'b7\'82\'e9\'82\'b1\'82\'c6\'82\'aa\'8f\'6f\'97\'88\'82\'dc\'82\'b7\'81\'42\ +\'81\'45\'93\'af\'8e\'9e\'82\'cc\'91\'c5\'8c\'ae\'82\'c9\'8a\'d6\'82\'b7\'82\'e9\'83\'6e\'81\'5b\'83\'68\'83\'45\'83\'46\'83\'41\'82\'cc\'8c\'c0\'8a\'45\'82\'f0\'96\'b3\'8e\'8b\'82\'b5\'82\'bd\'82\'c6\'82\'b5\'82\'c4\'82\'e0\'81\'41\'82\'bb\'82\'ea\'82\'bc\'82\'ea\'82\'cc\'83\'4c\'81\'5b\'83\'7b\'81\'5b\'83\'68\'82\'cc\'91\'c5\'8c\'ae\'82\'f0\'8f\'88\'97\'9d\'82\'b7\'82\'e9\'82\'cc\'82\'c9\'81\'4125\'81\'6030\'83\'7e\'83\'8a\'83\'5a\'83\'52\'83\'93\'83\'68\'82\'aa\'95\'4b\'97\'76\'82\'c6\'82\'b3\'82\'ea\'82\'dc\'82\'b7\'81\'42\'82\'be\'82\'a9\'82\'e7\'81\'41\'82\'e0\'82\'b5\'82\'a0\'82\'c8\'82\'bd\'82\'aa\'88\'ea\'93\'78\'82\'c9\'82\'55\'82\'c2\'82\'cc\'83\'4c\'81\'5b\'82\'f0\'89\'9f\'82\'b5\'82\'bd\'82\'c6\'82\'b7\'82\'e9\'82\'c6\'81\'41\'82\'cd\'82\'b6\'82\'df\'82\'cc\'91\'c5\'8c\'ae\'82\'a9\'82\'e7\'8d\'c5\'8c\'e3\'82\'cc\'91\'c5\'8c\'ae\'82\'aa\'8f\'88\'97\'9d\'82\'b3\'82\'ea\'82\'e9\'82\'dc\'82\'c5\'82\'c9\'8f\'ad\'82\'c8\'82\'ad\'82\'c6\'82\'e025*6=150\'83\'7e\'83\'8a\'83\'5a\'83\'52\'83\'93\'83\'68\'8d\'b7\'82\'aa\'90\'b6\'82\'b6\'82\'c4\'82\'b5\'82\'dc\'82\'a2\'82\'dc\'82\'b7\'81\'42\'8e\'84\'82\'cd\'8f\'ab\'97\'88\'82\'cc\'83\'6f\'81\'5b\'83\'57\'83\'87\'83\'93\'82\'c5\'82\'b1\'82\'cc\'96\'e2\'91\'e8\'82\'f0\'89\'f0\'8c\'88\'82\'b7\'82\'e9\'82\'d7\'82\'ad\'8e\'8e\'82\'dd\'82\'c4\'82\'a2\'82\'ab\'82\'dc\'82\'b7\'81\'42\'8a\'4f\'95\'94\'82\'cc +\fs24 MIDI +\fs22 \'8b\'40\'8a\'ed\'82\'c9\'91\'ce\'82\'b5\'82\'c4\'82\'cd\'82\'b1\'82\'cc\'96\'e2\'91\'e8\'82\'cd\'90\'b6\'82\'b6\'82\'dc\'82\'b9\'82\'f1\'81\'42\ +\'81\'45\'82\'a2\'82\'ad\'82\'c2\'82\'a9\'82\'cc\'83\'4c\'81\'5b\'83\'52\'83\'93\'83\'72\'83\'6c\'81\'5b\'83\'56\'83\'87\'83\'93\'82\'cd\'83\'7a\'83\'62\'83\'67\'83\'4c\'81\'5b\'82\'c6\'82\'b5\'82\'c4\'8e\'67\'82\'a4\'82\'b1\'82\'c6\'82\'aa\'8f\'6f\'97\'88\'82\'dc\'82\'b9\'82\'f1\'81\'42\'82\'b1\'82\'cc\'96\'e2\'91\'e8\'82\'cc\'89\'f0\'8c\'88\'82\'c9\'8e\'84\'82\'aa\'8f\'6f\'97\'88\'82\'e9\'8e\'96\'82\'cd\'82\'c8\'82\'b3\'82\'bb\'82\'a4\'82\'c9\'8e\'76\'82\'a6\'82\'dc\'82\'b7\'81\'42\ +\'81\'45\'82\'a2\'82\'ad\'82\'c2\'82\'a9\'82\'cc\'83\'56\'81\'5b\'83\'50\'83\'93\'83\'54\'81\'5b\'83\'41\'83\'76\'83\'8a\'83\'50\'81\'5b\'83\'56\'83\'87\'83\'93\'82\'cd\'82\'c7\'82\'a4\'82\'e2\'82\'e7\'83\'6f\'83\'62\'83\'4e\'83\'4f\'83\'89\'83\'45\'83\'93\'83\'68\'82\'c9\'82\'a2\'82\'e9\'8a\'d4\'82\'cd +\fs24 MIDI +\fs22 \'82\'cc\'8f\'88\'97\'9d\'82\'f0\'8d\'73\'82\'ed\'82\'c8\'82\'a2\'82\'e6\'82\'a4\'82\'c5\'82\'b7\'81\'42\'97\'e1\'82\'a6\'82\'ce\'81\'41 +\fs24 Intuem +\fs22 \'82\'cd\'82\'bb\'82\'cc\'82\'e6\'82\'a4\'82\'c5\'82\'b7\'81\'42\'82\'b1\'82\'cc\'82\'e6\'82\'a4\'82\'c8\'8f\'ea\'8d\'87\'82\'cd\'83\'7a\'83\'62\'83\'67\'83\'4c\'81\'5b\'83\'49\'83\'76\'83\'56\'83\'87\'83\'93\'82\'c6\'83\'4c\'81\'5b\'83\'7b\'81\'5b\'83\'68\'83\'74\'83\'8d\'81\'5b\'83\'65\'83\'42\'83\'93\'83\'4f\'82\'f0\'8e\'67\'82\'c1\'82\'c4\'8d\'ec\'8b\'c6\'82\'b7\'82\'e9\'95\'4b\'97\'76\'82\'aa\'82\'a0\'82\'e8\'82\'dc\'82\'b7\'81\'42 +\f1 \ + +\fs24 \ + +\f2\b\fs26 \'82\'bb\'82\'cc\'91\'bc\'82\'c9\'82\'c2\'82\'a2\'82\'c4 +\f0 \ + +\f1\b0\fs24 \ + +\f3\fs22 \'82\'a0\'82\'c8\'82\'bd\'82\'aa +\fs24 MidiKeys +\fs22 \'82\'f0\'8e\'67\'82\'a4\'82\'c8\'82\'e7\'81\'75\'82\'a0\'82\'c8\'82\'bd\'82\'cc\'83\'8a\'83\'58\'83\'4e\'81\'76\'82\'c5\'8e\'67\'82\'c1\'82\'c4\'82\'ad\'82\'be\'82\'b3\'82\'a2\'81\'42 +\fs24 MidiKeys +\fs22 \'82\'f0\'8e\'67\'82\'c1\'82\'c4\'90\'b6\'82\'b6\'82\'e9\'82\'a2\'82\'a9\'82\'c8\'82\'e9\'96\'e2\'91\'e8\'82\'c9\'91\'ce\'82\'b5\'82\'c4\'8e\'84\'82\'cd\'90\'d3\'94\'43\'82\'f0\'95\'89\'82\'ed\'82\'c8\'82\'a2\'82\'e0\'82\'cc\'82\'c6\'82\'b5\'82\'dc\'82\'b7\'81\'42\'82\'e0\'82\'b5\'81\'41\'82\'a0\'82\'c8\'82\'bd\'82\'aa\'83\'6d\'81\'5b\'83\'67\'83\'70\'83\'5c\'83\'52\'83\'93\'8f\'e3\'82\'c5\'83\'6f\'83\'62\'83\'6e\'82\'f0\'92\'65\'82\'b1\'82\'a4\'82\'c6\'82\'b5\'82\'c4\'8e\'e8\'8d\'aa\'8a\'c7\'8f\'c7\'8c\'f3\'8c\'51\'82\'c9\'82\'c8\'82\'c1\'82\'bd\'82\'c6\'82\'b5\'82\'c4\'82\'e0\'81\'41\'82\'bb\'82\'ea\'82\'cd\'82\'a0\'82\'c8\'82\'bd\'82\'cc\'96\'e2\'91\'e8\'82\'c5\'82\'b7\'81\'42 +\f1 \ +\ + +\fs24 MidiKeys +\f3\fs22 \'82\'cd\'83\'74\'83\'8a\'81\'5b\'83\'45\'83\'46\'83\'41\'82\'c5\'82\'b7\'81\'42\'82\'b5\'82\'a9\'82\'b5\'81\'41\'92\'98\'8d\'ec\'8c\'a0\'82\'cd +\fs24 Chris Reed +\fs22 \'82\'aa\'8f\'8a\'97\'4c\'82\'b5\'82\'c4\'82\'a2\'82\'dc\'82\'b7\'81\'42\'8c\'bb\'8d\'dd\'83\'5c\'81\'5b\'83\'58\'83\'52\'81\'5b\'83\'68\'82\'cc\'8c\'f6\'8a\'4a\'82\'c9\'82\'c2\'82\'a2\'82\'c4\'82\'cd\'8d\'6c\'82\'a6\'82\'c4\'82\'a2\'82\'dc\'82\'b9\'82\'f1\'81\'42\'82\'bb\'82\'ea\'82\'cd\'8f\'ab\'97\'88\'93\'49\'82\'c9\'95\'cf\'89\'bb\'82\'b7\'82\'e9\'82\'a9\'82\'e0\'82\'b5\'82\'ea\'82\'dc\'82\'b9\'82\'f1\'82\'aa\'81\'41\'82\'bb\'82\'ea\'82\'c9\'82\'c2\'82\'a2\'82\'c4\'96\'e2\'82\'a2\'8d\'87\'82\'ed\'82\'b9\'82\'cd\'82\'c8\'82\'b3\'82\'e7\'82\'c8\'82\'a2\'82\'c5\'82\'ad\'82\'be\'82\'b3\'82\'a2\'81\'42 +\f1\fs24 \ +\ +Special thanks to Richard Zelzer and Ralf Welter for providing the German translation, Fr\'8ed\'8eric Ball\'8eriaux for the French localisation, and Hiroshi Yamato (http://salvageship.dropcontrol.com/) for the Japanese translation.\ +\ +I can be reached via email at flit@ftml.net.\ +} \ No newline at end of file diff --git a/ReadMe.rtf b/ReadMe.rtf new file mode 100644 index 0000000..3107453 --- /dev/null +++ b/ReadMe.rtf @@ -0,0 +1,86 @@ +{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\vieww12000\viewh16200\viewkind0 +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural + +\f0\b\fs32 \cf0 MidiKeys 1.8 +\b0\fs24 \ + +\fs20 Copyright \'a9 2002-2010 Immo Software. All rights reserved. +\fs24 \ +\ +\ + +\b\fs26 Introduction +\b0\fs24 \ +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.\ +\ +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.\ +\ + +\b\fs26 Requirements +\b0\fs24 \ +\'95 Mac OS X 10.5 or greater\ +\'95 PowerPC or Intel\ +\'95 Software synthesizer, MIDI sequencer application, or external MIDI device with MIDI interface. Apple\'92s AU Lab is excellent.\ +\ + +\b\fs26 Installation +\b0\fs24 \ +Just copy the MidiKeys program to the Applications folder of your choice.\ +\ + +\b\fs26 Using MidiKeys +\b0\fs24 \ +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.)\ +\ +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.\ +\ +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.\ +\ +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.\ +\ +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.\ +\ +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.\ +\ + +\b\fs26 Preferences +\b0\fs24 \ +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.\ +\ +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.\ +\ +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.\ +\ +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.\ +\ +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.\ +\ +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.\ +\ +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.\ +\ +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.\ +\ +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.\ +\ + +\b\fs26 Known Issues +\b0\fs24 \ +\'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.\ +\'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.\ +\'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.\ +\'95 Some key combinations cannot be used as hot keys. I doubt there's anything I can do about this.\ +\'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.\ +\ + +\b\fs26 Miscellaneous Notes +\b0\fs24 \ +I can be reached via email at flit@ftml.net. MidiKeys is freeware, but it is not in the public domain. At this time, I am not considering releasing the source code.\ +\ +You use MidiKeys at your own risk. I am not responsible for anything that does or does not happen to you or your computer system as a result of using MidiKeys. If you get carpal tunnel syndrome while trying to play Bach on your laptop, that's your problem.\ +\ +\ +} \ No newline at end of file diff --git a/ShortcutRecorder/SRCommon.h b/ShortcutRecorder/SRCommon.h new file mode 100644 index 0000000..ce12ebf --- /dev/null +++ b/ShortcutRecorder/SRCommon.h @@ -0,0 +1,185 @@ +// +// SRCommon.h +// ShortcutRecorder +// +// Copyright 2006-2007 Contributors. All rights reserved. +// +// License: BSD +// +// Contributors: +// David Dauer +// Jesper +// Jamie Kirkpatrick + +#import +#import +#import + +#pragma mark Dummy class + +@interface SRDummyClass : NSObject {} @end + +#pragma mark - +#pragma mark Typedefs + +typedef struct _KeyCombo { + NSUInteger flags; // 0 for no flags + NSInteger code; // -1 for no code +} KeyCombo; + +#pragma mark - +#pragma mark Enums + +// Unicode values of some keyboard glyphs +enum { + KeyboardTabRightGlyph = 0x21E5, + KeyboardTabLeftGlyph = 0x21E4, + KeyboardCommandGlyph = kCommandUnicode, + KeyboardOptionGlyph = kOptionUnicode, + KeyboardShiftGlyph = kShiftUnicode, + KeyboardControlGlyph = kControlUnicode, + KeyboardReturnGlyph = 0x2305, + KeyboardReturnR2LGlyph = 0x21A9, + KeyboardDeleteLeftGlyph = 0x232B, + KeyboardDeleteRightGlyph = 0x2326, + KeyboardPadClearGlyph = 0x2327, + KeyboardLeftArrowGlyph = 0x2190, + KeyboardRightArrowGlyph = 0x2192, + KeyboardUpArrowGlyph = 0x2191, + KeyboardDownArrowGlyph = 0x2193, + KeyboardPageDownGlyph = 0x21DF, + KeyboardPageUpGlyph = 0x21DE, + KeyboardNorthwestArrowGlyph = 0x2196, + KeyboardSoutheastArrowGlyph = 0x2198, + KeyboardEscapeGlyph = 0x238B, + KeyboardHelpGlyph = 0x003F, + KeyboardUpArrowheadGlyph = 0x2303, +}; + +// Special keys +enum { + kSRKeysF1 = 122, + kSRKeysF2 = 120, + kSRKeysF3 = 99, + kSRKeysF4 = 118, + kSRKeysF5 = 96, + kSRKeysF6 = 97, + kSRKeysF7 = 98, + kSRKeysF8 = 100, + kSRKeysF9 = 101, + kSRKeysF10 = 109, + kSRKeysF11 = 103, + kSRKeysF12 = 111, + kSRKeysF13 = 105, + kSRKeysF14 = 107, + kSRKeysF15 = 113, + kSRKeysF16 = 106, + kSRKeysF17 = 64, + kSRKeysF18 = 79, + kSRKeysF19 = 80, + kSRKeysSpace = 49, + kSRKeysDeleteLeft = 51, + kSRKeysDeleteRight = 117, + kSRKeysPadClear = 71, + kSRKeysLeftArrow = 123, + kSRKeysRightArrow = 124, + kSRKeysUpArrow = 126, + kSRKeysDownArrow = 125, + kSRKeysSoutheastArrow = 119, + kSRKeysNorthwestArrow = 115, + kSRKeysEscape = 53, + kSRKeysPageDown = 121, + kSRKeysPageUp = 116, + kSRKeysReturnR2L = 36, + kSRKeysReturn = 76, + kSRKeysTabRight = 48, + kSRKeysHelp = 114 +}; + +#pragma mark - +#pragma mark Macros + +// Localization macros, for use in any bundle +#define SRLoc(key) SRLocalizedString(key, nil) +#define SRLocalizedString(key, comment) NSLocalizedStringFromTableInBundle(key, @"ShortcutRecorder", [NSBundle bundleForClass: [SRDummyClass class]], comment) + +// Image macros, for use in any bundle +//#define SRImage(name) [[[NSImage alloc] initWithContentsOfFile: [[NSBundle bundleForClass: [self class]] pathForImageResource: name]] autorelease] +#define SRResIndImage(name) [SRSharedImageProvider supportingImageWithName:name] +#define SRImage(name) SRResIndImage(name) + +//#define SRCommonWriteDebugImagery + +// Macros for glyps +#define SRInt(x) [NSNumber numberWithInteger:x] +#define SRChar(x) [NSString stringWithFormat: @"%C", x] + +// Some default values +#define ShortcutRecorderEmptyFlags 0 +#define ShortcutRecorderAllFlags ShortcutRecorderEmptyFlags | (NSCommandKeyMask | NSAlternateKeyMask | NSControlKeyMask | NSShiftKeyMask | NSFunctionKeyMask) +#define ShortcutRecorderEmptyCode -1 + +// These keys will cancel the recoding mode if not pressed with any modifier +#define ShortcutRecorderEscapeKey 53 +#define ShortcutRecorderBackspaceKey 51 +#define ShortcutRecorderDeleteKey 117 + +#pragma mark - +#pragma mark Getting a string of the key combination + +// +// ################### +- Returns string from keyCode like NSEvent's -characters +// # EXPLANATORY # | +- Returns string from keyCode like NSEvent's -charactersUsingModifiers +// # CHART # | | +- Returns fully readable and localized name of modifier (if modifier given) +// ################### | | | +- Returns glyph of modifier (if modifier given) +// SRString... X - - X +// SRReadableString... X - X - +// SRCharacter... - X - - +// +NSString * SRStringForKeyCode( NSInteger keyCode ); +NSString * SRStringForCarbonModifierFlags( NSUInteger flags ); +NSString * SRStringForCarbonModifierFlagsAndKeyCode( NSUInteger flags, NSInteger keyCode ); +NSString * SRStringForCocoaModifierFlags( NSUInteger flags ); +NSString * SRStringForCocoaModifierFlagsAndKeyCode( NSUInteger flags, NSInteger keyCode ); +NSString * SRReadableStringForCarbonModifierFlagsAndKeyCode( NSUInteger flags, NSInteger keyCode ); +NSString * SRReadableStringForCocoaModifierFlagsAndKeyCode( NSUInteger flags, NSInteger keyCode ); +NSString *SRCharacterForKeyCodeAndCarbonFlags(NSInteger keyCode, NSUInteger carbonFlags); +NSString *SRCharacterForKeyCodeAndCocoaFlags(NSInteger keyCode, NSUInteger cocoaFlags); + +#pragma mark Converting between Cocoa and Carbon modifier flags + +NSUInteger SRCarbonToCocoaFlags( NSUInteger carbonFlags ); +NSUInteger SRCocoaToCarbonFlags( NSUInteger cocoaFlags ); + +#pragma mark - +#pragma mark Animation pace function + +CGFloat SRAnimationEaseInOut(CGFloat t); + +#pragma mark - +#pragma mark Inlines + +FOUNDATION_STATIC_INLINE KeyCombo SRMakeKeyCombo(NSInteger code, NSUInteger flags) { + KeyCombo kc; + kc.code = code; + kc.flags = flags; + return kc; +} + +FOUNDATION_STATIC_INLINE BOOL SRIsSpecialKey(NSInteger keyCode) { + return (keyCode == kSRKeysF1 || keyCode == kSRKeysF2 || keyCode == kSRKeysF3 || keyCode == kSRKeysF4 || keyCode == kSRKeysF5 || keyCode == kSRKeysF6 || keyCode == kSRKeysF7 || keyCode == kSRKeysF8 || keyCode == kSRKeysF9 || keyCode == kSRKeysF10 || keyCode == kSRKeysF11 || keyCode == kSRKeysF12 || keyCode == kSRKeysF13 || keyCode == kSRKeysF14 || keyCode == kSRKeysF15 || keyCode == kSRKeysF16 || keyCode == kSRKeysSpace || keyCode == kSRKeysDeleteLeft || keyCode == kSRKeysDeleteRight || keyCode == kSRKeysPadClear || keyCode == kSRKeysLeftArrow || keyCode == kSRKeysRightArrow || keyCode == kSRKeysUpArrow || keyCode == kSRKeysDownArrow || keyCode == kSRKeysSoutheastArrow || keyCode == kSRKeysNorthwestArrow || keyCode == kSRKeysEscape || keyCode == kSRKeysPageDown || keyCode == kSRKeysPageUp || keyCode == kSRKeysReturnR2L || keyCode == kSRKeysReturn || keyCode == kSRKeysTabRight || keyCode == kSRKeysHelp); +} + +#pragma mark - +#pragma mark Additions + +@interface NSAlert( SRAdditions ) ++ (NSAlert *) alertWithNonRecoverableError:(NSError *)error; +@end + +#pragma mark - +#pragma mark Image provider + +@interface SRSharedImageProvider : NSObject ++ (NSImage *)supportingImageWithName:(NSString *)name; +@end diff --git a/ShortcutRecorder/SRCommon.m b/ShortcutRecorder/SRCommon.m new file mode 100644 index 0000000..f6261cc --- /dev/null +++ b/ShortcutRecorder/SRCommon.m @@ -0,0 +1,419 @@ +// +// SRCommon.m +// ShortcutRecorder +// +// Copyright 2006-2011 Contributors. All rights reserved. +// +// License: BSD +// +// Contributors: +// David Dauer +// Jesper +// Jamie Kirkpatrick +// Andy Kim + +#import "SRCommon.h" +#import "SRKeyCodeTransformer.h" + +#include + +//#define SRCommon_PotentiallyUsefulDebugInfo + +#ifdef SRCommon_PotentiallyUsefulDebugInfo +#warning 64BIT: Check formatting arguments +#define PUDNSLog(X,...) NSLog(X,##__VA_ARGS__) +#else +#define PUDNSLog(X,...) { ; } +#endif + +#pragma mark - +#pragma mark dummy class + +@implementation SRDummyClass @end + +#pragma mark - + +//---------------------------------------------------------- +// SRStringForKeyCode() +//---------------------------------------------------------- +NSString * SRStringForKeyCode( NSInteger keyCode ) +{ + static SRKeyCodeTransformer *keyCodeTransformer = nil; + if ( !keyCodeTransformer ) + keyCodeTransformer = [[SRKeyCodeTransformer alloc] init]; + return [keyCodeTransformer transformedValue:[NSNumber numberWithShort:keyCode]]; +} + +//---------------------------------------------------------- +// SRStringForCarbonModifierFlags() +//---------------------------------------------------------- +NSString * SRStringForCarbonModifierFlags( NSUInteger flags ) +{ + NSString *modifierFlagsString = [NSString stringWithFormat:@"%@%@%@%@", + ( flags & controlKey ? [NSString stringWithFormat:@"%C", KeyboardControlGlyph] : @"" ), + ( flags & optionKey ? [NSString stringWithFormat:@"%C", KeyboardOptionGlyph] : @"" ), + ( flags & shiftKey ? [NSString stringWithFormat:@"%C", KeyboardShiftGlyph] : @"" ), + ( flags & cmdKey ? [NSString stringWithFormat:@"%C", KeyboardCommandGlyph] : @"" )]; + return modifierFlagsString; +} + +//---------------------------------------------------------- +// SRStringForCarbonModifierFlagsAndKeyCode() +//---------------------------------------------------------- +NSString * SRStringForCarbonModifierFlagsAndKeyCode( NSUInteger flags, NSInteger keyCode ) +{ + return [NSString stringWithFormat: @"%@%@", + SRStringForCarbonModifierFlags( flags ), + SRStringForKeyCode( keyCode )]; +} + +//---------------------------------------------------------- +// SRStringForCocoaModifierFlags() +//---------------------------------------------------------- +NSString * SRStringForCocoaModifierFlags( NSUInteger flags ) +{ + NSString *modifierFlagsString = [NSString stringWithFormat:@"%@%@%@%@", + ( flags & NSControlKeyMask ? [NSString stringWithFormat:@"%C", KeyboardControlGlyph] : @"" ), + ( flags & NSAlternateKeyMask ? [NSString stringWithFormat:@"%C", KeyboardOptionGlyph] : @"" ), + ( flags & NSShiftKeyMask ? [NSString stringWithFormat:@"%C", KeyboardShiftGlyph] : @"" ), + ( flags & NSCommandKeyMask ? [NSString stringWithFormat:@"%C", KeyboardCommandGlyph] : @"" )]; + + return modifierFlagsString; +} + +//---------------------------------------------------------- +// SRStringForCocoaModifierFlagsAndKeyCode() +//---------------------------------------------------------- +NSString * SRStringForCocoaModifierFlagsAndKeyCode( NSUInteger flags, NSInteger keyCode ) +{ + return [NSString stringWithFormat: @"%@%@", + SRStringForCocoaModifierFlags( flags ), + SRStringForKeyCode( keyCode )]; +} + +//---------------------------------------------------------- +// SRReadableStringForCarbonModifierFlagsAndKeyCode() +//---------------------------------------------------------- +NSString * SRReadableStringForCarbonModifierFlagsAndKeyCode( NSUInteger flags, NSInteger keyCode ) +{ + NSString *readableString = [NSString stringWithFormat:@"%@%@%@%@%@", + ( flags & cmdKey ? SRLoc(@"Command + ") : @""), + ( flags & optionKey ? SRLoc(@"Option + ") : @""), + ( flags & controlKey ? SRLoc(@"Control + ") : @""), + ( flags & shiftKey ? SRLoc(@"Shift + ") : @""), + SRStringForKeyCode( keyCode )]; + return readableString; +} + +//---------------------------------------------------------- +// SRReadableStringForCocoaModifierFlagsAndKeyCode() +//---------------------------------------------------------- +NSString * SRReadableStringForCocoaModifierFlagsAndKeyCode( NSUInteger flags, NSInteger keyCode ) +{ + NSString *readableString = [NSString stringWithFormat:@"%@%@%@%@%@", + (flags & NSCommandKeyMask ? SRLoc(@"Command + ") : @""), + (flags & NSAlternateKeyMask ? SRLoc(@"Option + ") : @""), + (flags & NSControlKeyMask ? SRLoc(@"Control + ") : @""), + (flags & NSShiftKeyMask ? SRLoc(@"Shift + ") : @""), + SRStringForKeyCode( keyCode )]; + return readableString; +} + +//---------------------------------------------------------- +// SRCarbonToCocoaFlags() +//---------------------------------------------------------- +NSUInteger SRCarbonToCocoaFlags( NSUInteger carbonFlags ) +{ + NSUInteger cocoaFlags = ShortcutRecorderEmptyFlags; + + if (carbonFlags & cmdKey) cocoaFlags |= NSCommandKeyMask; + if (carbonFlags & optionKey) cocoaFlags |= NSAlternateKeyMask; + if (carbonFlags & controlKey) cocoaFlags |= NSControlKeyMask; + if (carbonFlags & shiftKey) cocoaFlags |= NSShiftKeyMask; + if (carbonFlags & NSFunctionKeyMask) cocoaFlags += NSFunctionKeyMask; + + return cocoaFlags; +} + +//---------------------------------------------------------- +// SRCocoaToCarbonFlags() +//---------------------------------------------------------- +NSUInteger SRCocoaToCarbonFlags( NSUInteger cocoaFlags ) +{ + NSUInteger carbonFlags = ShortcutRecorderEmptyFlags; + + if (cocoaFlags & NSCommandKeyMask) carbonFlags |= cmdKey; + if (cocoaFlags & NSAlternateKeyMask) carbonFlags |= optionKey; + if (cocoaFlags & NSControlKeyMask) carbonFlags |= controlKey; + if (cocoaFlags & NSShiftKeyMask) carbonFlags |= shiftKey; + if (cocoaFlags & NSFunctionKeyMask) carbonFlags |= NSFunctionKeyMask; + + return carbonFlags; +} + +//---------------------------------------------------------- +// SRCharacterForKeyCodeAndCarbonFlags() +//---------------------------------------------------------- +NSString *SRCharacterForKeyCodeAndCarbonFlags(NSInteger keyCode, NSUInteger carbonFlags) { + return SRCharacterForKeyCodeAndCocoaFlags(keyCode, SRCarbonToCocoaFlags(carbonFlags)); +} + +//---------------------------------------------------------- +// SRCharacterForKeyCodeAndCocoaFlags() +//---------------------------------------------------------- +NSString *SRCharacterForKeyCodeAndCocoaFlags(NSInteger keyCode, NSUInteger cocoaFlags) { + + PUDNSLog(@"SRCharacterForKeyCodeAndCocoaFlags, keyCode: %hi, cocoaFlags: %u", + keyCode, cocoaFlags); + + // Fall back to string based on key code: +#define FailWithNaiveString SRStringForKeyCode(keyCode) + + UInt32 deadKeyState; + OSStatus err = noErr; + CFLocaleRef locale = CFLocaleCopyCurrent(); + [(id)CFMakeCollectable(locale) autorelease]; // Autorelease here so that it gets released no matter what + + TISInputSourceRef tisSource = TISCopyCurrentKeyboardInputSource(); + if(!tisSource) + return FailWithNaiveString; + + CFDataRef layoutData = (CFDataRef)TISGetInputSourceProperty(tisSource, kTISPropertyUnicodeKeyLayoutData); + if (!layoutData) + return FailWithNaiveString; + + const UCKeyboardLayout *keyLayout = (const UCKeyboardLayout *)CFDataGetBytePtr(layoutData); + if (!keyLayout) + return FailWithNaiveString; + + EventModifiers modifiers = 0; + if (cocoaFlags & NSAlternateKeyMask) modifiers |= optionKey; + if (cocoaFlags & NSShiftKeyMask) modifiers |= shiftKey; + UniCharCount maxStringLength = 4, actualStringLength; + UniChar unicodeString[4]; + err = UCKeyTranslate( keyLayout, (UInt16)keyCode, kUCKeyActionDisplay, modifiers, LMGetKbdType(), kUCKeyTranslateNoDeadKeysBit, &deadKeyState, maxStringLength, &actualStringLength, unicodeString ); + if(err != noErr) + return FailWithNaiveString; + + CFStringRef temp = CFStringCreateWithCharacters(kCFAllocatorDefault, unicodeString, 1); + CFMutableStringRef mutableTemp = CFStringCreateMutableCopy(kCFAllocatorDefault, 0, temp); + + CFStringCapitalize(mutableTemp, locale); + + NSString *resultString = [NSString stringWithString:(NSString *)mutableTemp]; + + if (temp) CFRelease(temp); + if (mutableTemp) CFRelease(mutableTemp); + + PUDNSLog(@"character: -%@-", (NSString *)resultString); + + return resultString; +} + +#pragma mark Animation Easing + +#define CG_M_PI (CGFloat)M_PI +#define CG_M_PI_2 (CGFloat)M_PI_2 + +#ifdef __LP64__ +#define CGSin(x) sin(x) +#else +#define CGSin(x) sinf(x) +#endif + +// From: http://developer.apple.com/samplecode/AnimatedSlider/ as "easeFunction" +CGFloat SRAnimationEaseInOut(CGFloat t) { + // This function implements a sinusoidal ease-in/ease-out for t = 0 to 1.0. T is scaled to represent the interval of one full period of the sine function, and transposed to lie above the X axis. + CGFloat x = (CGSin((t * CG_M_PI) - CG_M_PI_2) + 1.0f ) / 2.0f; + // NSLog(@"SRAnimationEaseInOut: %f. a: %f, b: %f, c: %f, d: %f, e: %f", t, (t * M_PI), ((t * M_PI) - M_PI_2), sin((t * M_PI) - M_PI_2), (sin((t * M_PI) - M_PI_2) + 1.0), x); + return x; +} + + +#pragma mark - +#pragma mark additions + +@implementation NSAlert( SRAdditions ) + +//---------------------------------------------------------- +// + alertWithNonRecoverableError: +//---------------------------------------------------------- ++ (NSAlert *) alertWithNonRecoverableError:(NSError *)error; +{ + NSString *reason = [error localizedRecoverySuggestion]; + return [self alertWithMessageText:[error localizedDescription] + defaultButton:[[error localizedRecoveryOptions] objectAtIndex:0U] + alternateButton:nil + otherButton:nil + informativeTextWithFormat:(reason ? reason : @"")]; +} + +@end + +static NSMutableDictionary *SRSharedImageCache = nil; + +@interface SRSharedImageProvider (Private) ++ (void)_drawSRSnapback:(id)anNSCustomImageRep; ++ (NSValue *)_sizeSRSnapback; ++ (void)_drawSRRemoveShortcut:(id)anNSCustomImageRep; ++ (NSValue *)_sizeSRRemoveShortcut; ++ (void)_drawSRRemoveShortcutRollover:(id)anNSCustomImageRep; ++ (NSValue *)_sizeSRRemoveShortcutRollover; ++ (void)_drawSRRemoveShortcutPressed:(id)anNSCustomImageRep; ++ (NSValue *)_sizeSRRemoveShortcutPressed; + ++ (void)_drawARemoveShortcutBoxUsingRep:(id)anNSCustomImageRep opacity:(CGFloat)opacity; +@end + +@implementation SRSharedImageProvider ++ (NSImage *)supportingImageWithName:(NSString *)name { +// NSLog(@"supportingImageWithName: %@", name); + if (nil == SRSharedImageCache) { + SRSharedImageCache = [[NSMutableDictionary dictionary] retain]; +// NSLog(@"inited cache"); + } + NSImage *cachedImage = nil; + if (nil != (cachedImage = [SRSharedImageCache objectForKey:name])) { +// NSLog(@"returned cached image: %@", cachedImage); + return cachedImage; + } + +// NSLog(@"constructing image"); + NSSize size; + NSValue *sizeValue = [self performSelector:NSSelectorFromString([NSString stringWithFormat:@"_size%@", name])]; + size = [sizeValue sizeValue]; +// NSLog(@"size: %@", NSStringFromSize(size)); + + NSCustomImageRep *customImageRep = [[NSCustomImageRep alloc] initWithDrawSelector:NSSelectorFromString([NSString stringWithFormat:@"_draw%@:", name]) delegate:self]; + [customImageRep setSize:size]; +// NSLog(@"created customImageRep: %@", customImageRep); + NSImage *returnImage = [[NSImage alloc] initWithSize:size]; + [returnImage addRepresentation:customImageRep]; + [customImageRep release]; + [returnImage setScalesWhenResized:YES]; + [SRSharedImageCache setObject:returnImage forKey:name]; + +#ifdef SRCommonWriteDebugImagery + + NSData *tiff = [returnImage TIFFRepresentation]; + [tiff writeToURL:[NSURL fileURLWithPath:[[NSString stringWithFormat:@"~/Desktop/m_%@.tiff", name] stringByExpandingTildeInPath]] atomically:YES]; + + NSSize sizeQDRPL = NSMakeSize(size.width*4.0,size.height*4.0); + +// sizeQDRPL = NSMakeSize(70.0,70.0); + NSCustomImageRep *customImageRepQDRPL = [[NSCustomImageRep alloc] initWithDrawSelector:NSSelectorFromString([NSString stringWithFormat:@"_draw%@:", name]) delegate:self]; + [customImageRepQDRPL setSize:sizeQDRPL]; +// NSLog(@"created customImageRepQDRPL: %@", customImageRepQDRPL); + NSImage *returnImageQDRPL = [[NSImage alloc] initWithSize:sizeQDRPL]; + [returnImageQDRPL addRepresentation:customImageRepQDRPL]; + [customImageRepQDRPL release]; + [returnImageQDRPL setScalesWhenResized:YES]; + [returnImageQDRPL setFlipped:YES]; + NSData *tiffQDRPL = [returnImageQDRPL TIFFRepresentation]; + [tiffQDRPL writeToURL:[NSURL fileURLWithPath:[[NSString stringWithFormat:@"~/Desktop/m_QDRPL_%@.tiff", name] stringByExpandingTildeInPath]] atomically:YES]; + +#endif + +// NSLog(@"returned image: %@", returnImage); + return [returnImage autorelease]; +} +@end + +@implementation SRSharedImageProvider (Private) + +#define MakeRelativePoint(x,y) NSMakePoint(x*hScale, y*vScale) + ++ (NSValue *)_sizeSRSnapback { + return [NSValue valueWithSize:NSMakeSize(14.0f,14.0f)]; +} ++ (void)_drawSRSnapback:(id)anNSCustomImageRep { + +// NSLog(@"drawSRSnapback using: %@", anNSCustomImageRep); + + NSCustomImageRep *rep = anNSCustomImageRep; + NSSize size = [rep size]; + [[NSColor whiteColor] setFill]; + CGFloat hScale = (size.width/1.0f); + CGFloat vScale = (size.height/1.0f); + + NSBezierPath *bp = [[NSBezierPath alloc] init]; + [bp setLineWidth:hScale]; + + [bp moveToPoint:MakeRelativePoint(0.0489685f, 0.6181513f)]; + [bp lineToPoint:MakeRelativePoint(0.4085750f, 0.9469318f)]; + [bp lineToPoint:MakeRelativePoint(0.4085750f, 0.7226146f)]; + [bp curveToPoint:MakeRelativePoint(0.8508247f, 0.4836237f) controlPoint1:MakeRelativePoint(0.4085750f, 0.7226146f) controlPoint2:MakeRelativePoint(0.8371143f, 0.7491841f)]; + [bp curveToPoint:MakeRelativePoint(0.5507195f, 0.0530682f) controlPoint1:MakeRelativePoint(0.8677834f, 0.1545071f) controlPoint2:MakeRelativePoint(0.5507195f, 0.0530682f)]; + [bp curveToPoint:MakeRelativePoint(0.7421721f, 0.3391942f) controlPoint1:MakeRelativePoint(0.5507195f, 0.0530682f) controlPoint2:MakeRelativePoint(0.7458685f, 0.1913146f)]; + [bp curveToPoint:MakeRelativePoint(0.4085750f, 0.5154130f) controlPoint1:MakeRelativePoint(0.7383412f, 0.4930328f) controlPoint2:MakeRelativePoint(0.4085750f, 0.5154130f)]; + [bp lineToPoint:MakeRelativePoint(0.4085750f, 0.2654000f)]; + + NSAffineTransform *flip = [[NSAffineTransform alloc] init]; +// [flip translateXBy:0.95f yBy:-1.0f]; + [flip scaleXBy:0.9f yBy:1.0f]; + [flip translateXBy:0.5f yBy:-0.5f]; + + [bp transformUsingAffineTransform:flip]; + + NSShadow *sh = [[NSShadow alloc] init]; + [sh setShadowColor:[[NSColor blackColor] colorWithAlphaComponent:0.45f]]; + [sh setShadowBlurRadius:1.0f]; + [sh setShadowOffset:NSMakeSize(0.0f,-1.0f)]; + [sh set]; + + [bp fill]; + + [bp release]; + [flip release]; + [sh release]; +} + ++ (NSValue *)_sizeSRRemoveShortcut { + return [NSValue valueWithSize:NSMakeSize(14.0f,14.0f)]; +} ++ (NSValue *)_sizeSRRemoveShortcutRollover { return [self _sizeSRRemoveShortcut]; } ++ (NSValue *)_sizeSRRemoveShortcutPressed { return [self _sizeSRRemoveShortcut]; } ++ (void)_drawARemoveShortcutBoxUsingRep:(id)anNSCustomImageRep opacity:(CGFloat)opacity { + +// NSLog(@"drawARemoveShortcutBoxUsingRep: %@ opacity: %f", anNSCustomImageRep, opacity); + + NSCustomImageRep *rep = anNSCustomImageRep; + NSSize size = [rep size]; + [[NSColor colorWithCalibratedWhite:0.0f alpha:1.0f-opacity] setFill]; + CGFloat hScale = (size.width/14.0f); + CGFloat vScale = (size.height/14.0f); + + [[NSBezierPath bezierPathWithOvalInRect:NSMakeRect(0.0f,0.0f,size.width,size.height)] fill]; + + [[NSColor whiteColor] setStroke]; + + NSBezierPath *cross = [[NSBezierPath alloc] init]; + [cross setLineWidth:hScale*1.2f]; + + [cross moveToPoint:MakeRelativePoint(4.0f,4.0f)]; + [cross lineToPoint:MakeRelativePoint(10.0f,10.0f)]; + [cross moveToPoint:MakeRelativePoint(10.0f,4.0f)]; + [cross lineToPoint:MakeRelativePoint(4.0f,10.0f)]; + + [cross stroke]; + [cross release]; +} ++ (void)_drawSRRemoveShortcut:(id)anNSCustomImageRep { + +// NSLog(@"drawSRRemoveShortcut using: %@", anNSCustomImageRep); + + [self _drawARemoveShortcutBoxUsingRep:anNSCustomImageRep opacity:0.75f]; +} ++ (void)_drawSRRemoveShortcutRollover:(id)anNSCustomImageRep { + +// NSLog(@"drawSRRemoveShortcutRollover using: %@", anNSCustomImageRep); + + [self _drawARemoveShortcutBoxUsingRep:anNSCustomImageRep opacity:0.65f]; +} ++ (void)_drawSRRemoveShortcutPressed:(id)anNSCustomImageRep { + +// NSLog(@"drawSRRemoveShortcutPressed using: %@", anNSCustomImageRep); + + [self _drawARemoveShortcutBoxUsingRep:anNSCustomImageRep opacity:0.55f]; +} +@end diff --git a/ShortcutRecorder/SRKeyCodeTransformer.h b/ShortcutRecorder/SRKeyCodeTransformer.h new file mode 100644 index 0000000..6f252f3 --- /dev/null +++ b/ShortcutRecorder/SRKeyCodeTransformer.h @@ -0,0 +1,16 @@ +// +// SRKeyCodeTransformer.h +// ShortcutRecorder +// +// Copyright 2006-2007 Contributors. All rights reserved. +// +// License: BSD +// +// Contributors: +// David Dauer +// Jesper +// Jamie Kirkpatrick + +#import + +@interface SRKeyCodeTransformer : NSValueTransformer {} @end diff --git a/ShortcutRecorder/SRKeyCodeTransformer.m b/ShortcutRecorder/SRKeyCodeTransformer.m new file mode 100644 index 0000000..f102560 --- /dev/null +++ b/ShortcutRecorder/SRKeyCodeTransformer.m @@ -0,0 +1,241 @@ +// +// SRKeyCodeTransformer.h +// ShortcutRecorder +// +// Copyright 2006-2007 Contributors. All rights reserved. +// +// License: BSD +// +// Contributors: +// David Dauer +// Jesper +// Jamie Kirkpatrick + +#import "SRKeyCodeTransformer.h" +#import +#import +#import "SRCommon.h" + +static NSMutableDictionary *stringToKeyCodeDict = nil; +static NSDictionary *keyCodeToStringDict = nil; +static NSArray *padKeysArray = nil; + +@interface SRKeyCodeTransformer( Private ) ++ (void) regenerateStringToKeyCodeMapping; +@end + +#pragma mark - + +@implementation SRKeyCodeTransformer + +//---------------------------------------------------------- +// initialize +//---------------------------------------------------------- ++ (void) initialize; +{ + if ( self != [SRKeyCodeTransformer class] ) + return; + + // Some keys need a special glyph + keyCodeToStringDict = [[NSDictionary alloc] initWithObjectsAndKeys: + @"F1", SRInt(122), + @"F2", SRInt(120), + @"F3", SRInt(99), + @"F4", SRInt(118), + @"F5", SRInt(96), + @"F6", SRInt(97), + @"F7", SRInt(98), + @"F8", SRInt(100), + @"F9", SRInt(101), + @"F10", SRInt(109), + @"F11", SRInt(103), + @"F12", SRInt(111), + @"F13", SRInt(105), + @"F14", SRInt(107), + @"F15", SRInt(113), + @"F16", SRInt(106), + @"F17", SRInt(64), + @"F18", SRInt(79), + @"F19", SRInt(80), + SRLoc(@"Space"), SRInt(49), + SRChar(KeyboardDeleteLeftGlyph), SRInt(51), + SRChar(KeyboardDeleteRightGlyph), SRInt(117), + SRChar(KeyboardPadClearGlyph), SRInt(71), + SRChar(KeyboardLeftArrowGlyph), SRInt(123), + SRChar(KeyboardRightArrowGlyph), SRInt(124), + SRChar(KeyboardUpArrowGlyph), SRInt(126), + SRChar(KeyboardDownArrowGlyph), SRInt(125), + SRChar(KeyboardSoutheastArrowGlyph), SRInt(119), + SRChar(KeyboardNorthwestArrowGlyph), SRInt(115), + SRChar(KeyboardEscapeGlyph), SRInt(53), + SRChar(KeyboardPageDownGlyph), SRInt(121), + SRChar(KeyboardPageUpGlyph), SRInt(116), + SRChar(KeyboardReturnR2LGlyph), SRInt(36), + SRChar(KeyboardReturnGlyph), SRInt(76), + SRChar(KeyboardTabRightGlyph), SRInt(48), + SRChar(KeyboardHelpGlyph), SRInt(114), + nil]; + + // We want to identify if the key was pressed on the numpad + padKeysArray = [[NSArray alloc] initWithObjects: + SRInt(65), // , + SRInt(67), // * + SRInt(69), // + + SRInt(75), // / + SRInt(78), // - + SRInt(81), // = + SRInt(82), // 0 + SRInt(83), // 1 + SRInt(84), // 2 + SRInt(85), // 3 + SRInt(86), // 4 + SRInt(87), // 5 + SRInt(88), // 6 + SRInt(89), // 7 + SRInt(91), // 8 + SRInt(92), // 9 + nil]; + + // generate the string to keycode mapping dict... + stringToKeyCodeDict = [[NSMutableDictionary alloc] init]; + [self regenerateStringToKeyCodeMapping]; + + [[NSDistributedNotificationCenter defaultCenter] addObserver:self selector:@selector(regenerateStringToKeyCodeMapping) name:(NSString*)kTISNotifySelectedKeyboardInputSourceChanged object:nil]; +} + +//---------------------------------------------------------- +// allowsReverseTransformation +//---------------------------------------------------------- ++ (BOOL) allowsReverseTransformation +{ + return YES; +} + +//---------------------------------------------------------- +// transformedValueClass +//---------------------------------------------------------- ++ (Class) transformedValueClass; +{ + return [NSString class]; +} + + +//---------------------------------------------------------- +// init +//---------------------------------------------------------- +- (id)init +{ + if((self = [super init])) + { + } + return self; +} + +//---------------------------------------------------------- +// dealloc +//---------------------------------------------------------- +- (void)dealloc +{ + [super dealloc]; +} + +//---------------------------------------------------------- +// transformedValue: +//---------------------------------------------------------- +- (id) transformedValue:(id)value +{ + if ( ![value isKindOfClass:[NSNumber class]] ) + return nil; + + // Can be -1 when empty + NSInteger keyCode = [value shortValue]; + if ( keyCode < 0 ) return nil; + + // We have some special gylphs for some special keys... + NSString *unmappedString = [keyCodeToStringDict objectForKey: SRInt( keyCode )]; + if ( unmappedString != nil ) return unmappedString; + + BOOL isPadKey = [padKeysArray containsObject: SRInt( keyCode )]; + + OSStatus err; + TISInputSourceRef tisSource = TISCopyCurrentKeyboardInputSource(); + if(!tisSource) return nil; + + CFDataRef layoutData; + UInt32 keysDown = 0; + layoutData = (CFDataRef)TISGetInputSourceProperty(tisSource, kTISPropertyUnicodeKeyLayoutData); + + CFRelease(tisSource); + + // For non-unicode layouts such as Chinese, Japanese, and Korean, get the ASCII capable layout + if(!layoutData) { + tisSource = TISCopyCurrentASCIICapableKeyboardLayoutInputSource(); + layoutData = (CFDataRef)TISGetInputSourceProperty(tisSource, kTISPropertyUnicodeKeyLayoutData); + CFRelease(tisSource); + } + + if (!layoutData) return nil; + + const UCKeyboardLayout *keyLayout = (const UCKeyboardLayout *)CFDataGetBytePtr(layoutData); + + UniCharCount length = 4, realLength; + UniChar chars[4]; + + err = UCKeyTranslate( keyLayout, + keyCode, + kUCKeyActionDisplay, + 0, + LMGetKbdType(), + kUCKeyTranslateNoDeadKeysBit, + &keysDown, + length, + &realLength, + chars); + + if ( err != noErr ) return nil; + + NSString *keyString = [[NSString stringWithCharacters:chars length:1] uppercaseString]; + + return ( isPadKey ? [NSString stringWithFormat: SRLoc(@"Pad %@"), keyString] : keyString ); +} + +//---------------------------------------------------------- +// reverseTransformedValue: +//---------------------------------------------------------- +- (id) reverseTransformedValue:(id)value +{ + if ( ![value isKindOfClass:[NSString class]] ) + return nil; + + // try and retrieve a mapped keycode from the reverse mapping dict... + return [stringToKeyCodeDict objectForKey:value]; +} + +@end + +#pragma mark - + +@implementation SRKeyCodeTransformer( Private ) + +//---------------------------------------------------------- +// regenerateStringToKeyCodeMapping: +//---------------------------------------------------------- ++ (void) regenerateStringToKeyCodeMapping; +{ + SRKeyCodeTransformer *transformer = [[[self alloc] init] autorelease]; + [stringToKeyCodeDict removeAllObjects]; + + // loop over every keycode (0 - 127) finding its current string mapping... + NSUInteger i; + for ( i = 0U; i < 128U; i++ ) + { + NSNumber *keyCode = [NSNumber numberWithUnsignedInteger:i]; + NSString *string = [transformer transformedValue:keyCode]; + if ( ( string ) && ( [string length] ) ) + { + [stringToKeyCodeDict setObject:keyCode forKey:string]; + } + } +} + +@end diff --git a/ShortcutRecorder/SRRecorderCell.h b/ShortcutRecorder/SRRecorderCell.h new file mode 100644 index 0000000..31b3854 --- /dev/null +++ b/ShortcutRecorder/SRRecorderCell.h @@ -0,0 +1,137 @@ +// +// SRRecorderCell.h +// ShortcutRecorder +// +// Copyright 2006-2007 Contributors. All rights reserved. +// +// License: BSD +// +// Contributors: +// David Dauer +// Jesper +// Jamie Kirkpatrick + +#import +#import "SRCommon.h" + +#define SRMinWidth 50 +#define SRMaxHeight 22 + +#define SRTransitionFPS 30.0f +#define SRTransitionDuration 0.35f +//#define SRTransitionDuration 2.35 +#define SRTransitionFrames (SRTransitionFPS*SRTransitionDuration) +#define SRAnimationAxisIsY YES +#define ShortcutRecorderNewStyleDrawing + +#define SRAnimationOffsetRect(X,Y) (SRAnimationAxisIsY ? NSOffsetRect(X,0.0f,-NSHeight(Y)) : NSOffsetRect(X,NSWidth(Y),0.0f)) + +@class SRRecorderControl, SRValidator; + +enum SRRecorderStyle { + SRGradientBorderStyle = 0, + SRGreyStyle = 1 +}; +typedef enum SRRecorderStyle SRRecorderStyle; + +@interface SRRecorderCell : NSActionCell +{ + NSGradient *recordingGradient; + NSString *autosaveName; + + BOOL isRecording; + BOOL mouseInsideTrackingArea; + BOOL mouseDown; + + SRRecorderStyle style; + + BOOL isAnimating; + CGFloat transitionProgress; + BOOL isAnimatingNow; + BOOL isAnimatingTowardsRecording; + BOOL comboJustChanged; + + NSTrackingRectTag removeTrackingRectTag; + NSTrackingRectTag snapbackTrackingRectTag; + + KeyCombo keyCombo; + BOOL hasKeyChars; + NSString *keyChars; + NSString *keyCharsIgnoringModifiers; + + NSUInteger allowedFlags; + NSUInteger requiredFlags; + NSUInteger recordingFlags; + + BOOL allowsKeyOnly; + BOOL escapeKeysRecord; + + NSSet *cancelCharacterSet; + + SRValidator *validator; + + IBOutlet id delegate; + BOOL globalHotKeys; + void *hotKeyModeToken; +} + +- (void)resetTrackingRects; + +#pragma mark *** Aesthetics *** + ++ (BOOL)styleSupportsAnimation:(SRRecorderStyle)style; + +- (BOOL)animates; +- (void)setAnimates:(BOOL)an; +- (SRRecorderStyle)style; +- (void)setStyle:(SRRecorderStyle)nStyle; + +#pragma mark *** Delegate *** + +- (id)delegate; +- (void)setDelegate:(id)aDelegate; + +#pragma mark *** Responder Control *** + +- (BOOL)becomeFirstResponder; +- (BOOL)resignFirstResponder; + +#pragma mark *** Key Combination Control *** + +- (BOOL)performKeyEquivalent:(NSEvent *)theEvent; +- (void)flagsChanged:(NSEvent *)theEvent; + +- (NSUInteger)allowedFlags; +- (void)setAllowedFlags:(NSUInteger)flags; + +- (NSUInteger)requiredFlags; +- (void)setRequiredFlags:(NSUInteger)flags; + +- (BOOL)allowsKeyOnly; +- (void)setAllowsKeyOnly:(BOOL)nAllowsKeyOnly escapeKeysRecord:(BOOL)nEscapeKeysRecord; +- (BOOL)escapeKeysRecord; + +- (BOOL)canCaptureGlobalHotKeys; +- (void)setCanCaptureGlobalHotKeys:(BOOL)inState; + +- (KeyCombo)keyCombo; +- (void)setKeyCombo:(KeyCombo)aKeyCombo; + +#pragma mark *** Autosave Control *** + +- (NSString *)autosaveName; +- (void)setAutosaveName:(NSString *)aName; + +// Returns the displayed key combination if set +- (NSString *)keyComboString; + +- (NSString *)keyChars; +- (NSString *)keyCharsIgnoringModifiers; + +@end + +// Delegate Methods +@interface NSObject (SRRecorderCellDelegate) +- (BOOL)shortcutRecorderCell:(SRRecorderCell *)aRecorderCell isKeyCode:(NSInteger)keyCode andFlagsTaken:(NSUInteger)flags reason:(NSString **)aReason; +- (void)shortcutRecorderCell:(SRRecorderCell *)aRecorderCell keyComboDidChange:(KeyCombo)newCombo; +@end diff --git a/ShortcutRecorder/SRRecorderCell.m b/ShortcutRecorder/SRRecorderCell.m new file mode 100644 index 0000000..0039258 --- /dev/null +++ b/ShortcutRecorder/SRRecorderCell.m @@ -0,0 +1,1340 @@ +// +// SRRecorderCell.m +// ShortcutRecorder +// +// Copyright 2006-2007 Contributors. All rights reserved. +// +// License: BSD +// +// Contributors: +// David Dauer +// Jesper +// Jamie Kirkpatrick + +#import "SRRecorderCell.h" +#import "SRRecorderControl.h" +#import "SRKeyCodeTransformer.h" +#import "SRValidator.h" + +@interface SRRecorderCell (Private) +- (void)_privateInit; +- (void)_createGradient; +- (void)_setJustChanged; +- (void)_startRecordingTransition; +- (void)_endRecordingTransition; +- (void)_transitionTick; +- (void)_startRecording; +- (void)_endRecording; + +- (BOOL)_effectiveIsAnimating; +- (BOOL)_supportsAnimation; + +- (NSString *)_defaultsKeyForAutosaveName:(NSString *)name; +- (void)_saveKeyCombo; +- (void)_loadKeyCombo; + +- (NSRect)_removeButtonRectForFrame:(NSRect)cellFrame; +- (NSRect)_snapbackRectForFrame:(NSRect)cellFrame; + +- (NSUInteger)_filteredCocoaFlags:(NSUInteger)flags; +- (NSUInteger)_filteredCocoaToCarbonFlags:(NSUInteger)cocoaFlags; +- (BOOL)_validModifierFlags:(NSUInteger)flags; + +- (BOOL)_isEmpty; +@end + +#pragma mark - + +@implementation SRRecorderCell + +- (id)init +{ + self = [super init]; + + [self _privateInit]; + + return self; +} + +- (void)dealloc +{ + [validator release]; + + [keyCharsIgnoringModifiers release]; + [keyChars release]; + + [recordingGradient release]; + [autosaveName release]; + + [cancelCharacterSet release]; + + [super dealloc]; +} + +#pragma mark *** Coding Support *** + +- (id)initWithCoder:(NSCoder *)aDecoder +{ + self = [super initWithCoder: aDecoder]; + + [self _privateInit]; + + if ([aDecoder allowsKeyedCoding]) { + autosaveName = [[aDecoder decodeObjectForKey: @"autosaveName"] retain]; + + keyCombo.code = [[aDecoder decodeObjectForKey: @"keyComboCode"] shortValue]; + keyCombo.flags = [[aDecoder decodeObjectForKey: @"keyComboFlags"] unsignedIntegerValue]; + + if ([aDecoder containsValueForKey:@"keyChars"]) { + hasKeyChars = YES; + keyChars = (NSString *)[aDecoder decodeObjectForKey: @"keyChars"]; + keyCharsIgnoringModifiers = (NSString *)[aDecoder decodeObjectForKey: @"keyCharsIgnoringModifiers"]; + } + + allowedFlags = [[aDecoder decodeObjectForKey: @"allowedFlags"] unsignedIntegerValue]; + requiredFlags = [[aDecoder decodeObjectForKey: @"requiredFlags"] unsignedIntegerValue]; + + allowsKeyOnly = [[aDecoder decodeObjectForKey:@"allowsKeyOnly"] boolValue]; + escapeKeysRecord = [[aDecoder decodeObjectForKey:@"escapeKeysRecord"] boolValue]; + isAnimating = [[aDecoder decodeObjectForKey:@"isAnimating"] boolValue]; + + style = [[aDecoder decodeObjectForKey:@"style"] shortValue]; + } else { + autosaveName = [[aDecoder decodeObject] retain]; + + keyCombo.code = [[aDecoder decodeObject] shortValue]; + keyCombo.flags = [[aDecoder decodeObject] unsignedIntegerValue]; + + allowedFlags = [[aDecoder decodeObject] unsignedIntegerValue]; + requiredFlags = [[aDecoder decodeObject] unsignedIntegerValue]; + } + + allowedFlags |= NSFunctionKeyMask; + + [self _loadKeyCombo]; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder +{ + [super encodeWithCoder: aCoder]; + + if ([aCoder allowsKeyedCoding]) { + [aCoder encodeObject:[self autosaveName] forKey:@"autosaveName"]; + [aCoder encodeObject:[NSNumber numberWithShort: keyCombo.code] forKey:@"keyComboCode"]; + [aCoder encodeObject:[NSNumber numberWithUnsignedInteger:keyCombo.flags] forKey:@"keyComboFlags"]; + + [aCoder encodeObject:[NSNumber numberWithUnsignedInteger:allowedFlags] forKey:@"allowedFlags"]; + [aCoder encodeObject:[NSNumber numberWithUnsignedInteger:requiredFlags] forKey:@"requiredFlags"]; + + if (hasKeyChars) { + [aCoder encodeObject:keyChars forKey:@"keyChars"]; + [aCoder encodeObject:keyCharsIgnoringModifiers forKey:@"keyCharsIgnoringModifiers"]; + } + + [aCoder encodeObject:[NSNumber numberWithBool: allowsKeyOnly] forKey:@"allowsKeyOnly"]; + [aCoder encodeObject:[NSNumber numberWithBool: escapeKeysRecord] forKey:@"escapeKeysRecord"]; + + [aCoder encodeObject:[NSNumber numberWithBool: isAnimating] forKey:@"isAnimating"]; + [aCoder encodeObject:[NSNumber numberWithShort:style] forKey:@"style"]; + } else { + // Unkeyed archiving and encoding is deprecated and unsupported. Use keyed archiving and encoding. + [aCoder encodeObject: [self autosaveName]]; + [aCoder encodeObject: [NSNumber numberWithShort: keyCombo.code]]; + [aCoder encodeObject: [NSNumber numberWithUnsignedInteger: keyCombo.flags]]; + + [aCoder encodeObject: [NSNumber numberWithUnsignedInteger:allowedFlags]]; + [aCoder encodeObject: [NSNumber numberWithUnsignedInteger:requiredFlags]]; + } +} + +- (id)copyWithZone:(NSZone *)zone +{ + SRRecorderCell *cell; + cell = (SRRecorderCell *)[super copyWithZone: zone]; + + cell->recordingGradient = [recordingGradient retain]; + cell->autosaveName = [autosaveName retain]; + + cell->isRecording = isRecording; + cell->mouseInsideTrackingArea = mouseInsideTrackingArea; + cell->mouseDown = mouseDown; + + cell->removeTrackingRectTag = removeTrackingRectTag; + cell->snapbackTrackingRectTag = snapbackTrackingRectTag; + + cell->keyCombo = keyCombo; + + cell->allowedFlags = allowedFlags; + cell->requiredFlags = requiredFlags; + cell->recordingFlags = recordingFlags; + + cell->allowsKeyOnly = allowsKeyOnly; + cell->escapeKeysRecord = escapeKeysRecord; + + cell->isAnimating = isAnimating; + + cell->style = style; + + cell->cancelCharacterSet = [cancelCharacterSet retain]; + + cell->delegate = delegate; + + return cell; +} + +#pragma mark *** Drawing *** + ++ (BOOL)styleSupportsAnimation:(SRRecorderStyle)style { + return (style == SRGreyStyle); +} + +- (BOOL)animates { + return isAnimating; +} + +- (void)setAnimates:(BOOL)an { + isAnimating = an; +} + +- (SRRecorderStyle)style { + return style; +} + +- (void)setStyle:(SRRecorderStyle)nStyle { + switch (nStyle) { + case SRGreyStyle: + style = SRGreyStyle; + break; + case SRGradientBorderStyle: + default: + style = SRGradientBorderStyle; + break; + } +} + +- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView +{ + CGFloat radius = 0; + + if (style == SRGradientBorderStyle) { + + NSRect whiteRect = cellFrame; + NSBezierPath *roundedRect; + + // Draw gradient when in recording mode + if (isRecording) + { + radius = NSHeight(cellFrame) / 2.0f; + roundedRect = [NSBezierPath bezierPathWithRoundedRect:cellFrame xRadius:radius yRadius:radius]; + + // Fill background with gradient + [[NSGraphicsContext currentContext] saveGraphicsState]; + [roundedRect addClip]; + [recordingGradient drawInRect:cellFrame angle:90.0f]; + [[NSGraphicsContext currentContext] restoreGraphicsState]; + + // Highlight if inside or down + if (mouseInsideTrackingArea) + { + [[[NSColor blackColor] colorWithAlphaComponent: (mouseDown ? 0.4f : 0.2f)] set]; + [roundedRect fill]; + } + + // Draw snapback image + NSImage *snapBackArrow = SRResIndImage(@"SRSnapback"); + [snapBackArrow dissolveToPoint:[self _snapbackRectForFrame: cellFrame].origin fraction:1.0f]; + + // Because of the gradient and snapback image, the white rounded rect will be smaller + whiteRect = NSInsetRect(cellFrame, 9.5f, 2.0f); + whiteRect.origin.x -= 7.5f; + } + + // Draw white rounded box + radius = NSHeight(whiteRect) / 2.0f; + roundedRect = [NSBezierPath bezierPathWithRoundedRect:whiteRect xRadius:radius yRadius:radius]; + [[NSGraphicsContext currentContext] saveGraphicsState]; + [roundedRect addClip]; + [[NSColor whiteColor] set]; + [NSBezierPath fillRect: whiteRect]; + + // Draw border and remove badge if needed + if (!isRecording) + { + [[NSColor windowFrameColor] set]; + [roundedRect stroke]; + + // If key combination is set and valid, draw remove image + if (![self _isEmpty] && [self isEnabled]) + { + NSString *removeImageName = [NSString stringWithFormat: @"SRRemoveShortcut%@", (mouseInsideTrackingArea ? (mouseDown ? @"Pressed" : @"Rollover") : (mouseDown ? @"Rollover" : @""))]; + NSImage *removeImage = SRResIndImage(removeImageName); + [removeImage dissolveToPoint:[self _removeButtonRectForFrame: cellFrame].origin fraction:1.0f]; + } + } + + [[NSGraphicsContext currentContext] restoreGraphicsState]; + + // Draw text + NSMutableParagraphStyle *mpstyle = [[[NSParagraphStyle defaultParagraphStyle] mutableCopy] autorelease]; + [mpstyle setLineBreakMode: NSLineBreakByTruncatingTail]; + [mpstyle setAlignment: NSCenterTextAlignment]; + + // Only the KeyCombo should be black and in a bigger font size + BOOL recordingOrEmpty = (isRecording || [self _isEmpty]); + NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys: mpstyle, NSParagraphStyleAttributeName, + [NSFont systemFontOfSize: (recordingOrEmpty ? [NSFont labelFontSize] : [NSFont smallSystemFontSize])], NSFontAttributeName, + (recordingOrEmpty ? [NSColor disabledControlTextColor] : [NSColor blackColor]), NSForegroundColorAttributeName, + nil]; + + NSString *displayString; + + if (isRecording) + { + // Recording, but no modifier keys down + if (![self _validModifierFlags: recordingFlags]) + { + if (mouseInsideTrackingArea) + { + // Mouse over snapback + displayString = SRLoc(@"Use old shortcut"); + } + else + { + // Mouse elsewhere + displayString = SRLoc(@"Type shortcut"); + } + } + else + { + // Display currently pressed modifier keys + displayString = SRStringForCocoaModifierFlags( recordingFlags ); + + // Fall back on 'Type shortcut' if we don't have modifier flags to display; this will happen for the fn key depressed + if (![displayString length]) + { + displayString = SRLoc(@"Type shortcut"); + } + } + } + else + { + // Not recording... + if ([self _isEmpty]) + { + displayString = SRLoc(@"Click to record shortcut"); + } + else + { + // Display current key combination + displayString = [self keyComboString]; + } + } + + // Calculate rect in which to draw the text in... + NSRect textRect = cellFrame; + textRect.size.width -= 6; + textRect.size.width -= ((!isRecording && [self _isEmpty]) ? 6 : (isRecording ? [self _snapbackRectForFrame: cellFrame].size.width : [self _removeButtonRectForFrame: cellFrame].size.width) + 6); + textRect.origin.x += 6; + textRect.origin.y = -(NSMidY(cellFrame) - [displayString sizeWithAttributes: attributes].height/2); + + // Finally draw it + [displayString drawInRect:textRect withAttributes:attributes]; + + // draw a focus ring...? + if ( [self showsFirstResponder] ) + { + [NSGraphicsContext saveGraphicsState]; + NSSetFocusRingStyle(NSFocusRingOnly); + radius = NSHeight(cellFrame) / 2.0f; + [[NSBezierPath bezierPathWithRoundedRect:cellFrame xRadius:radius yRadius:radius] fill]; + [NSGraphicsContext restoreGraphicsState]; + } + + } else { + +// NSRect rawCellFrame = cellFrame; + cellFrame = NSInsetRect(cellFrame,0.5f,0.5f); + + NSRect whiteRect = cellFrame; + NSBezierPath *roundedRect; + + BOOL isVaguelyRecording = isRecording; + CGFloat xanim = 0.0f; + + if (isAnimatingNow) { +// NSLog(@"tp: %f; xanim: %f", transitionProgress, xanim); + xanim = (SRAnimationEaseInOut(transitionProgress)); +// NSLog(@"tp: %f; xanim: %f", transitionProgress, xanim); + } + + CGFloat alphaRecording = 1.0f; CGFloat alphaView = 1.0f; + if (isAnimatingNow && !isAnimatingTowardsRecording) { alphaRecording = 1.0f - xanim; alphaView = xanim; } + if (isAnimatingNow && isAnimatingTowardsRecording) { alphaView = 1.0f - xanim; alphaRecording = xanim; } + + if (isAnimatingNow) { + //NSLog(@"animation step: %f, effective: %f, alpha recording: %f, view: %f", transitionProgress, xanim, alphaRecording, alphaView); + } + + if (isAnimatingNow && isAnimatingTowardsRecording) { + isVaguelyRecording = YES; + } + +// NSAffineTransform *transitionMovement = [NSAffineTransform transform]; + NSAffineTransform *viewportMovement = [NSAffineTransform transform]; + // Draw gradient when in recording mode + if (isVaguelyRecording) + { + if (isAnimatingNow) { +// [transitionMovement translateXBy:(isAnimatingTowardsRecording ? -(NSWidth(cellFrame)*(1.0-xanim)) : +(NSWidth(cellFrame)*xanim)) yBy:0.0]; + if (SRAnimationAxisIsY) { +// [viewportMovement translateXBy:0.0 yBy:(isAnimatingTowardsRecording ? -(NSHeight(cellFrame)*(xanim)) : -(NSHeight(cellFrame)*(1.0-xanim)))]; + [viewportMovement translateXBy:0.0f yBy:(isAnimatingTowardsRecording ? NSHeight(cellFrame)*(xanim) : NSHeight(cellFrame)*(1.0f-xanim))]; + } else { + [viewportMovement translateXBy:(isAnimatingTowardsRecording ? -(NSWidth(cellFrame)*(xanim)) : -(NSWidth(cellFrame)*(1.0f-xanim))) yBy:0.0f]; + } + } else { + if (SRAnimationAxisIsY) { + [viewportMovement translateXBy:0.0f yBy:NSHeight(cellFrame)]; + } else { + [viewportMovement translateXBy:-(NSWidth(cellFrame)) yBy:0.0f]; + } + } + } + + + // Draw white rounded box + radius = NSHeight(whiteRect) / 2.0f; + roundedRect = [NSBezierPath bezierPathWithRoundedRect:whiteRect xRadius:radius yRadius:radius]; + [[NSColor whiteColor] set]; + [[NSGraphicsContext currentContext] saveGraphicsState]; + [roundedRect fill]; + [[NSColor windowFrameColor] set]; + [roundedRect stroke]; + [roundedRect addClip]; + +// if (isVaguelyRecording) + { + NSRect snapBackRect = SRAnimationOffsetRect([self _snapbackRectForFrame: cellFrame],cellFrame); +// NSLog(@"snapbackrect: %@; offset: %@", NSStringFromRect([self _snapbackRectForFrame: cellFrame]), NSStringFromRect(snapBackRect)); + NSPoint correctedSnapBackOrigin = [viewportMovement transformPoint:snapBackRect.origin]; + + NSRect correctedSnapBackRect = snapBackRect; +// correctedSnapBackRect.origin.y = NSMinY(whiteRect); + correctedSnapBackRect.size.height = NSHeight(whiteRect); + correctedSnapBackRect.size.width *= 1.3f; + correctedSnapBackRect.origin.y -= 5.0f; + correctedSnapBackRect.origin.x -= 1.5f; + + correctedSnapBackOrigin.x -= 0.5f; + + correctedSnapBackRect.origin = [viewportMovement transformPoint:correctedSnapBackRect.origin]; + + NSBezierPath *snapBackButton = [NSBezierPath bezierPathWithRect:correctedSnapBackRect]; + [[[[NSColor windowFrameColor] shadowWithLevel:0.2f] colorWithAlphaComponent:alphaRecording] set]; + [snapBackButton stroke]; +// NSLog(@"stroked along path of %@", NSStringFromRect(correctedSnapBackRect)); + + NSGradient *gradient = nil; + if (mouseDown && mouseInsideTrackingArea) { + gradient = [[NSGradient alloc] initWithStartingColor:[NSColor colorWithCalibratedWhite:0.60f alpha:alphaRecording] + endingColor:[NSColor colorWithCalibratedWhite:0.75f alpha:alphaRecording]]; + } + else { + gradient = [[NSGradient alloc] initWithStartingColor:[NSColor colorWithCalibratedWhite:0.75f alpha:alphaRecording] + endingColor:[NSColor colorWithCalibratedWhite:0.90f alpha:alphaRecording]]; + } + CGFloat insetAmount = -([snapBackButton lineWidth]/2.0f); + [gradient drawInRect:NSInsetRect(correctedSnapBackRect, insetAmount, insetAmount) angle:90.0f]; + [gradient release]; + + /* + // Highlight if inside or down + if (mouseInsideTrackingArea) + { + [[[NSColor blackColor] colorWithAlphaComponent: alphaRecording*(mouseDown ? 0.15 : 0.1)] set]; + [snapBackButton fill]; + }*/ + + // Draw snapback image + NSImage *snapBackArrow = SRResIndImage(@"SRSnapback"); + [snapBackArrow dissolveToPoint:correctedSnapBackOrigin fraction:1.0f*alphaRecording]; + } + + // Draw border and remove badge if needed + /* if (!isVaguelyRecording) + { + */ + // If key combination is set and valid, draw remove image + if (![self _isEmpty] && [self isEnabled]) + { + NSString *removeImageName = [NSString stringWithFormat: @"SRRemoveShortcut%@", (mouseInsideTrackingArea ? (mouseDown ? @"Pressed" : @"Rollover") : (mouseDown ? @"Rollover" : @""))]; + NSImage *removeImage = SRResIndImage(removeImageName); + [removeImage dissolveToPoint:[viewportMovement transformPoint:([self _removeButtonRectForFrame: cellFrame].origin)] fraction:alphaView]; + //NSLog(@"drew removeImage with alpha %f", alphaView); + } +// } + + + + // Draw text + NSMutableParagraphStyle *mpstyle = [[[NSParagraphStyle defaultParagraphStyle] mutableCopy] autorelease]; + [mpstyle setLineBreakMode: NSLineBreakByTruncatingTail]; + [mpstyle setAlignment: NSCenterTextAlignment]; + + CGFloat alphaCombo = alphaView; + CGFloat alphaRecordingText = alphaRecording; + if (comboJustChanged) { + alphaCombo = 1.0f; + alphaRecordingText = 0.0f;//(alphaRecordingText/2.0); + } + + + NSString *displayString; + + { + // Only the KeyCombo should be black and in a bigger font size + BOOL recordingOrEmpty = (isVaguelyRecording || [self _isEmpty]); + NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys: mpstyle, NSParagraphStyleAttributeName, + [NSFont systemFontOfSize: (recordingOrEmpty ? [NSFont labelFontSize] : [NSFont smallSystemFontSize])], NSFontAttributeName, + [(recordingOrEmpty ? [NSColor disabledControlTextColor] : [NSColor blackColor]) colorWithAlphaComponent:alphaRecordingText], NSForegroundColorAttributeName, + nil]; + // Recording, but no modifier keys down + if (![self _validModifierFlags: recordingFlags]) + { + if (mouseInsideTrackingArea) + { + // Mouse over snapback + displayString = SRLoc(@"Use old shortcut"); + } + else + { + // Mouse elsewhere + displayString = SRLoc(@"Type shortcut"); + } + } + else + { + // Display currently pressed modifier keys + displayString = SRStringForCocoaModifierFlags( recordingFlags ); + + // Fall back on 'Type shortcut' if we don't have modifier flags to display; this will happen for the fn key depressed + if (![displayString length]) + { + displayString = SRLoc(@"Type shortcut"); + } + } + // Calculate rect in which to draw the text in... + NSRect textRect = SRAnimationOffsetRect(cellFrame,cellFrame); + //NSLog(@"draw record text in rect (preadjusted): %@", NSStringFromRect(textRect)); + textRect.origin.y -= 3.0f; + textRect.origin = [viewportMovement transformPoint:textRect.origin]; + //NSLog(@"draw record text in rect: %@", NSStringFromRect(textRect)); + + + + // Finally draw it + [displayString drawInRect:textRect withAttributes:attributes]; + } + + + { + // Only the KeyCombo should be black and in a bigger font size + NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys: mpstyle, NSParagraphStyleAttributeName, + [NSFont systemFontOfSize: ([self _isEmpty] ? [NSFont labelFontSize] : [NSFont smallSystemFontSize])], NSFontAttributeName, + [([self _isEmpty] ? [NSColor disabledControlTextColor] : [NSColor blackColor]) colorWithAlphaComponent:alphaCombo], NSForegroundColorAttributeName, + nil]; + // Not recording... + if ([self _isEmpty]) + { + displayString = SRLoc(@"Click to record shortcut"); + } + else + { + // Display current key combination + displayString = [self keyComboString]; + } + // Calculate rect in which to draw the text in... + NSRect textRect = cellFrame; + /* textRect.size.width -= 6; + textRect.size.width -= (([self _removeButtonRectForFrame: cellFrame].size.width) + 6); +// textRect.origin.x += 6;*/ +//NSFont *f = [attributes objectForKey:NSFontAttributeName]; +//double lineHeight = [[[NSLayoutManager alloc] init] defaultLineHeightForFont:f]; +// textRect.size.height = lineHeight; + if (!comboJustChanged) { + //NSLog(@"draw view text in rect (pre-adjusted): %@", NSStringFromRect(textRect)); + textRect.origin = [viewportMovement transformPoint:textRect.origin]; + } + textRect.origin.y = NSMinY(textRect)-3.0f;// - ((lineHeight/2.0)+([f descender]/2.0)); + + //NSLog(@"draw view text in rect: %@", NSStringFromRect(textRect)); + + // Finally draw it + [displayString drawInRect:textRect withAttributes:attributes]; + } + + [[NSGraphicsContext currentContext] restoreGraphicsState]; + + // draw a focus ring...? + + if ( [self showsFirstResponder] ) + { + [NSGraphicsContext saveGraphicsState]; + NSSetFocusRingStyle(NSFocusRingOnly); + radius = NSHeight(cellFrame) / 2.0f; + [[NSBezierPath bezierPathWithRoundedRect:cellFrame xRadius:radius yRadius:radius] fill]; + [NSGraphicsContext restoreGraphicsState]; + } + + } +} + +#pragma mark *** Mouse Tracking *** + +- (void)resetTrackingRects +{ + SRRecorderControl *controlView = (SRRecorderControl *)[self controlView]; + NSRect cellFrame = [controlView bounds]; + NSPoint mouseLocation = [controlView convertPoint:[[NSApp currentEvent] locationInWindow] fromView:nil]; + + // We're not to be tracked if we're not enabled + if (![self isEnabled]) + { + if (removeTrackingRectTag != 0) [controlView removeTrackingRect: removeTrackingRectTag]; + if (snapbackTrackingRectTag != 0) [controlView removeTrackingRect: snapbackTrackingRectTag]; + + return; + } + + // We're either in recording or normal display mode + if (!isRecording) + { + // Create and register tracking rect for the remove badge if shortcut is not empty + NSRect removeButtonRect = [self _removeButtonRectForFrame: cellFrame]; + BOOL mouseInside = [controlView mouse:mouseLocation inRect:removeButtonRect]; + + if (removeTrackingRectTag != 0) [controlView removeTrackingRect: removeTrackingRectTag]; + removeTrackingRectTag = [controlView addTrackingRect:removeButtonRect owner:self userData:nil assumeInside:mouseInside]; + + if (mouseInsideTrackingArea != mouseInside) mouseInsideTrackingArea = mouseInside; + } + else + { + // Create and register tracking rect for the snapback badge if we're in recording mode + NSRect snapbackRect = [self _snapbackRectForFrame: cellFrame]; + BOOL mouseInside = [controlView mouse:mouseLocation inRect:snapbackRect]; + + if (snapbackTrackingRectTag != 0) [controlView removeTrackingRect: snapbackTrackingRectTag]; + snapbackTrackingRectTag = [controlView addTrackingRect:snapbackRect owner:self userData:nil assumeInside:mouseInside]; + + if (mouseInsideTrackingArea != mouseInside) mouseInsideTrackingArea = mouseInside; + } +} + +- (void)mouseEntered:(NSEvent *)theEvent +{ + NSView *view = [self controlView]; + + if ([[view window] isKeyWindow] || [view acceptsFirstMouse: theEvent]) + { + mouseInsideTrackingArea = YES; + [view display]; + } +} + +- (void)mouseExited:(NSEvent*)theEvent +{ + NSView *view = [self controlView]; + + if ([[view window] isKeyWindow] || [view acceptsFirstMouse: theEvent]) + { + mouseInsideTrackingArea = NO; + [view display]; + } +} + +- (BOOL)trackMouse:(NSEvent *)theEvent inRect:(NSRect)cellFrame ofView:(SRRecorderControl *)controlView untilMouseUp:(BOOL)flag +{ + NSEvent *currentEvent = theEvent; + NSPoint mouseLocation; + + NSRect trackingRect = (isRecording ? [self _snapbackRectForFrame: cellFrame] : [self _removeButtonRectForFrame: cellFrame]); + NSRect leftRect = cellFrame; + + // Determine the area without any badge + if (!NSEqualRects(trackingRect,NSZeroRect)) leftRect.size.width -= NSWidth(trackingRect) + 4; + + do { + mouseLocation = [controlView convertPoint: [currentEvent locationInWindow] fromView:nil]; + + switch ([currentEvent type]) + { + case NSLeftMouseDown: + { + // Check if mouse is over remove/snapback image + if ([controlView mouse:mouseLocation inRect:trackingRect]) + { + mouseDown = YES; + [controlView setNeedsDisplayInRect: cellFrame]; + } + + break; + } + case NSLeftMouseDragged: + { + // Recheck if mouse is still over the image while dragging + mouseInsideTrackingArea = [controlView mouse:mouseLocation inRect:trackingRect]; + [controlView setNeedsDisplayInRect: cellFrame]; + + break; + } + default: // NSLeftMouseUp + { + mouseDown = NO; + mouseInsideTrackingArea = [controlView mouse:mouseLocation inRect:trackingRect]; + + if (mouseInsideTrackingArea) + { + if (isRecording) + { + // Mouse was over snapback, just redraw + [self _endRecordingTransition]; + } + else + { + // Mouse was over the remove image, reset all + [self setKeyCombo: SRMakeKeyCombo(ShortcutRecorderEmptyCode, ShortcutRecorderEmptyFlags)]; + } + } + else if ([controlView mouse:mouseLocation inRect:leftRect] && !isRecording) + { + if ([self isEnabled]) + { + [self _startRecordingTransition]; + } + /* maybe beep if not editable? + else + { + NSBeep(); + } + */ + } + + // Any click inside will make us firstResponder + if ([self isEnabled]) [[controlView window] makeFirstResponder: controlView]; + + // Reset tracking rects and redisplay + [self resetTrackingRects]; + [controlView setNeedsDisplayInRect: cellFrame]; + + return YES; + } + } + + } while ((currentEvent = [[controlView window] nextEventMatchingMask:(NSLeftMouseDraggedMask | NSLeftMouseUpMask) untilDate:[NSDate distantFuture] inMode:NSEventTrackingRunLoopMode dequeue:YES])); + + return YES; +} + +#pragma mark *** Delegate *** + +- (id)delegate +{ + return delegate; +} + +- (void)setDelegate:(id)aDelegate +{ + delegate = aDelegate; +} + +#pragma mark *** Responder Control *** + +- (BOOL) becomeFirstResponder; +{ + // reset tracking rects and redisplay + [self resetTrackingRects]; + [[self controlView] display]; + + return YES; +} + +- (BOOL)resignFirstResponder; +{ + if (isRecording) { + [self _endRecordingTransition]; + } + + [self resetTrackingRects]; + [[self controlView] display]; + return YES; +} + +#pragma mark *** Key Combination Control *** + +- (BOOL) performKeyEquivalent:(NSEvent *)theEvent +{ + NSUInteger flags = [self _filteredCocoaFlags: [theEvent modifierFlags]]; + NSNumber *keyCodeNumber = [NSNumber numberWithUnsignedShort: [theEvent keyCode]]; + BOOL snapback = [cancelCharacterSet containsObject: keyCodeNumber]; + BOOL validModifiers = [self _validModifierFlags: (snapback) ? [theEvent modifierFlags] : flags]; // Snapback key shouldn't interfer with required flags! + + // Special case for the space key when we aren't recording... + if (!isRecording && [[theEvent characters] isEqualToString:@" "]) { + [self _startRecordingTransition]; + return YES; + } + + // Do something as long as we're in recording mode and a modifier key or cancel key is pressed + if (isRecording && (validModifiers || snapback)) { + if (!snapback || validModifiers) { + BOOL goAhead = YES; + + // Special case: if a snapback key has been entered AND modifiers are deemed valid... + if (snapback && validModifiers) { + // ...AND we're set to allow plain keys + if (allowsKeyOnly) { + // ...AND modifiers are empty, or empty save for the Function key + // (needed, since forward delete is fn+delete on laptops) + if (flags == ShortcutRecorderEmptyFlags || flags == (ShortcutRecorderEmptyFlags | NSFunctionKeyMask)) { + // ...check for behavior in escapeKeysRecord. + if (!escapeKeysRecord) { + goAhead = NO; + } + } + } + } + + if (goAhead) { + + NSString *character = [[theEvent charactersIgnoringModifiers] uppercaseString]; + + // accents like "¬¥" or "`" will be ignored since we don't get a keycode + if ([character length]) { + NSError *error = nil; + + // Check if key combination is already used or not allowed by the delegate + if ( [validator isKeyCode:[theEvent keyCode] + andFlagsTaken:[self _filteredCocoaToCarbonFlags:flags] + error:&error] ) { + // display the error... + NSAlert *alert = [NSAlert alertWithNonRecoverableError:error]; + [alert setAlertStyle:NSCriticalAlertStyle]; + [alert runModal]; + + // Recheck pressed modifier keys + [self flagsChanged: [NSApp currentEvent]]; + + return YES; + } else { + // All ok, set new combination + keyCombo.flags = flags; + keyCombo.code = [theEvent keyCode]; + + hasKeyChars = YES; + keyChars = [[theEvent characters] retain]; + keyCharsIgnoringModifiers = [[theEvent charactersIgnoringModifiers] retain]; +// NSLog(@"keychars: %@, ignoringmods: %@", keyChars, keyCharsIgnoringModifiers); +// NSLog(@"calculated keychars: %@, ignoring: %@", SRStringForKeyCode(keyCombo.code), SRCharacterForKeyCodeAndCocoaFlags(keyCombo.code,keyCombo.flags)); + + // Notify delegate + if (delegate != nil && [delegate respondsToSelector: @selector(shortcutRecorderCell:keyComboDidChange:)]) + [delegate shortcutRecorderCell:self keyComboDidChange:keyCombo]; + + // Save if needed + [self _saveKeyCombo]; + + [self _setJustChanged]; + } + } else { + // invalid character + NSBeep(); + } + } + } + + // reset values and redisplay + recordingFlags = ShortcutRecorderEmptyFlags; + + [self _endRecordingTransition]; + + [self resetTrackingRects]; + [[self controlView] display]; + + return YES; + } else { + //Start recording when the spacebar is pressed while the control is first responder + if (([[[self controlView] window] firstResponder] == [self controlView]) && + ([[theEvent characters] length] && [[theEvent characters] characterAtIndex:0] == 32) && + ([self isEnabled])) + { + [self _startRecordingTransition]; + } + } + + return NO; +} + +- (void)flagsChanged:(NSEvent *)theEvent +{ + if (isRecording) + { + recordingFlags = [self _filteredCocoaFlags: [theEvent modifierFlags]]; + [[self controlView] display]; + } +} + +#pragma mark - + +- (NSUInteger)allowedFlags +{ + return allowedFlags; +} + +- (void)setAllowedFlags:(NSUInteger)flags +{ + allowedFlags = flags; + + // filter new flags and change keycombo if not recording + if (isRecording) + { + recordingFlags = [self _filteredCocoaFlags: [[NSApp currentEvent] modifierFlags]];; + } + else + { + NSUInteger originalFlags = keyCombo.flags; + keyCombo.flags = [self _filteredCocoaFlags: keyCombo.flags]; + + if (keyCombo.flags != originalFlags && keyCombo.code > ShortcutRecorderEmptyCode) + { + // Notify delegate if keyCombo changed + if (delegate != nil && [delegate respondsToSelector: @selector(shortcutRecorderCell:keyComboDidChange:)]) + [delegate shortcutRecorderCell:self keyComboDidChange:keyCombo]; + + // Save if needed + [self _saveKeyCombo]; + } + } + + [[self controlView] display]; +} + +- (BOOL)allowsKeyOnly { + return allowsKeyOnly; +} + +- (BOOL)escapeKeysRecord { + return escapeKeysRecord; +} + +- (void)setAllowsKeyOnly:(BOOL)nAllowsKeyOnly escapeKeysRecord:(BOOL)nEscapeKeysRecord { + allowsKeyOnly = nAllowsKeyOnly; + escapeKeysRecord = nEscapeKeysRecord; +} + +- (NSUInteger)requiredFlags +{ + return requiredFlags; +} + +- (void)setRequiredFlags:(NSUInteger)flags +{ + requiredFlags = flags; + + // filter new flags and change keycombo if not recording + if (isRecording) + { + recordingFlags = [self _filteredCocoaFlags: [[NSApp currentEvent] modifierFlags]]; + } + else + { + NSUInteger originalFlags = keyCombo.flags; + keyCombo.flags = [self _filteredCocoaFlags: keyCombo.flags]; + + if (keyCombo.flags != originalFlags && keyCombo.code > ShortcutRecorderEmptyCode) + { + // Notify delegate if keyCombo changed + if (delegate != nil && [delegate respondsToSelector: @selector(shortcutRecorderCell:keyComboDidChange:)]) + [delegate shortcutRecorderCell:self keyComboDidChange:keyCombo]; + + // Save if needed + [self _saveKeyCombo]; + } + } + + [[self controlView] display]; +} + +- (KeyCombo)keyCombo +{ + return keyCombo; +} + +- (void)setKeyCombo:(KeyCombo)aKeyCombo +{ + keyCombo = aKeyCombo; + keyCombo.flags = [self _filteredCocoaFlags: aKeyCombo.flags]; + + hasKeyChars = NO; + + // Notify delegate + if (delegate != nil && [delegate respondsToSelector: @selector(shortcutRecorderCell:keyComboDidChange:)]) + [delegate shortcutRecorderCell:self keyComboDidChange:keyCombo]; + + // Save if needed + [self _saveKeyCombo]; + + [[self controlView] display]; +} + +- (BOOL)canCaptureGlobalHotKeys +{ + return globalHotKeys; +} + +- (void)setCanCaptureGlobalHotKeys:(BOOL)inState +{ + globalHotKeys = inState; +} + +#pragma mark *** Autosave Control *** + +- (NSString *)autosaveName +{ + return autosaveName; +} + +- (void)setAutosaveName:(NSString *)aName +{ + if (aName != autosaveName) + { + [autosaveName release]; + autosaveName = [aName copy]; + } +} + +#pragma mark - + +- (NSString *)keyComboString +{ + if ([self _isEmpty]) return nil; + + return [NSString stringWithFormat: @"%@%@", + SRStringForCocoaModifierFlags( keyCombo.flags ), + SRStringForKeyCode( keyCombo.code )]; +} + +- (NSString *)keyChars { + if (!hasKeyChars) return SRStringForKeyCode(keyCombo.code); + return keyChars; +} + +- (NSString *)keyCharsIgnoringModifiers { + if (!hasKeyChars) return SRCharacterForKeyCodeAndCocoaFlags(keyCombo.code,keyCombo.flags); + return keyCharsIgnoringModifiers; +} + +@end + +#pragma mark - + +@implementation SRRecorderCell (Private) + +- (void)_privateInit +{ + // init the validator object... + validator = [[SRValidator alloc] initWithDelegate:self]; + + // Allow all modifier keys by default, nothing is required + allowedFlags = ShortcutRecorderAllFlags; + requiredFlags = ShortcutRecorderEmptyFlags; + recordingFlags = ShortcutRecorderEmptyFlags; + + // Create clean KeyCombo + keyCombo.flags = ShortcutRecorderEmptyFlags; + keyCombo.code = ShortcutRecorderEmptyCode; + + keyChars = nil; + keyCharsIgnoringModifiers = nil; + hasKeyChars = NO; + + // These keys will cancel the recoding mode if not pressed with any modifier + cancelCharacterSet = [[NSSet alloc] initWithObjects: [NSNumber numberWithInteger:ShortcutRecorderEscapeKey], + [NSNumber numberWithInteger:ShortcutRecorderBackspaceKey], [NSNumber numberWithInteger:ShortcutRecorderDeleteKey], nil]; + + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + [notificationCenter addObserver:self selector:@selector(_createGradient) name:NSSystemColorsDidChangeNotification object:nil]; // recreate gradient if needed + [self _createGradient]; + + [self _loadKeyCombo]; +} + +- (void)_createGradient +{ + NSColor *gradientStartColor = [[[NSColor alternateSelectedControlColor] shadowWithLevel: 0.2f] colorWithAlphaComponent: 0.9f]; + NSColor *gradientEndColor = [[[NSColor alternateSelectedControlColor] highlightWithLevel: 0.2f] colorWithAlphaComponent: 0.9f]; + + recordingGradient = [[NSGradient alloc] initWithStartingColor:gradientStartColor endingColor:gradientEndColor]; +} + +- (void)_setJustChanged { + comboJustChanged = YES; +} + +- (BOOL)_effectiveIsAnimating { + return (isAnimating && [self _supportsAnimation]); +} + +- (BOOL)_supportsAnimation { + return [[self class] styleSupportsAnimation:style]; +} + +- (void)_startRecordingTransition { + if ([self _effectiveIsAnimating]) { + isAnimatingTowardsRecording = YES; + isAnimatingNow = YES; + transitionProgress = 0.0f; + [[self class] cancelPreviousPerformRequestsWithTarget:self selector:@selector(_transitionTick) object:nil]; + [self performSelector:@selector(_transitionTick) withObject:nil afterDelay:(SRTransitionDuration/SRTransitionFrames)]; +// NSLog(@"start recording-transition"); + } else { + [self _startRecording]; + } +} + +- (void)_endRecordingTransition { + if ([self _effectiveIsAnimating]) { + isAnimatingTowardsRecording = NO; + isAnimatingNow = YES; + transitionProgress = 0.0f; + [[self class] cancelPreviousPerformRequestsWithTarget:self selector:@selector(_transitionTick) object:nil]; + [self performSelector:@selector(_transitionTick) withObject:nil afterDelay:(SRTransitionDuration/SRTransitionFrames)]; +// NSLog(@"end recording-transition"); + } else { + [self _endRecording]; + } +} + +- (void)_transitionTick { + transitionProgress += (1.0f/SRTransitionFrames); +// NSLog(@"transition tick: %f", transitionProgress); + if (transitionProgress >= 0.998f) { +// NSLog(@"transition deemed complete"); + isAnimatingNow = NO; + transitionProgress = 0.0f; + if (isAnimatingTowardsRecording) { + [self _startRecording]; + } else { + [self _endRecording]; + } + } else { +// NSLog(@"more to do"); + [[self controlView] setNeedsDisplay:YES]; + [[self class] cancelPreviousPerformRequestsWithTarget:self selector:@selector(_transitionTick) object:nil]; + [self performSelector:@selector(_transitionTick) withObject:nil afterDelay:(SRTransitionDuration/SRTransitionFrames)]; + } +} + +- (void)_startRecording; +{ + // Jump into recording mode if mouse was inside the control but not over any image + isRecording = YES; + + // Reset recording flags and determine which are required + recordingFlags = [self _filteredCocoaFlags: ShortcutRecorderEmptyFlags]; + +/* [self setFocusRingType:NSFocusRingTypeNone]; + [[self controlView] setFocusRingType:NSFocusRingTypeNone];*/ + [[self controlView] setNeedsDisplay:YES]; + + // invalidate the focus ring rect... + NSView *controlView = [self controlView]; + [controlView setKeyboardFocusRingNeedsDisplayInRect:[controlView bounds]]; + + if (globalHotKeys) hotKeyModeToken = PushSymbolicHotKeyMode(kHIHotKeyModeAllDisabled); +} + +- (void)_endRecording; +{ + isRecording = NO; + comboJustChanged = NO; + +/* [self setFocusRingType:NSFocusRingTypeNone]; + [[self controlView] setFocusRingType:NSFocusRingTypeNone];*/ + [[self controlView] setNeedsDisplay:YES]; + + // invalidate the focus ring rect... + NSView *controlView = [self controlView]; + [controlView setKeyboardFocusRingNeedsDisplayInRect:[controlView bounds]]; + + if (globalHotKeys) PopSymbolicHotKeyMode(hotKeyModeToken); +} + +#pragma mark *** Autosave *** + +- (NSString *)_defaultsKeyForAutosaveName:(NSString *)name +{ + return [NSString stringWithFormat: @"ShortcutRecorder %@", name]; +} + +- (void)_saveKeyCombo +{ + NSString *defaultsKey = [self autosaveName]; + + if (defaultsKey != nil && [defaultsKey length]) + { + id values = [[NSUserDefaultsController sharedUserDefaultsController] values]; + + NSDictionary *defaultsValue = [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithShort: keyCombo.code], @"keyCode", + [NSNumber numberWithUnsignedInteger: keyCombo.flags], @"modifierFlags", // cocoa + [NSNumber numberWithUnsignedInteger:SRCocoaToCarbonFlags(keyCombo.flags)], @"modifiers", // carbon, for compatibility with PTKeyCombo + nil]; + + if (hasKeyChars) { + + NSMutableDictionary *mutableDefaultsValue = [[defaultsValue mutableCopy] autorelease]; + [mutableDefaultsValue setObject:keyChars forKey:@"keyChars"]; + [mutableDefaultsValue setObject:keyCharsIgnoringModifiers forKey:@"keyCharsIgnoringModifiers"]; + + defaultsValue = mutableDefaultsValue; + } + + [values setValue:defaultsValue forKey:[self _defaultsKeyForAutosaveName: defaultsKey]]; + } +} + +- (void)_loadKeyCombo +{ + NSString *defaultsKey = [self autosaveName]; + + if (defaultsKey != nil && [defaultsKey length]) + { + id values = [[NSUserDefaultsController sharedUserDefaultsController] values]; + NSDictionary *savedCombo = [values valueForKey: [self _defaultsKeyForAutosaveName: defaultsKey]]; + + NSInteger keyCode = [[savedCombo valueForKey: @"keyCode"] shortValue]; + NSUInteger flags; + if ((nil == [savedCombo valueForKey:@"modifierFlags"]) && (nil != [savedCombo valueForKey:@"modifiers"])) { // carbon, for compatibility with PTKeyCombo + flags = SRCarbonToCocoaFlags([[savedCombo valueForKey: @"modifiers"] unsignedIntegerValue]); + } else { // cocoa + flags = [[savedCombo valueForKey: @"modifierFlags"] unsignedIntegerValue]; + } + + keyCombo.flags = [self _filteredCocoaFlags: flags]; + keyCombo.code = keyCode; + + NSString *kc = [savedCombo valueForKey: @"keyChars"]; + hasKeyChars = (nil != kc); + if (kc) { + keyCharsIgnoringModifiers = [[savedCombo valueForKey: @"keyCharsIgnoringModifiers"] retain]; + keyChars = [kc retain]; + } + + // Notify delegate + if (delegate != nil && [delegate respondsToSelector: @selector(shortcutRecorderCell:keyComboDidChange:)]) + [delegate shortcutRecorderCell:self keyComboDidChange:keyCombo]; + + [[self controlView] display]; + } +} + +#pragma mark *** Drawing Helpers *** + +- (NSRect)_removeButtonRectForFrame:(NSRect)cellFrame +{ + if ([self _isEmpty] || ![self isEnabled]) return NSZeroRect; + + NSRect removeButtonRect; + NSImage *removeImage = SRResIndImage(@"SRRemoveShortcut"); + + removeButtonRect.origin = NSMakePoint(NSMaxX(cellFrame) - [removeImage size].width - 4, (NSMaxY(cellFrame) - [removeImage size].height)/2); + removeButtonRect.size = [removeImage size]; + + return removeButtonRect; +} + +- (NSRect)_snapbackRectForFrame:(NSRect)cellFrame +{ +// if (!isRecording) return NSZeroRect; + + NSRect snapbackRect; + NSImage *snapbackImage = SRResIndImage(@"SRSnapback"); + + snapbackRect.origin = NSMakePoint(NSMaxX(cellFrame) - [snapbackImage size].width - 2, (NSMaxY(cellFrame) - [snapbackImage size].height)/2 + 1); + snapbackRect.size = [snapbackImage size]; + + return snapbackRect; +} + +#pragma mark *** Filters *** + +- (NSUInteger)_filteredCocoaFlags:(NSUInteger)flags +{ + NSUInteger filteredFlags = ShortcutRecorderEmptyFlags; + NSUInteger a = allowedFlags; + NSUInteger m = requiredFlags; + + if (m & NSCommandKeyMask) filteredFlags |= NSCommandKeyMask; + else if ((flags & NSCommandKeyMask) && (a & NSCommandKeyMask)) filteredFlags |= NSCommandKeyMask; + + if (m & NSAlternateKeyMask) filteredFlags |= NSAlternateKeyMask; + else if ((flags & NSAlternateKeyMask) && (a & NSAlternateKeyMask)) filteredFlags |= NSAlternateKeyMask; + + if ((m & NSControlKeyMask)) filteredFlags |= NSControlKeyMask; + else if ((flags & NSControlKeyMask) && (a & NSControlKeyMask)) filteredFlags |= NSControlKeyMask; + + if ((m & NSShiftKeyMask)) filteredFlags |= NSShiftKeyMask; + else if ((flags & NSShiftKeyMask) && (a & NSShiftKeyMask)) filteredFlags |= NSShiftKeyMask; + + if ((m & NSFunctionKeyMask)) filteredFlags |= NSFunctionKeyMask; + else if ((flags & NSFunctionKeyMask) && (a & NSFunctionKeyMask)) filteredFlags |= NSFunctionKeyMask; + + return filteredFlags; +} + +- (BOOL)_validModifierFlags:(NSUInteger)flags +{ + return (allowsKeyOnly ? YES : (((flags & NSCommandKeyMask) || (flags & NSAlternateKeyMask) || (flags & NSControlKeyMask) || (flags & NSShiftKeyMask) || (flags & NSFunctionKeyMask)) ? YES : NO)); +} + +#pragma mark - + +- (NSUInteger)_filteredCocoaToCarbonFlags:(NSUInteger)cocoaFlags +{ + NSUInteger carbonFlags = ShortcutRecorderEmptyFlags; + NSUInteger filteredFlags = [self _filteredCocoaFlags: cocoaFlags]; + + if (filteredFlags & NSCommandKeyMask) carbonFlags |= cmdKey; + if (filteredFlags & NSAlternateKeyMask) carbonFlags |= optionKey; + if (filteredFlags & NSControlKeyMask) carbonFlags |= controlKey; + if (filteredFlags & NSShiftKeyMask) carbonFlags |= shiftKey; + + // I couldn't find out the equivalent constant in Carbon, but apparently it must use the same one as Cocoa. -AK + if (filteredFlags & NSFunctionKeyMask) carbonFlags |= NSFunctionKeyMask; + + return carbonFlags; +} + +#pragma mark *** Internal Check *** + +- (BOOL)_isEmpty +{ + return ( ![self _validModifierFlags: keyCombo.flags] || !SRStringForKeyCode( keyCombo.code ) ); +} + +#pragma mark *** Delegate pass-through *** + +- (BOOL) shortcutValidator:(SRValidator *)validator isKeyCode:(NSInteger)keyCode andFlagsTaken:(NSUInteger)flags reason:(NSString **)aReason; +{ + SEL selector = @selector( shortcutRecorderCell:isKeyCode:andFlagsTaken:reason: ); + if ( ( delegate ) && ( [delegate respondsToSelector:selector] ) ) + { + return [delegate shortcutRecorderCell:self isKeyCode:keyCode andFlagsTaken:flags reason:aReason]; + } + return NO; +} + +@end \ No newline at end of file diff --git a/ShortcutRecorder/SRRecorderControl.h b/ShortcutRecorder/SRRecorderControl.h new file mode 100644 index 0000000..777678e --- /dev/null +++ b/ShortcutRecorder/SRRecorderControl.h @@ -0,0 +1,79 @@ +// +// SRRecorderControl.h +// ShortcutRecorder +// +// Copyright 2006-2007 Contributors. All rights reserved. +// +// License: BSD +// +// Contributors: +// David Dauer +// Jesper +// Jamie Kirkpatrick + +#import +#import "SRRecorderCell.h" + +@interface SRRecorderControl : NSControl +{ + IBOutlet id delegate; +} + +#pragma mark *** Aesthetics *** +- (BOOL)animates; +- (void)setAnimates:(BOOL)an; +- (SRRecorderStyle)style; +- (void)setStyle:(SRRecorderStyle)nStyle; + +#pragma mark *** Delegate *** +- (id)delegate; +- (void)setDelegate:(id)aDelegate; + +#pragma mark *** Key Combination Control *** + +- (NSUInteger)allowedFlags; +- (void)setAllowedFlags:(NSUInteger)flags; + +- (BOOL)allowsKeyOnly; +- (void)setAllowsKeyOnly:(BOOL)nAllowsKeyOnly escapeKeysRecord:(BOOL)nEscapeKeysRecord; +- (BOOL)escapeKeysRecord; + +- (BOOL)canCaptureGlobalHotKeys; +- (void)setCanCaptureGlobalHotKeys:(BOOL)inState; + +- (NSUInteger)requiredFlags; +- (void)setRequiredFlags:(NSUInteger)flags; + +- (KeyCombo)keyCombo; +- (void)setKeyCombo:(KeyCombo)aKeyCombo; + +- (NSString *)keyChars; +- (NSString *)keyCharsIgnoringModifiers; + +#pragma mark *** Autosave Control *** + +- (NSString *)autosaveName; +- (void)setAutosaveName:(NSString *)aName; + +#pragma mark - + +// Returns the displayed key combination if set +- (NSString *)keyComboString; + +#pragma mark *** Conversion Methods *** + +- (NSUInteger)cocoaToCarbonFlags:(NSUInteger)cocoaFlags; +- (NSUInteger)carbonToCocoaFlags:(NSUInteger)carbonFlags; + +#pragma mark *** Binding Methods *** + +- (NSDictionary *)objectValue; +- (void)setObjectValue:(NSDictionary *)shortcut; + +@end + +// Delegate Methods +@interface NSObject (SRRecorderDelegate) +- (BOOL)shortcutRecorder:(SRRecorderControl *)aRecorder isKeyCode:(NSInteger)keyCode andFlagsTaken:(NSUInteger)flags reason:(NSString **)aReason; +- (void)shortcutRecorder:(SRRecorderControl *)aRecorder keyComboDidChange:(KeyCombo)newKeyCombo; +@end diff --git a/ShortcutRecorder/SRRecorderControl.m b/ShortcutRecorder/SRRecorderControl.m new file mode 100644 index 0000000..215996d --- /dev/null +++ b/ShortcutRecorder/SRRecorderControl.m @@ -0,0 +1,386 @@ +// +// SRRecorderControl.m +// ShortcutRecorder +// +// Copyright 2006-2007 Contributors. All rights reserved. +// +// License: BSD +// +// Contributors: +// David Dauer +// Jesper +// Jamie Kirkpatrick + +#import "SRRecorderControl.h" +#import "SRCommon.h" + +#define SRCell (SRRecorderCell *)[self cell] + +@interface SRRecorderControl (Private) +- (void)resetTrackingRects; +@end + +@implementation SRRecorderControl + ++ (void)initialize +{ + if (self == [SRRecorderControl class]) + { + [self setCellClass: [SRRecorderCell class]]; + } +} + ++ (Class)cellClass +{ + return [SRRecorderCell class]; +} + +- (id)initWithFrame:(NSRect)frameRect +{ + self = [super initWithFrame: frameRect]; + + [SRCell setDelegate: self]; + + return self; +} + +- (id)initWithCoder:(NSCoder *)aDecoder +{ + self = [super initWithCoder: aDecoder]; + + [SRCell setDelegate: self]; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder +{ + [super encodeWithCoder: aCoder]; +} + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; + [super dealloc]; +} + +#pragma mark *** Cell Behavior *** + +// We need keyboard access +- (BOOL)acceptsFirstResponder +{ + return YES; +} + +// Allow the control to be activated with the first click on it even if it's window isn't the key window +- (BOOL)acceptsFirstMouse:(NSEvent *)theEvent +{ + return YES; +} + +- (BOOL) becomeFirstResponder +{ + BOOL okToChange = [SRCell becomeFirstResponder]; + if (okToChange) [super setKeyboardFocusRingNeedsDisplayInRect:[self bounds]]; + return okToChange; +} + +- (BOOL) resignFirstResponder +{ + BOOL okToChange = [SRCell resignFirstResponder]; + if (okToChange) [super setKeyboardFocusRingNeedsDisplayInRect:[self bounds]]; + return okToChange; +} + +#pragma mark *** Aesthetics *** +- (BOOL)animates { + return [SRCell animates]; +} + +- (void)setAnimates:(BOOL)an { + [SRCell setAnimates:an]; +} + +- (SRRecorderStyle)style { + return [SRCell style]; +} + +- (void)setStyle:(SRRecorderStyle)nStyle { + [SRCell setStyle:nStyle]; +} + +#pragma mark *** Interface Stuff *** + + +// If the control is set to be resizeable in width, this will make sure that the tracking rects are always updated +- (void)viewDidMoveToWindow +{ + NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; + + [center removeObserver: self]; + [center addObserver:self selector:@selector(viewFrameDidChange:) name:NSViewFrameDidChangeNotification object:self]; + + [self resetTrackingRects]; +} + +- (void)viewFrameDidChange:(NSNotification *)aNotification +{ + [self resetTrackingRects]; +} + +// Prevent from being too small +- (void)setFrameSize:(NSSize)newSize +{ + NSSize correctedSize = newSize; + correctedSize.height = SRMaxHeight; + if (correctedSize.width < SRMinWidth) correctedSize.width = SRMinWidth; + + [super setFrameSize: correctedSize]; +} + +- (void)setFrame:(NSRect)frameRect +{ + NSRect correctedFrarme = frameRect; + correctedFrarme.size.height = SRMaxHeight; + if (correctedFrarme.size.width < SRMinWidth) correctedFrarme.size.width = SRMinWidth; + + [super setFrame: correctedFrarme]; +} + +- (NSString *)keyChars { + return [SRCell keyChars]; +} + +- (NSString *)keyCharsIgnoringModifiers { + return [SRCell keyCharsIgnoringModifiers]; +} + +#pragma mark *** Key Interception *** + +// Like most NSControls, pass things on to the cell +- (BOOL)performKeyEquivalent:(NSEvent *)theEvent +{ + // Only if we're key, please. Otherwise hitting Space after having + // tabbed past SRRecorderControl will put you into recording mode. + if (([[[self window] firstResponder] isEqualTo:self])) { + if ([SRCell performKeyEquivalent:theEvent]) return YES; + } + + return [super performKeyEquivalent: theEvent]; +} + +- (void)flagsChanged:(NSEvent *)theEvent +{ + [SRCell flagsChanged:theEvent]; +} + +- (void)keyDown:(NSEvent *)theEvent +{ + if ( [SRCell performKeyEquivalent: theEvent] ) + return; + + [super keyDown:theEvent]; +} + +#pragma mark *** Key Combination Control *** + +- (NSUInteger)allowedFlags +{ + return [SRCell allowedFlags]; +} + +- (void)setAllowedFlags:(NSUInteger)flags +{ + [SRCell setAllowedFlags: flags]; +} + +- (BOOL)allowsKeyOnly { + return [SRCell allowsKeyOnly]; +} + +- (void)setAllowsKeyOnly:(BOOL)nAllowsKeyOnly escapeKeysRecord:(BOOL)nEscapeKeysRecord { + [SRCell setAllowsKeyOnly:nAllowsKeyOnly escapeKeysRecord:nEscapeKeysRecord]; +} + +- (BOOL)escapeKeysRecord { + return [SRCell escapeKeysRecord]; +} + +- (BOOL)canCaptureGlobalHotKeys +{ + return [[self cell] canCaptureGlobalHotKeys]; +} + +- (void)setCanCaptureGlobalHotKeys:(BOOL)inState +{ + [[self cell] setCanCaptureGlobalHotKeys:inState]; +} + +- (NSUInteger)requiredFlags +{ + return [SRCell requiredFlags]; +} + +- (void)setRequiredFlags:(NSUInteger)flags +{ + [SRCell setRequiredFlags: flags]; +} + +- (KeyCombo)keyCombo +{ + return [SRCell keyCombo]; +} + +- (void)setKeyCombo:(KeyCombo)aKeyCombo +{ + [SRCell setKeyCombo: aKeyCombo]; +} + +#pragma mark *** Binding Methods *** + +- (NSDictionary *)objectValue +{ + KeyCombo keyCombo = [self keyCombo]; + if (keyCombo.code == ShortcutRecorderEmptyCode || keyCombo.flags == ShortcutRecorderEmptyFlags) + return nil; + + return [NSDictionary dictionaryWithObjectsAndKeys: + [self keyCharsIgnoringModifiers], @"characters", + [NSNumber numberWithInteger:keyCombo.code], @"keyCode", + [NSNumber numberWithUnsignedInteger:keyCombo.flags], @"modifierFlags", + nil]; +} + +- (void)setObjectValue:(NSDictionary *)shortcut +{ + KeyCombo keyCombo = SRMakeKeyCombo(ShortcutRecorderEmptyCode, ShortcutRecorderEmptyFlags); + if (shortcut != nil && [shortcut isKindOfClass:[NSDictionary class]]) { + NSNumber *keyCode = [shortcut objectForKey:@"keyCode"]; + NSNumber *modifierFlags = [shortcut objectForKey:@"modifierFlags"]; + if ([keyCode isKindOfClass:[NSNumber class]] && [modifierFlags isKindOfClass:[NSNumber class]]) { + keyCombo.code = [keyCode integerValue]; + keyCombo.flags = [modifierFlags unsignedIntegerValue]; + } + } + + [self setKeyCombo: keyCombo]; +} + +- (Class)valueClassForBinding:(NSString *)binding +{ + if ([binding isEqualToString:@"value"]) + return [NSDictionary class]; + + return [super valueClassForBinding:binding]; +} + +#pragma mark *** Autosave Control *** + +- (NSString *)autosaveName +{ + return [SRCell autosaveName]; +} + +- (void)setAutosaveName:(NSString *)aName +{ + [SRCell setAutosaveName: aName]; +} + +#pragma mark - + +- (NSString *)keyComboString +{ + return [SRCell keyComboString]; +} + +#pragma mark *** Conversion Methods *** + +- (NSUInteger)cocoaToCarbonFlags:(NSUInteger)cocoaFlags +{ + return SRCocoaToCarbonFlags( cocoaFlags ); +} + +- (NSUInteger)carbonToCocoaFlags:(NSUInteger)carbonFlags; +{ + return SRCarbonToCocoaFlags( carbonFlags ); +} + +#pragma mark *** Delegate *** + +// Only the delegate will be handled by the control +- (id)delegate +{ + return delegate; +} + +- (void)setDelegate:(id)aDelegate +{ + delegate = aDelegate; +} + +#pragma mark *** Delegate pass-through *** + +- (BOOL)shortcutRecorderCell:(SRRecorderCell *)aRecorderCell isKeyCode:(NSInteger)keyCode andFlagsTaken:(NSUInteger)flags reason:(NSString **)aReason +{ + if (delegate != nil && [delegate respondsToSelector: @selector(shortcutRecorder:isKeyCode:andFlagsTaken:reason:)]) + return [delegate shortcutRecorder:self isKeyCode:keyCode andFlagsTaken:flags reason:aReason]; + else + return NO; +} + +#define NilOrNull(o) ((o) == nil || (id)(o) == [NSNull null]) + +- (void)shortcutRecorderCell:(SRRecorderCell *)aRecorderCell keyComboDidChange:(KeyCombo)newKeyCombo +{ + if (delegate != nil && [delegate respondsToSelector: @selector(shortcutRecorder:keyComboDidChange:)]) + [delegate shortcutRecorder:self keyComboDidChange:newKeyCombo]; + + // propagate view changes to binding (see http://www.tomdalling.com/cocoa/implementing-your-own-cocoa-bindings) + NSDictionary *bindingInfo = [self infoForBinding:@"value"]; + if (!bindingInfo) + return; + + // apply the value transformer, if one has been set + NSDictionary *value = [self objectValue]; + NSDictionary *bindingOptions = [bindingInfo objectForKey:NSOptionsKey]; + if (bindingOptions != nil) { + NSValueTransformer *transformer = [bindingOptions valueForKey:NSValueTransformerBindingOption]; + if (NilOrNull(transformer)) { + NSString *transformerName = [bindingOptions valueForKey:NSValueTransformerNameBindingOption]; + if (!NilOrNull(transformerName)) + transformer = [NSValueTransformer valueTransformerForName:transformerName]; + } + + if (!NilOrNull(transformer)) { + if ([[transformer class] allowsReverseTransformation]) + value = [transformer reverseTransformedValue:value]; + else + NSLog(@"WARNING: value has value transformer, but it doesn't allow reverse transformations in %s", __PRETTY_FUNCTION__); + } + } + + id boundObject = [bindingInfo objectForKey:NSObservedObjectKey]; + if (NilOrNull(boundObject)) { + NSLog(@"ERROR: NSObservedObjectKey was nil for value binding in %s", __PRETTY_FUNCTION__); + return; + } + + NSString *boundKeyPath = [bindingInfo objectForKey:NSObservedKeyPathKey]; + if (NilOrNull(boundKeyPath)) { + NSLog(@"ERROR: NSObservedKeyPathKey was nil for value binding in %s", __PRETTY_FUNCTION__); + return; + } + + [boundObject setValue:value forKeyPath:boundKeyPath]; +} + +@end + +@implementation SRRecorderControl (Private) + +- (void)resetTrackingRects +{ + [SRCell resetTrackingRects]; +} + +@end diff --git a/ShortcutRecorder/SRValidator.h b/ShortcutRecorder/SRValidator.h new file mode 100644 index 0000000..0dd8f28 --- /dev/null +++ b/ShortcutRecorder/SRValidator.h @@ -0,0 +1,34 @@ +// +// SRValidator.h +// ShortcutRecorder +// +// Copyright 2006-2007 Contributors. All rights reserved. +// +// License: BSD +// +// Contributors: +// David Dauer +// Jesper +// Jamie Kirkpatrick + +#import + +@interface SRValidator : NSObject { + id delegate; +} + +- (id) initWithDelegate:(id)theDelegate; + +- (BOOL) isKeyCode:(NSInteger)keyCode andFlagsTaken:(NSUInteger)flags error:(NSError **)error; +- (BOOL) isKeyCode:(NSInteger)keyCode andFlags:(NSUInteger)flags takenInMenu:(NSMenu *)menu error:(NSError **)error; + +- (id) delegate; +- (void) setDelegate: (id) theDelegate; + +@end + +#pragma mark - + +@interface NSObject( SRValidation ) +- (BOOL) shortcutValidator:(SRValidator *)validator isKeyCode:(NSInteger)keyCode andFlagsTaken:(NSUInteger)flags reason:(NSString **)aReason; +@end diff --git a/ShortcutRecorder/SRValidator.m b/ShortcutRecorder/SRValidator.m new file mode 100644 index 0000000..7f18fd2 --- /dev/null +++ b/ShortcutRecorder/SRValidator.m @@ -0,0 +1,258 @@ +// +// SRValidator.h +// ShortcutRecorder +// +// Copyright 2006-2011 Contributors. All rights reserved. +// +// License: BSD +// +// Contributors: +// David Dauer +// Jesper +// Jamie Kirkpatrick +// Andy Kim + +#import "SRValidator.h" +#import "SRCommon.h" + +@implementation SRValidator + +//---------------------------------------------------------- +// iinitWithDelegate: +//---------------------------------------------------------- +- (id) initWithDelegate:(id)theDelegate; +{ + self = [super init]; + if ( !self ) + return nil; + + [self setDelegate:theDelegate]; + + return self; +} + +//---------------------------------------------------------- +// isKeyCode:andFlagsTaken:error: +//---------------------------------------------------------- +- (BOOL) isKeyCode:(NSInteger)keyCode andFlagsTaken:(NSUInteger)flags error:(NSError **)error; +{ + // if we have a delegate, it goes first... + if ( delegate ) + { + NSString *delegateReason = nil; + if ( [delegate shortcutValidator:self + isKeyCode:keyCode + andFlagsTaken:SRCarbonToCocoaFlags( flags ) + reason:&delegateReason]) + { + if ( error ) + { + NSString *description = [NSString stringWithFormat: + SRLoc(@"The key combination %@ can't be used!"), + SRStringForCarbonModifierFlagsAndKeyCode( flags, keyCode )]; + NSString *recoverySuggestion = [NSString stringWithFormat: + SRLoc(@"The key combination \"%@\" can't be used because %@."), + SRReadableStringForCarbonModifierFlagsAndKeyCode( flags, keyCode ), + ( delegateReason && [delegateReason length] ) ? delegateReason : @"it's already used"]; + NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys: + description, NSLocalizedDescriptionKey, + recoverySuggestion, NSLocalizedRecoverySuggestionErrorKey, + [NSArray arrayWithObject:@"OK"], NSLocalizedRecoveryOptionsErrorKey, // Is this needed? Shouldn't it show 'OK' by default? -AK + nil]; + *error = [NSError errorWithDomain:NSCocoaErrorDomain code:0 userInfo:userInfo]; + } + return YES; + } + } + + // then our implementation... + CFArrayRef tempArray = NULL; + OSStatus err = noErr; + + // get global hot keys... + err = CopySymbolicHotKeys( &tempArray ); + + if ( err != noErr ) return YES; + + // Not copying the array like this results in a leak on according to the Leaks Instrument + NSArray *globalHotKeys = [NSArray arrayWithArray:(NSArray *)tempArray]; + + if ( tempArray ) CFRelease(tempArray); + + NSEnumerator *globalHotKeysEnumerator = [globalHotKeys objectEnumerator]; + NSDictionary *globalHotKeyInfoDictionary; + int32_t globalHotKeyFlags; + NSInteger globalHotKeyCharCode; + BOOL globalCommandMod = NO, globalOptionMod = NO, globalShiftMod = NO, globalCtrlMod = NO; + BOOL localCommandMod = NO, localOptionMod = NO, localShiftMod = NO, localCtrlMod = NO; + + // Prepare local carbon comparison flags + if ( flags & cmdKey ) localCommandMod = YES; + if ( flags & optionKey ) localOptionMod = YES; + if ( flags & shiftKey ) localShiftMod = YES; + if ( flags & controlKey ) localCtrlMod = YES; + + while (( globalHotKeyInfoDictionary = [globalHotKeysEnumerator nextObject] )) + { + // Only check if global hotkey is enabled + if ( (CFBooleanRef)[globalHotKeyInfoDictionary objectForKey:(NSString *)kHISymbolicHotKeyEnabled] != kCFBooleanTrue ) + continue; + + globalCommandMod = NO; + globalOptionMod = NO; + globalShiftMod = NO; + globalCtrlMod = NO; + + globalHotKeyCharCode = [(NSNumber *)[globalHotKeyInfoDictionary objectForKey:(NSString *)kHISymbolicHotKeyCode] shortValue]; + + CFNumberGetValue((CFNumberRef)[globalHotKeyInfoDictionary objectForKey: (NSString *)kHISymbolicHotKeyModifiers],kCFNumberSInt32Type,&globalHotKeyFlags); + + if ( globalHotKeyFlags & cmdKey ) globalCommandMod = YES; + if ( globalHotKeyFlags & optionKey ) globalOptionMod = YES; + if ( globalHotKeyFlags & shiftKey) globalShiftMod = YES; + if ( globalHotKeyFlags & controlKey ) globalCtrlMod = YES; + + NSString *localKeyString = SRStringForKeyCode( keyCode ); + if (![localKeyString length]) return YES; + + + // compare unichar value and modifier flags + if ( ( globalHotKeyCharCode == keyCode ) + && ( globalCommandMod == localCommandMod ) + && ( globalOptionMod == localOptionMod ) + && ( globalShiftMod == localShiftMod ) + && ( globalCtrlMod == localCtrlMod ) ) + { + if ( error ) + { + NSString *description = [NSString stringWithFormat: + SRLoc(@"The key combination %@ can't be used!"), + SRStringForCarbonModifierFlagsAndKeyCode( flags, keyCode )]; + NSString *recoverySuggestion = [NSString stringWithFormat: + SRLoc(@"The key combination \"%@\" can't be used because it's already used by a system-wide keyboard shortcut. (If you really want to use this key combination, most shortcuts can be changed in the Keyboard & Mouse panel in System Preferences.)"), + SRReadableStringForCarbonModifierFlagsAndKeyCode( flags, keyCode )]; + NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys: + description, NSLocalizedDescriptionKey, + recoverySuggestion, NSLocalizedRecoverySuggestionErrorKey, + [NSArray arrayWithObject:@"OK"], NSLocalizedRecoveryOptionsErrorKey, + nil]; + *error = [NSError errorWithDomain:NSCocoaErrorDomain code:0 userInfo:userInfo]; + } + return YES; + } + } + + // Check menus too + return [self isKeyCode:keyCode andFlags:flags takenInMenu:[NSApp mainMenu] error:error]; +} + +//---------------------------------------------------------- +// isKeyCode:andFlags:takenInMenu:error: +//---------------------------------------------------------- +- (BOOL) isKeyCode:(NSInteger)keyCode andFlags:(NSUInteger)flags takenInMenu:(NSMenu *)menu error:(NSError **)error; +{ + NSArray *menuItemsArray = [menu itemArray]; + NSEnumerator *menuItemsEnumerator = [menuItemsArray objectEnumerator]; + NSMenuItem *menuItem; + NSUInteger menuItemModifierFlags; + NSString *menuItemKeyEquivalent; + + BOOL menuItemCommandMod = NO, menuItemOptionMod = NO, menuItemShiftMod = NO, menuItemCtrlMod = NO; + BOOL localCommandMod = NO, localOptionMod = NO, localShiftMod = NO, localCtrlMod = NO; + + // Prepare local carbon comparison flags + if ( flags & cmdKey ) localCommandMod = YES; + if ( flags & optionKey ) localOptionMod = YES; + if ( flags & shiftKey ) localShiftMod = YES; + if ( flags & controlKey ) localCtrlMod = YES; + + while (( menuItem = [menuItemsEnumerator nextObject] )) + { + // rescurse into all submenus... + if ( [menuItem hasSubmenu] ) + { + if ( [self isKeyCode:keyCode andFlags:flags takenInMenu:[menuItem submenu] error:error] ) + { + return YES; + } + } + + if ( ( menuItemKeyEquivalent = [menuItem keyEquivalent] ) + && ( ![menuItemKeyEquivalent isEqualToString: @""] ) ) + { + menuItemCommandMod = NO; + menuItemOptionMod = NO; + menuItemShiftMod = NO; + menuItemCtrlMod = NO; + + menuItemModifierFlags = [menuItem keyEquivalentModifierMask]; + + if ( menuItemModifierFlags & NSCommandKeyMask ) menuItemCommandMod = YES; + if ( menuItemModifierFlags & NSAlternateKeyMask ) menuItemOptionMod = YES; + if ( menuItemModifierFlags & NSShiftKeyMask ) menuItemShiftMod = YES; + if ( menuItemModifierFlags & NSControlKeyMask ) menuItemCtrlMod = YES; + + NSString *localKeyString = SRStringForKeyCode( keyCode ); + + // Compare translated keyCode and modifier flags + if ( ( [[menuItemKeyEquivalent uppercaseString] isEqualToString: localKeyString] ) + && ( menuItemCommandMod == localCommandMod ) + && ( menuItemOptionMod == localOptionMod ) + && ( menuItemShiftMod == localShiftMod ) + && ( menuItemCtrlMod == localCtrlMod ) ) + { + if ( error ) + { + NSString *description = [NSString stringWithFormat: + SRLoc(@"The key combination %@ can't be used!"), + SRStringForCarbonModifierFlagsAndKeyCode( flags, keyCode )]; + NSString *recoverySuggestion = [NSString stringWithFormat: + SRLoc(@"The key combination \"%@\" can't be used because it's already used by the menu item \"%@\"."), + SRReadableStringForCocoaModifierFlagsAndKeyCode( menuItemModifierFlags, keyCode ), + [menuItem title]]; + NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys: + description, NSLocalizedDescriptionKey, + recoverySuggestion, NSLocalizedRecoverySuggestionErrorKey, + [NSArray arrayWithObject:@"OK"], NSLocalizedRecoveryOptionsErrorKey, + nil]; + *error = [NSError errorWithDomain:NSCocoaErrorDomain code:0 userInfo:userInfo]; + } + return YES; + } + } + } + return NO; +} + +#pragma mark - +#pragma mark accessors + +//---------------------------------------------------------- +// delegate +//---------------------------------------------------------- +- (id) delegate +{ + return delegate; +} + +- (void) setDelegate: (id) theDelegate +{ + delegate = theDelegate; // Standard delegate pattern does not retain the delegate +} + +@end + +#pragma mark - +#pragma mark default delegate implementation + +@implementation NSObject( SRValidation ) + +//---------------------------------------------------------- +// shortcutValidator:isKeyCode:andFlagsTaken:reason: +//---------------------------------------------------------- +- (BOOL) shortcutValidator:(SRValidator *)validator isKeyCode:(NSInteger)keyCode andFlagsTaken:(NSUInteger)flags reason:(NSString **)aReason; +{ + return NO; +} + +@end diff --git a/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Headers b/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Headers new file mode 120000 index 0000000..a177d2a --- /dev/null +++ b/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Headers @@ -0,0 +1 @@ +Versions/Current/Headers \ No newline at end of file diff --git a/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Resources b/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Resources new file mode 120000 index 0000000..953ee36 --- /dev/null +++ b/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Resources @@ -0,0 +1 @@ +Versions/Current/Resources \ No newline at end of file diff --git a/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/ShortcutRecorder b/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/ShortcutRecorder new file mode 120000 index 0000000..2be0db1 --- /dev/null +++ b/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/ShortcutRecorder @@ -0,0 +1 @@ +Versions/Current/ShortcutRecorder \ No newline at end of file diff --git a/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Versions/A/Headers/SRCommon.h b/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Versions/A/Headers/SRCommon.h new file mode 100644 index 0000000..ce12ebf --- /dev/null +++ b/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Versions/A/Headers/SRCommon.h @@ -0,0 +1,185 @@ +// +// SRCommon.h +// ShortcutRecorder +// +// Copyright 2006-2007 Contributors. All rights reserved. +// +// License: BSD +// +// Contributors: +// David Dauer +// Jesper +// Jamie Kirkpatrick + +#import +#import +#import + +#pragma mark Dummy class + +@interface SRDummyClass : NSObject {} @end + +#pragma mark - +#pragma mark Typedefs + +typedef struct _KeyCombo { + NSUInteger flags; // 0 for no flags + NSInteger code; // -1 for no code +} KeyCombo; + +#pragma mark - +#pragma mark Enums + +// Unicode values of some keyboard glyphs +enum { + KeyboardTabRightGlyph = 0x21E5, + KeyboardTabLeftGlyph = 0x21E4, + KeyboardCommandGlyph = kCommandUnicode, + KeyboardOptionGlyph = kOptionUnicode, + KeyboardShiftGlyph = kShiftUnicode, + KeyboardControlGlyph = kControlUnicode, + KeyboardReturnGlyph = 0x2305, + KeyboardReturnR2LGlyph = 0x21A9, + KeyboardDeleteLeftGlyph = 0x232B, + KeyboardDeleteRightGlyph = 0x2326, + KeyboardPadClearGlyph = 0x2327, + KeyboardLeftArrowGlyph = 0x2190, + KeyboardRightArrowGlyph = 0x2192, + KeyboardUpArrowGlyph = 0x2191, + KeyboardDownArrowGlyph = 0x2193, + KeyboardPageDownGlyph = 0x21DF, + KeyboardPageUpGlyph = 0x21DE, + KeyboardNorthwestArrowGlyph = 0x2196, + KeyboardSoutheastArrowGlyph = 0x2198, + KeyboardEscapeGlyph = 0x238B, + KeyboardHelpGlyph = 0x003F, + KeyboardUpArrowheadGlyph = 0x2303, +}; + +// Special keys +enum { + kSRKeysF1 = 122, + kSRKeysF2 = 120, + kSRKeysF3 = 99, + kSRKeysF4 = 118, + kSRKeysF5 = 96, + kSRKeysF6 = 97, + kSRKeysF7 = 98, + kSRKeysF8 = 100, + kSRKeysF9 = 101, + kSRKeysF10 = 109, + kSRKeysF11 = 103, + kSRKeysF12 = 111, + kSRKeysF13 = 105, + kSRKeysF14 = 107, + kSRKeysF15 = 113, + kSRKeysF16 = 106, + kSRKeysF17 = 64, + kSRKeysF18 = 79, + kSRKeysF19 = 80, + kSRKeysSpace = 49, + kSRKeysDeleteLeft = 51, + kSRKeysDeleteRight = 117, + kSRKeysPadClear = 71, + kSRKeysLeftArrow = 123, + kSRKeysRightArrow = 124, + kSRKeysUpArrow = 126, + kSRKeysDownArrow = 125, + kSRKeysSoutheastArrow = 119, + kSRKeysNorthwestArrow = 115, + kSRKeysEscape = 53, + kSRKeysPageDown = 121, + kSRKeysPageUp = 116, + kSRKeysReturnR2L = 36, + kSRKeysReturn = 76, + kSRKeysTabRight = 48, + kSRKeysHelp = 114 +}; + +#pragma mark - +#pragma mark Macros + +// Localization macros, for use in any bundle +#define SRLoc(key) SRLocalizedString(key, nil) +#define SRLocalizedString(key, comment) NSLocalizedStringFromTableInBundle(key, @"ShortcutRecorder", [NSBundle bundleForClass: [SRDummyClass class]], comment) + +// Image macros, for use in any bundle +//#define SRImage(name) [[[NSImage alloc] initWithContentsOfFile: [[NSBundle bundleForClass: [self class]] pathForImageResource: name]] autorelease] +#define SRResIndImage(name) [SRSharedImageProvider supportingImageWithName:name] +#define SRImage(name) SRResIndImage(name) + +//#define SRCommonWriteDebugImagery + +// Macros for glyps +#define SRInt(x) [NSNumber numberWithInteger:x] +#define SRChar(x) [NSString stringWithFormat: @"%C", x] + +// Some default values +#define ShortcutRecorderEmptyFlags 0 +#define ShortcutRecorderAllFlags ShortcutRecorderEmptyFlags | (NSCommandKeyMask | NSAlternateKeyMask | NSControlKeyMask | NSShiftKeyMask | NSFunctionKeyMask) +#define ShortcutRecorderEmptyCode -1 + +// These keys will cancel the recoding mode if not pressed with any modifier +#define ShortcutRecorderEscapeKey 53 +#define ShortcutRecorderBackspaceKey 51 +#define ShortcutRecorderDeleteKey 117 + +#pragma mark - +#pragma mark Getting a string of the key combination + +// +// ################### +- Returns string from keyCode like NSEvent's -characters +// # EXPLANATORY # | +- Returns string from keyCode like NSEvent's -charactersUsingModifiers +// # CHART # | | +- Returns fully readable and localized name of modifier (if modifier given) +// ################### | | | +- Returns glyph of modifier (if modifier given) +// SRString... X - - X +// SRReadableString... X - X - +// SRCharacter... - X - - +// +NSString * SRStringForKeyCode( NSInteger keyCode ); +NSString * SRStringForCarbonModifierFlags( NSUInteger flags ); +NSString * SRStringForCarbonModifierFlagsAndKeyCode( NSUInteger flags, NSInteger keyCode ); +NSString * SRStringForCocoaModifierFlags( NSUInteger flags ); +NSString * SRStringForCocoaModifierFlagsAndKeyCode( NSUInteger flags, NSInteger keyCode ); +NSString * SRReadableStringForCarbonModifierFlagsAndKeyCode( NSUInteger flags, NSInteger keyCode ); +NSString * SRReadableStringForCocoaModifierFlagsAndKeyCode( NSUInteger flags, NSInteger keyCode ); +NSString *SRCharacterForKeyCodeAndCarbonFlags(NSInteger keyCode, NSUInteger carbonFlags); +NSString *SRCharacterForKeyCodeAndCocoaFlags(NSInteger keyCode, NSUInteger cocoaFlags); + +#pragma mark Converting between Cocoa and Carbon modifier flags + +NSUInteger SRCarbonToCocoaFlags( NSUInteger carbonFlags ); +NSUInteger SRCocoaToCarbonFlags( NSUInteger cocoaFlags ); + +#pragma mark - +#pragma mark Animation pace function + +CGFloat SRAnimationEaseInOut(CGFloat t); + +#pragma mark - +#pragma mark Inlines + +FOUNDATION_STATIC_INLINE KeyCombo SRMakeKeyCombo(NSInteger code, NSUInteger flags) { + KeyCombo kc; + kc.code = code; + kc.flags = flags; + return kc; +} + +FOUNDATION_STATIC_INLINE BOOL SRIsSpecialKey(NSInteger keyCode) { + return (keyCode == kSRKeysF1 || keyCode == kSRKeysF2 || keyCode == kSRKeysF3 || keyCode == kSRKeysF4 || keyCode == kSRKeysF5 || keyCode == kSRKeysF6 || keyCode == kSRKeysF7 || keyCode == kSRKeysF8 || keyCode == kSRKeysF9 || keyCode == kSRKeysF10 || keyCode == kSRKeysF11 || keyCode == kSRKeysF12 || keyCode == kSRKeysF13 || keyCode == kSRKeysF14 || keyCode == kSRKeysF15 || keyCode == kSRKeysF16 || keyCode == kSRKeysSpace || keyCode == kSRKeysDeleteLeft || keyCode == kSRKeysDeleteRight || keyCode == kSRKeysPadClear || keyCode == kSRKeysLeftArrow || keyCode == kSRKeysRightArrow || keyCode == kSRKeysUpArrow || keyCode == kSRKeysDownArrow || keyCode == kSRKeysSoutheastArrow || keyCode == kSRKeysNorthwestArrow || keyCode == kSRKeysEscape || keyCode == kSRKeysPageDown || keyCode == kSRKeysPageUp || keyCode == kSRKeysReturnR2L || keyCode == kSRKeysReturn || keyCode == kSRKeysTabRight || keyCode == kSRKeysHelp); +} + +#pragma mark - +#pragma mark Additions + +@interface NSAlert( SRAdditions ) ++ (NSAlert *) alertWithNonRecoverableError:(NSError *)error; +@end + +#pragma mark - +#pragma mark Image provider + +@interface SRSharedImageProvider : NSObject ++ (NSImage *)supportingImageWithName:(NSString *)name; +@end diff --git a/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Versions/A/Headers/SRKeyCodeTransformer.h b/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Versions/A/Headers/SRKeyCodeTransformer.h new file mode 100644 index 0000000..6f252f3 --- /dev/null +++ b/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Versions/A/Headers/SRKeyCodeTransformer.h @@ -0,0 +1,16 @@ +// +// SRKeyCodeTransformer.h +// ShortcutRecorder +// +// Copyright 2006-2007 Contributors. All rights reserved. +// +// License: BSD +// +// Contributors: +// David Dauer +// Jesper +// Jamie Kirkpatrick + +#import + +@interface SRKeyCodeTransformer : NSValueTransformer {} @end diff --git a/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Versions/A/Headers/SRRecorderCell.h b/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Versions/A/Headers/SRRecorderCell.h new file mode 100644 index 0000000..31b3854 --- /dev/null +++ b/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Versions/A/Headers/SRRecorderCell.h @@ -0,0 +1,137 @@ +// +// SRRecorderCell.h +// ShortcutRecorder +// +// Copyright 2006-2007 Contributors. All rights reserved. +// +// License: BSD +// +// Contributors: +// David Dauer +// Jesper +// Jamie Kirkpatrick + +#import +#import "SRCommon.h" + +#define SRMinWidth 50 +#define SRMaxHeight 22 + +#define SRTransitionFPS 30.0f +#define SRTransitionDuration 0.35f +//#define SRTransitionDuration 2.35 +#define SRTransitionFrames (SRTransitionFPS*SRTransitionDuration) +#define SRAnimationAxisIsY YES +#define ShortcutRecorderNewStyleDrawing + +#define SRAnimationOffsetRect(X,Y) (SRAnimationAxisIsY ? NSOffsetRect(X,0.0f,-NSHeight(Y)) : NSOffsetRect(X,NSWidth(Y),0.0f)) + +@class SRRecorderControl, SRValidator; + +enum SRRecorderStyle { + SRGradientBorderStyle = 0, + SRGreyStyle = 1 +}; +typedef enum SRRecorderStyle SRRecorderStyle; + +@interface SRRecorderCell : NSActionCell +{ + NSGradient *recordingGradient; + NSString *autosaveName; + + BOOL isRecording; + BOOL mouseInsideTrackingArea; + BOOL mouseDown; + + SRRecorderStyle style; + + BOOL isAnimating; + CGFloat transitionProgress; + BOOL isAnimatingNow; + BOOL isAnimatingTowardsRecording; + BOOL comboJustChanged; + + NSTrackingRectTag removeTrackingRectTag; + NSTrackingRectTag snapbackTrackingRectTag; + + KeyCombo keyCombo; + BOOL hasKeyChars; + NSString *keyChars; + NSString *keyCharsIgnoringModifiers; + + NSUInteger allowedFlags; + NSUInteger requiredFlags; + NSUInteger recordingFlags; + + BOOL allowsKeyOnly; + BOOL escapeKeysRecord; + + NSSet *cancelCharacterSet; + + SRValidator *validator; + + IBOutlet id delegate; + BOOL globalHotKeys; + void *hotKeyModeToken; +} + +- (void)resetTrackingRects; + +#pragma mark *** Aesthetics *** + ++ (BOOL)styleSupportsAnimation:(SRRecorderStyle)style; + +- (BOOL)animates; +- (void)setAnimates:(BOOL)an; +- (SRRecorderStyle)style; +- (void)setStyle:(SRRecorderStyle)nStyle; + +#pragma mark *** Delegate *** + +- (id)delegate; +- (void)setDelegate:(id)aDelegate; + +#pragma mark *** Responder Control *** + +- (BOOL)becomeFirstResponder; +- (BOOL)resignFirstResponder; + +#pragma mark *** Key Combination Control *** + +- (BOOL)performKeyEquivalent:(NSEvent *)theEvent; +- (void)flagsChanged:(NSEvent *)theEvent; + +- (NSUInteger)allowedFlags; +- (void)setAllowedFlags:(NSUInteger)flags; + +- (NSUInteger)requiredFlags; +- (void)setRequiredFlags:(NSUInteger)flags; + +- (BOOL)allowsKeyOnly; +- (void)setAllowsKeyOnly:(BOOL)nAllowsKeyOnly escapeKeysRecord:(BOOL)nEscapeKeysRecord; +- (BOOL)escapeKeysRecord; + +- (BOOL)canCaptureGlobalHotKeys; +- (void)setCanCaptureGlobalHotKeys:(BOOL)inState; + +- (KeyCombo)keyCombo; +- (void)setKeyCombo:(KeyCombo)aKeyCombo; + +#pragma mark *** Autosave Control *** + +- (NSString *)autosaveName; +- (void)setAutosaveName:(NSString *)aName; + +// Returns the displayed key combination if set +- (NSString *)keyComboString; + +- (NSString *)keyChars; +- (NSString *)keyCharsIgnoringModifiers; + +@end + +// Delegate Methods +@interface NSObject (SRRecorderCellDelegate) +- (BOOL)shortcutRecorderCell:(SRRecorderCell *)aRecorderCell isKeyCode:(NSInteger)keyCode andFlagsTaken:(NSUInteger)flags reason:(NSString **)aReason; +- (void)shortcutRecorderCell:(SRRecorderCell *)aRecorderCell keyComboDidChange:(KeyCombo)newCombo; +@end diff --git a/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Versions/A/Headers/SRRecorderControl.h b/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Versions/A/Headers/SRRecorderControl.h new file mode 100644 index 0000000..777678e --- /dev/null +++ b/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Versions/A/Headers/SRRecorderControl.h @@ -0,0 +1,79 @@ +// +// SRRecorderControl.h +// ShortcutRecorder +// +// Copyright 2006-2007 Contributors. All rights reserved. +// +// License: BSD +// +// Contributors: +// David Dauer +// Jesper +// Jamie Kirkpatrick + +#import +#import "SRRecorderCell.h" + +@interface SRRecorderControl : NSControl +{ + IBOutlet id delegate; +} + +#pragma mark *** Aesthetics *** +- (BOOL)animates; +- (void)setAnimates:(BOOL)an; +- (SRRecorderStyle)style; +- (void)setStyle:(SRRecorderStyle)nStyle; + +#pragma mark *** Delegate *** +- (id)delegate; +- (void)setDelegate:(id)aDelegate; + +#pragma mark *** Key Combination Control *** + +- (NSUInteger)allowedFlags; +- (void)setAllowedFlags:(NSUInteger)flags; + +- (BOOL)allowsKeyOnly; +- (void)setAllowsKeyOnly:(BOOL)nAllowsKeyOnly escapeKeysRecord:(BOOL)nEscapeKeysRecord; +- (BOOL)escapeKeysRecord; + +- (BOOL)canCaptureGlobalHotKeys; +- (void)setCanCaptureGlobalHotKeys:(BOOL)inState; + +- (NSUInteger)requiredFlags; +- (void)setRequiredFlags:(NSUInteger)flags; + +- (KeyCombo)keyCombo; +- (void)setKeyCombo:(KeyCombo)aKeyCombo; + +- (NSString *)keyChars; +- (NSString *)keyCharsIgnoringModifiers; + +#pragma mark *** Autosave Control *** + +- (NSString *)autosaveName; +- (void)setAutosaveName:(NSString *)aName; + +#pragma mark - + +// Returns the displayed key combination if set +- (NSString *)keyComboString; + +#pragma mark *** Conversion Methods *** + +- (NSUInteger)cocoaToCarbonFlags:(NSUInteger)cocoaFlags; +- (NSUInteger)carbonToCocoaFlags:(NSUInteger)carbonFlags; + +#pragma mark *** Binding Methods *** + +- (NSDictionary *)objectValue; +- (void)setObjectValue:(NSDictionary *)shortcut; + +@end + +// Delegate Methods +@interface NSObject (SRRecorderDelegate) +- (BOOL)shortcutRecorder:(SRRecorderControl *)aRecorder isKeyCode:(NSInteger)keyCode andFlagsTaken:(NSUInteger)flags reason:(NSString **)aReason; +- (void)shortcutRecorder:(SRRecorderControl *)aRecorder keyComboDidChange:(KeyCombo)newKeyCombo; +@end diff --git a/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Versions/A/Headers/SRValidator.h b/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Versions/A/Headers/SRValidator.h new file mode 100644 index 0000000..0dd8f28 --- /dev/null +++ b/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Versions/A/Headers/SRValidator.h @@ -0,0 +1,34 @@ +// +// SRValidator.h +// ShortcutRecorder +// +// Copyright 2006-2007 Contributors. All rights reserved. +// +// License: BSD +// +// Contributors: +// David Dauer +// Jesper +// Jamie Kirkpatrick + +#import + +@interface SRValidator : NSObject { + id delegate; +} + +- (id) initWithDelegate:(id)theDelegate; + +- (BOOL) isKeyCode:(NSInteger)keyCode andFlagsTaken:(NSUInteger)flags error:(NSError **)error; +- (BOOL) isKeyCode:(NSInteger)keyCode andFlags:(NSUInteger)flags takenInMenu:(NSMenu *)menu error:(NSError **)error; + +- (id) delegate; +- (void) setDelegate: (id) theDelegate; + +@end + +#pragma mark - + +@interface NSObject( SRValidation ) +- (BOOL) shortcutValidator:(SRValidator *)validator isKeyCode:(NSInteger)keyCode andFlagsTaken:(NSUInteger)flags reason:(NSString **)aReason; +@end diff --git a/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Versions/A/Headers/SR_LeopardView.h b/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Versions/A/Headers/SR_LeopardView.h new file mode 100644 index 0000000..26b78f3 --- /dev/null +++ b/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Versions/A/Headers/SR_LeopardView.h @@ -0,0 +1,15 @@ +// +// SR_LeopardView.h +// SR Leopard +// +// Created by Jesper on 2007-10-19. +// Copyright 2007 __MyCompanyName__. All rights reserved. +// + +#import + +@interface SR_LeopardView : NSView { + +} + +@end \ No newline at end of file diff --git a/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Versions/A/Headers/ShortcutRecorder.h b/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Versions/A/Headers/ShortcutRecorder.h new file mode 100644 index 0000000..855a288 --- /dev/null +++ b/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Versions/A/Headers/ShortcutRecorder.h @@ -0,0 +1,17 @@ +// +// ShortcutRecorder.h +// ShortcutRecorder +// - 10.5 version only; master framework header +// +// Copyright 2007 Contributors. All rights reserved. +// +// License: BSD +// +// Contributors to this file: +// Jesper + +#import +#import +#import +#import +#import diff --git a/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Versions/A/Resources/Info.plist b/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Versions/A/Resources/Info.plist new file mode 100644 index 0000000..c274cf7 --- /dev/null +++ b/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Versions/A/Resources/Info.plist @@ -0,0 +1,36 @@ + + + + + BuildMachineOSBuild + 11C74 + CFBundleDevelopmentRegion + English + CFBundleExecutable + ShortcutRecorder + CFBundleIdentifier + net.wafflesoftware.ShortcutRecorder.framework.Leopard + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + FMWK + CFBundleSignature + ???? + CFBundleVersion + 1.0 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 4D502 + DTPlatformVersion + GM + DTSDKBuild + 11C63 + DTSDKName + macosx10.7 + DTXcode + 0421 + DTXcodeBuild + 4D502 + + diff --git a/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Versions/A/ShortcutRecorder b/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Versions/A/ShortcutRecorder new file mode 100755 index 0000000000000000000000000000000000000000..69b4990eab4bcf6f99cda1d4708cc13259bf156d GIT binary patch literal 254644 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 literal 0 HcmV?d00001 diff --git a/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Versions/Current b/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Versions/Current new file mode 120000 index 0000000..8c7e5a6 --- /dev/null +++ b/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Versions/Current @@ -0,0 +1 @@ +A \ No newline at end of file diff --git a/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Info.plist b/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Info.plist new file mode 100644 index 0000000..45aa092 --- /dev/null +++ b/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Info.plist @@ -0,0 +1,42 @@ + + + + + BuildMachineOSBuild + 11C74 + CFBundleDevelopmentRegion + English + CFBundleExecutable + ShortcutRecorder + CFBundleIdentifier + net.wafflesoftware.ShortcutRecorder.IB.Leopard + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ShortcutRecorder + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 4D502 + DTPlatformVersion + GM + DTSDKBuild + 11C63 + DTSDKName + macosx10.7 + DTXcode + 0421 + DTXcodeBuild + 4D502 + NSPrincipalClass + SR_Leopard + + diff --git a/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/MacOS/ShortcutRecorder b/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/MacOS/ShortcutRecorder new file mode 100755 index 0000000000000000000000000000000000000000..bda3cab93306722fc3a467614a29d30fc6f27190 GIT binary patch literal 54484 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�AZLM`1#%Y1S>P|n0<-3M*Ob>( ztn$~*DXSU%tEef9EsT}iQeNY)JF6@srg}rlJSjSu(;%F|Q1dUDuE?)!I5=9XDiK05oF>@OUPUfJBSzNytn#xyGEzp+f0EQ5RJ z7{xP5wIpxv**<&~77@D@gw|m)9lHx8kN-NY;#{BlVm8_mYu_BI57#$FjbvZp;8ZV^ zkRSa^)P{DxGcl4q>8vFUCd08WKw^DOv^4@Fjf(cEEdwMf)X=o4BW5I%rwvXo==~d) zxmVPPS#l#eH(SwH)W|moMl$dywF*@%$6PR8g|yT( zhWAU+_~oG1E>E^c<5Xj+uDQ_{dB$pIH9696ty*2S3e9&kDcw{S8D^d_B@G%4##Zc> z(cg@Dt<=$-uO<4-?-2Ejs?TfciUO>aXYfN?}0i zuVK)`1Kv;OJ`z!9eX^t|9F6u*XvCx0ImgCk6SCro}l zfB2l@*RbaIkr__&`vf$azn*8b6~Bfxzn6!nBW`$NZt<*D&d6-yQIDntz9YM(v~LJ2^?t`qi-J zuXE5de{7#tsdj7OU@oV^tfVV1M23npPuG8gl!jz}yUAcmo z<!sr#!J>Y`BDPfEv(mmqBKktHH zbHTrI!BdKazG-<|AokPnpMmd%zZX8K;`bqh^JSy)8pX8<>={yAACE>O#j$vsSh!W( z7K^qf+B)L((PF(ANUrU{9vO)Zt)X}{9BIRnvf@9MUp|QxXS=a&$&{^@;S^U!H$&GIS*2Tm#nfFpJA2%Z5=C;H9rCtLY7p3sTcuZ_p07TTT6 z3cm3~sD*;#p><2t3x2XJOB;_BtJT&TnNtB-EUqZBKZK1wO-VTuJd&w}m`dCPgnA|8 z$xvoIZ%wL#e5jk0EWN;SQcC@F_(zTxWBU7|zw&OrD6@Bab(N2$I8{UhT}qCQ+ZvYI2f+KzGls3C5t|| zC=t1Jf{n|vZZ;Lb4GZscR@7V*ZNoO8@y&}G#Wi(86FL^po`m{Y7uQO@F<%GdF7BCM zOL+g-i@Wm{>d$D9rCJjNQKI^__36+!%SQ;JOphZ-O$3 z)35b1lO0`;@AJk*s#kat?=0L{^)j&;Dmqc=S5lL|jmmh7CSR~+B&io``o+}vucR{G zrx_WLdJUD4rrx-XdHpA63v$0X3;Y>a;03w=zcCfMaB_|7Bj3R+TsJ~a4t@$h?!D5H zoZjc(D3R-yIq|0_|0dh(zYg=DOY!wG!+ar3{W$i}$A0{B6LW6!542kcuBXQiHey{p z_0+ClnwXXo6P=Uo>E90-J}@#=uW_UpC4&I=cXn>?JVuY>;C&JWXXtcJd7;q6d)eQ{Go4FTfY8o|d3(kYI`c;PDOEV=FTRKzg)?RJ`Ouz$WayNEqzoAer32E(l%uFj z?)%HoDZ{NtLL37@31ej}1TX7?p;HEu9D3mSEIe8uw>_^0ZygvIjxVE0EC8vGhOkw6 zVoX^c1aCEDFq~M%XkpxX*xwJde%MeEw=%S2~ zaU*!yCmD_>BaeB&heEDB<5wcl3y*L=8X5Z;X|+2KuS7}+0MELwMi|jZgnfV;5n|aG zwkwhO^ShUJz;_{h@FU0<@3ru1PJB~?z-U#Ty2jw~nr2+r2!61Sar^{}`AmDJ`R%U6 zhoTR!`R5Ih3qJVne54hT`mbP*_#06SmQmIzzaseK_K4@$xh6yA=Y{kMriJ7l@S|HQ zjP8~1+8@3-LoQoT-v7w{@GJxS+^AjtbbG^7_F|{(lh_x249`jI2~Qr;XAp|I{U6>B z{zmjgFY?N{oCR_g$XOs~ft&?$7RXs3XMvmrau�AZLN!&jPjP&%2Hk*koE`1q-d( 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 literal 0 HcmV?d00001 diff --git a/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Resources/English.lproj/InfoPlist.strings b/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Resources/English.lproj/InfoPlist.strings new file mode 100644 index 0000000000000000000000000000000000000000..308f87481f2bf26b12c145751a9be08d1ad15d0a GIT binary patch literal 270 zcmW-bOA5kJ3`OtQRTPIJR-8BxM@|&Pfn7nrDr#F^TSa%|Ce@P=c*(oDImz!EYobVd zHOiIhrioqE(O?w7kJiZvn*O0?CWJKS1F`YGI0 z8B?V;5LzYz{FBbkSi>3X!~4Wn5$24b+UDNX;EECL#)QcRM$h$wGi*=pT0s@?*srE% Un=*IVM5igeh33SPtt&461M&R literal 0 HcmV?d00001 diff --git a/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Resources/English.lproj/SR_LeopardInspector.nib b/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Resources/English.lproj/SR_LeopardInspector.nib new file mode 100644 index 0000000000000000000000000000000000000000..0c5de0d6108e94aa30339d7000d09800f7923383 GIT binary patch literal 10173 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 literal 0 HcmV?d00001 diff --git a/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Resources/SRRecorderControl.classdescription b/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Resources/SRRecorderControl.classdescription new file mode 100755 index 0000000..46527ac --- /dev/null +++ b/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Resources/SRRecorderControl.classdescription @@ -0,0 +1,9 @@ +{ + Actions = { + }; + Outlets = { + delegate = id; + }; + ClassName = SRRecorderControl; + SuperClass = NSControl; +} diff --git a/Spanish.lproj/Credits.html b/Spanish.lproj/Credits.html new file mode 100755 index 0000000..fae34b2 --- /dev/null +++ b/Spanish.lproj/Credits.html @@ -0,0 +1 @@ +

Escrito por:
   Chris Reed <creed@manyetas.com>
   http://www.manyetas.com/


Localización al alemán:
   Richard Zelzer
   http://www.zmusik.de/
   Ralf Welter <i_see@macnews.de>


Localización al Francés:
   Frédéric Ballériaux


Localización al Japonés:
   Hiroshi Yamato
   http://salvageship.dropcontrol.com/


Localización al Español:
   Fernando Díaz de la Torre


Agradecimientos a:
   Airy André
   Skye Ashbrook
   Frédéric Ballériaux
   Damon
   Alexander Guy
   Magnus Helin
   Michael Keuter
   Norbert Rittel
   Ralf Welter
   rasda
   Adrian Steiger
   tdc
   Fernando Díaz de la Torre
   Jon Wight
   Hiroshi Yamato
   xonox
   Richard Zelzer

\ No newline at end of file diff --git a/Spanish.lproj/InfoPlist.strings b/Spanish.lproj/InfoPlist.strings new file mode 100755 index 0000000000000000000000000000000000000000..f091fb36ee729ea48ca7fda28d8cf6633d8cb2ed GIT binary patch literal 560 zcmbV}%}&Bl5QWd0r)XFb1)B3N%!%sbVd)&_Odfa$9_%l1#1)AK(+dFWeI1wpJcrYEAYF^xmUd>Zrl# zYoJGMKs#_Vjp0x6fgZ4?Mld_-Dpzy2^i41bRc6!|Y!!EAQxSDyM$WR@vsqNIX@X2cIKYUuSY@s3@^lhmUVOt%v!wO{X}i3 Q_CnS8caJ95k@+&z1Na3eU;qFB literal 0 HcmV?d00001 diff --git a/Spanish.lproj/Localizable.strings b/Spanish.lproj/Localizable.strings new file mode 100755 index 0000000000000000000000000000000000000000..c5930e4e1fe6309dce838e9bfa628741cfc89d37 GIT binary patch literal 1350 zcma)+K~LL25QXQ`OMb=5NEPA$rPqo>Q7Tocf)5d>R}&|x!LgC!6gcz0f$z=6*d!b{ ztk)jzym|BX?LNQQ$WH9Yf|XX=%rfS});71C*nj4RuY!LSb6{TZTw6=LAhz`AhG)!B zto5wQu}XVny`sS;%sJx^{~tZ?h}xq!1}ox~ZG62jR)aN(U6I*VP|sCjSTJhz0L zGe%;m^IAHR_z!au`$4V5F1(vz)&-b3Bd*Yz6x^1G6bN={cf`6HQ|ewjvh?WIb=kYQ zW7gc$SD$|l?hT^>aX(+xe-m%{+bi`8gp8^seDVR-{>s#A#ZLGCj^VxjG}40I?lg%m zkw4@Kv0K1WJ>1*Bt=_G_HLjWZlXexW0`b_=g zytsr(tkkKU`r2UA0YcyV)O{3j#kYpLdeW|mb^WI5M>w&M_iB#GkLn1u+A1^waRz=0 zk6?cpr}oW`?Yr01EwI^E)*Tf!?KIS_6nomed3xpg(-zN~PV3BWO=mPmmBB4>aOgb+ R?yM6F2TvBheqlbe(JR*C+KT`H literal 0 HcmV?d00001 diff --git a/Spanish.lproj/MainMenu.xib b/Spanish.lproj/MainMenu.xib new file mode 100644 index 0000000..46d9b39 --- /dev/null +++ b/Spanish.lproj/MainMenu.xib @@ -0,0 +1,2802 @@ + + + + 1060 + 10C540 + 740 + 1038.25 + 458.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 740 + + + YES + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + + + YES + + YES + + + YES + + + + YES + + + NSApplication + + + + FirstResponder + + + NSApplication + + + 263 + 2 + {{405, 418}, {371, 157}} + 1886912512 + Midi Keys + NSWindow + + View + + {595, 157} + {371, 157} + + + 256 + + YES + + + 256 + + YES + + + 290 + {371, 57} + + + MidiKeyView + NSView + + + + 268 + {{233, 67}, {118, 15}} + + + YES + + 67501824 + 131072 + + + + + Helvetica + 12 + 16 + + + 127 + 1 + 64 + 0.0 + 0 + 1 + NO + NO + + + + + 268 + {{87, 67}, {31, 19}} + + + YES + + -2075001280 + 4195328 + 1 + + LucidaGrande + 11 + 3100 + + + YES + + 6 + System + textBackgroundColor + + 3 + MQA + + + + 6 + System + textColor + + 3 + MAA + + + + + + + 268 + {{17, 69}, {38, 14}} + + + YES + + 67239424 + 4194304 + Canal: + + + + 6 + System + controlColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 6 + System + controlTextColor + + + + + + + 268 + {{168, 69}, {60, 14}} + + + YES + + 67239424 + 4194304 + VmVsb2NpZGFkOgo + + + + + + + + + 268 + {{123, 62}, {19, 27}} + + + YES + + 917024 + 0 + + 1 + 1 + 16 + 1 + YES + + + + {371, 87} + + + NSView + + + + 256 + + YES + + + 268 + {{123, 27}, {160, 22}} + + + YES + + -2076049856 + 132096 + + + 109199615 + 1 + + + + + + + + 400 + 75 + + + Item1 + + 1048576 + 2147483647 + 1 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + _popUpItemAction: + + + YES + + + OtherViews + + + YES + + + + Item2 + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + Item3 + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + 3 + YES + YES + 1 + + + + + 268 + {{123, 2}, {160, 22}} + + + YES + + -2076049856 + 132096 + + + 109199615 + 1 + + + + + + + + 400 + 75 + + + Item1 + + 1048576 + 2147483647 + 1 + + + _popUpItemAction: + + + YES + + + OtherViews + + + YES + + + + Item2 + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + Item3 + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + 3 + YES + YES + 1 + + + + + 268 + {{17, 8}, {107, 14}} + + + YES + + 67239424 + 4194304 + T8OtciBwb3IgcHVlcnRvOgo + + + + + + + + + 268 + {{17, 33}, {107, 14}} + + + YES + + 67239424 + 4194304 + Destino: + + + + + + + + + 256 + {{287, 7}, {66, 16}} + + + YES + + 67239424 + 131072 + A través + + + 1211912703 + 2 + + NSSwitch + + + + 200 + 25 + + + + {{0, 89}, {371, 68}} + + + NSView + + + {371, 157} + + + + {{0, 0}, {1280, 832}} + {371, 179} + {595, 179} + MidiKeys + + + MainMenu + + YES + + + MidiKeys + + 1048576 + 2147483647 + + + submenuAction: + + MidiKeys + + YES + + + Acerca de MidiKeys + + 2147483647 + + + + + + Preferencias... + , + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Servicios + + 1048576 + 2147483647 + + + submenuAction: + + Servicios + + YES + + _NSServicesMenu + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Ocultar MidiKeys + h + 1048576 + 2147483647 + + + + + + Ocultar otros + h + 1572864 + 2147483647 + + + + + + Mostrar todo + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Salir de MidiKeys + q + 1048576 + 2147483647 + + + + + _NSAppleMenu + + + + + Teclado + + 1048576 + 2147483647 + + + submenuAction: + + Teclado + + YES + + + Subir octava + u + 1048576 + 2147483647 + + + + + + Bajar octava + d + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Enviar "All Notes Off" + \ + 1048576 + 2147483647 + + + + + + + + + Editar + + 1048576 + 2147483647 + + + submenuAction: + + Editar + + YES + + + Deshacer + z + 1048576 + 2147483647 + + + + + + Rehacer + Z + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Cortar + x + 1048576 + 2147483647 + + + + + + Copiar + c + 1048576 + 2147483647 + + + + + + Pegar + v + 1048576 + 2147483647 + + + + + + Borrar + + 1048576 + 2147483647 + + + + + + Seleccionar todo + a + 1048576 + 2147483647 + + + + + + + + + Ventana + + 1048576 + 2147483647 + + + submenuAction: + + Ventana + + YES + + + Minimizar + m + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Traer todo al frente + + 1048576 + 2147483647 + + + + + _NSWindowsMenu + + + + + Ayuda + + 1048576 + 2147483647 + + + submenuAction: + + Ayuda + + YES + + + Ayuda MidiKeys + ? + 1048576 + 2147483647 + + + + + + + + _NSMainMenu + + + AppController + + + PreferencesController + + + KeyMapManager + + + + + YES + + + performMiniaturize: + + + + 37 + + + + arrangeInFront: + + + + 39 + + + + showHelp: + + + + 122 + + + + terminate: + + + + 139 + + + + orderFrontStandardAboutPanel: + + + + 142 + + + + hideOtherApplications: + + + + 146 + + + + hide: + + + + 152 + + + + unhideAllApplications: + + + + 153 + + + + cut: + + + + 175 + + + + paste: + + + + 176 + + + + redo: + + + + 178 + + + + selectAll: + + + + 179 + + + + undo: + + + + 180 + + + + copy: + + + + 181 + + + + delete: + + + + 195 + + + + destinationPopup + + + + 204 + + + + destinationSelected: + + + + 206 + + + + midiKeys + + + + 209 + + + + velocitySlider + + + + 212 + + + + velocitySliderChanged: + + + + 213 + + + + sourcePopup + + + + 220 + + + + sourceSelected: + + + + 221 + + + + channelField + + + + 228 + + + + channelStepper + + + + 229 + + + + channelDidChange: + + + + 230 + + + + delegate + + + + 231 + + + + octaveUp: + + + + 234 + + + + octaveDown: + + + + 235 + + + + nextKeyView + + + + 238 + + + + nextKeyView + + + + 239 + + + + nextKeyView + + + + 240 + + + + nextKeyView + + + + 241 + + + + initialFirstResponder + + + + 242 + + + + showPanel: + + + + 244 + + + + keyMapManager + + + + 246 + + + + delegate + + + + 247 + + + + toggleView + + + + 251 + + + + hiddenItemsView + + + + 255 + + + + midiThruCheckbox + + + + 257 + + + + toggleMidiThru: + + + + 258 + + + + sendAllNotesOff: + + + + 261 + + + + + YES + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + 21 + + + YES + + + + Window + + + 2 + + + YES + + + + + + + 250 + + + YES + + + + + + + + + + + 208 + + + + + 210 + + + YES + + + + + + 211 + + + YES + + + + + + 222 + + + YES + + + + + + 223 + + + YES + + + + + + 225 + + + YES + + + + + + 254 + + + YES + + + + + + + + + + 198 + + + YES + + + + + + 217 + + + YES + + + + + + 219 + + + YES + + + + + + 236 + + + YES + + + + + + 256 + + + YES + + + + + + 29 + + + YES + + + + + + + + MainMenu + + + 19 + + + YES + + + + + + 24 + + + YES + + + + + + + + 5 + + + + + 23 + + + + + 92 + + + + + 56 + + + YES + + + + + + 57 + + + YES + + + + + + + + + + + + + + + 58 + + + + + 129 + + + + + 131 + + + YES + + + + + + 130 + + + + + 134 + + + + + 136 + + + + + 143 + + + + + 144 + + + + + 145 + + + + + 149 + + + + + 150 + + + + + 83 + + + YES + + + + + + 81 + + + YES + + + + + + + + + 78 + + + + + 233 + + + + + 259 + + + + + 260 + + + + + 103 + + + YES + + + + + + 106 + + + YES + + + + + + 111 + + + + + 163 + + + YES + + + + + + 169 + + + YES + + + + + + + + + + + + + 156 + + + + + 157 + + + + + 158 + + + + + 160 + + + + + 164 + + + + + 171 + + + + + 172 + + + + + 173 + + + + + 203 + + + AppController + + + 243 + + + PreferencesController + + + 245 + + + KeyMapManager + + + 263 + + + + + 264 + + + + + 265 + + + + + 266 + + + + + 267 + + + + + 268 + + + YES + + + + + + 269 + + + YES + + + + + + 270 + + + + + 271 + + + + + 272 + + + + + 199 + + + YES + + + + + + + + 201 + + + + + 200 + + + + + 197 + + + + + 215 + + + YES + + + + + + + + 218 + + + + + 216 + + + + + 214 + + + + + -3 + + + Application + + + + + YES + + YES + 103.IBPluginDependency + 103.ImportedFromIB2 + 106.IBPluginDependency + 106.ImportedFromIB2 + 111.IBPluginDependency + 111.ImportedFromIB2 + 129.IBPluginDependency + 129.ImportedFromIB2 + 130.IBPluginDependency + 130.ImportedFromIB2 + 131.IBPluginDependency + 131.ImportedFromIB2 + 134.IBPluginDependency + 134.ImportedFromIB2 + 136.IBPluginDependency + 136.ImportedFromIB2 + 143.IBPluginDependency + 143.ImportedFromIB2 + 144.IBPluginDependency + 144.ImportedFromIB2 + 145.IBPluginDependency + 145.ImportedFromIB2 + 149.IBPluginDependency + 149.ImportedFromIB2 + 150.IBPluginDependency + 150.ImportedFromIB2 + 156.IBPluginDependency + 156.ImportedFromIB2 + 157.IBPluginDependency + 157.ImportedFromIB2 + 158.IBPluginDependency + 158.ImportedFromIB2 + 160.IBPluginDependency + 160.ImportedFromIB2 + 163.IBPluginDependency + 163.ImportedFromIB2 + 164.IBPluginDependency + 164.ImportedFromIB2 + 169.IBPluginDependency + 169.ImportedFromIB2 + 171.IBPluginDependency + 171.ImportedFromIB2 + 172.IBPluginDependency + 172.ImportedFromIB2 + 173.IBPluginDependency + 173.ImportedFromIB2 + 19.IBPluginDependency + 19.ImportedFromIB2 + 197.IBPluginDependency + 197.ImportedFromIB2 + 198.IBPluginDependency + 198.ImportedFromIB2 + 199.IBPluginDependency + 199.ImportedFromIB2 + 2.IBPluginDependency + 2.ImportedFromIB2 + 200.IBPluginDependency + 200.ImportedFromIB2 + 201.IBPluginDependency + 201.ImportedFromIB2 + 203.ImportedFromIB2 + 208.IBPluginDependency + 208.ImportedFromIB2 + 21.IBEditorWindowLastContentRect + 21.IBPluginDependency + 21.IBWindowTemplateEditedContentRect + 21.ImportedFromIB2 + 21.windowTemplate.hasMaxSize + 21.windowTemplate.hasMinSize + 21.windowTemplate.maxSize + 21.windowTemplate.minSize + 210.IBPluginDependency + 210.ImportedFromIB2 + 211.IBPluginDependency + 211.ImportedFromIB2 + 214.IBPluginDependency + 214.ImportedFromIB2 + 215.IBPluginDependency + 215.ImportedFromIB2 + 216.IBPluginDependency + 216.ImportedFromIB2 + 217.IBPluginDependency + 217.ImportedFromIB2 + 218.IBPluginDependency + 218.ImportedFromIB2 + 219.IBPluginDependency + 219.ImportedFromIB2 + 222.IBPluginDependency + 222.ImportedFromIB2 + 223.IBPluginDependency + 223.ImportedFromIB2 + 225.IBPluginDependency + 225.ImportedFromIB2 + 23.IBPluginDependency + 23.ImportedFromIB2 + 233.IBPluginDependency + 233.ImportedFromIB2 + 236.IBPluginDependency + 236.ImportedFromIB2 + 24.IBPluginDependency + 24.ImportedFromIB2 + 243.ImportedFromIB2 + 245.ImportedFromIB2 + 250.IBPluginDependency + 250.ImportedFromIB2 + 254.IBPluginDependency + 254.ImportedFromIB2 + 256.IBPluginDependency + 256.ImportedFromIB2 + 259.IBPluginDependency + 259.ImportedFromIB2 + 260.IBPluginDependency + 260.ImportedFromIB2 + 29.IBPluginDependency + 29.ImportedFromIB2 + 5.IBPluginDependency + 5.ImportedFromIB2 + 56.IBPluginDependency + 56.ImportedFromIB2 + 57.IBPluginDependency + 57.ImportedFromIB2 + 58.IBPluginDependency + 58.ImportedFromIB2 + 78.IBPluginDependency + 78.ImportedFromIB2 + 81.IBPluginDependency + 81.ImportedFromIB2 + 83.IBPluginDependency + 83.ImportedFromIB2 + 92.IBPluginDependency + 92.ImportedFromIB2 + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + {{63, 886}, {371, 157}} + com.apple.InterfaceBuilder.CocoaPlugin + {{63, 886}, {371, 157}} + + + + {595, 157} + {371, 157} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + + + YES + + + YES + + + + + YES + + + YES + + + + 282 + + + + YES + + AppController + NSObject + + YES + + YES + channelDidChange: + destinationSelected: + octaveDown: + octaveUp: + sendAllNotesOff: + showPreferences: + sourceSelected: + toggleHotKeys: + toggleMidiControls: + toggleMidiThru: + velocitySliderChanged: + + + YES + id + id + id + id + id + id + id + id + id + id + id + + + + YES + + YES + _toggleHotKeysMenuItem + channelField + channelStepper + destinationPopup + hiddenItemsView + keyMapManager + midiKeys + midiThruCheckbox + sourcePopup + toggleView + velocitySlider + + + YES + NSMenuItem + NSTextField + NSStepper + NSPopUpButton + NSView + KeyMapManager + MidiKeyView + NSButton + NSPopUpButton + NSView + NSSlider + + + + IBProjectSource + AppController.h + + + + AppController + NSObject + + IBUserSource + + + + + FirstResponder + + sendAllNotesOff: + id + + + IBUserSource + + + + + KeyMapManager + NSObject + + IBProjectSource + KeyMapManager.h + + + + KeyMapManager + NSObject + + IBUserSource + + + + + MidiKeyView + NSView + + mDelegate + id + + + IBProjectSource + MidiKeyView.h + + + + MidiKeyView + NSView + + IBUserSource + + + + + NSObject + + + + NSObject + + IBProjectSource + MidiKeysApplication.h + + + + NSObject + + IBProjectSource + OverlayIndicator.h + + + + NSObject + + IBProjectSource + ShortcutRecorder.h + + + + NSObject + + IBProjectSource + ShortcutRecorderCell.h + + + + PreferencesController + NSObject + + YES + + YES + cancel: + ok: + showPanel: + + + YES + id + id + id + + + + YES + + YES + _clickThroughCheckbox + _octaveDownHotKeysShortcut + _octaveUpHotKeysShortcut + _prefsWindow + _toggleHotKeysShortcut + _velocityDownHotKeysShortcut + _velocityUpHotKeysShortcut + commandModifierCheckbox + controlModifierCheckbox + floatWindowCheckbox + highlightColourWell + keymapPopup + optionModifierCheckbox + shiftModifierCheckbox + showKeyCapsCheckbox + showNotificationOverlaysCheckbox + solidOnTopCheckbox + useHotKeysCheckbox + windowTransparencySlider + + + YES + NSButton + ShortcutRecorder + ShortcutRecorder + NSWindow + ShortcutRecorder + ShortcutRecorder + ShortcutRecorder + NSButton + NSButton + NSButton + NSColorWell + NSPopUpButton + NSButton + NSButton + NSButton + NSButton + NSButton + NSButton + NSSlider + + + + IBProjectSource + PreferencesController.h + + + + PreferencesController + NSObject + + YES + + YES + transparencySlider + useHotkeysCheckbox + + + YES + NSSlider + NSButton + + + + IBUserSource + + + + + ShortcutRecorder + NSControl + + delegate + id + + + + + + YES + + NSActionCell + NSCell + + IBFrameworkSource + AppKit.framework/Headers/NSActionCell.h + + + + NSApplication + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSApplication.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSApplicationScripting.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSColorPanel.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSHelpManager.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSPageLayout.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSUserInterfaceItemSearching.h + + + + NSBrowser + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSBrowser.h + + + + NSButton + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSButton.h + + + + NSButtonCell + NSActionCell + + IBFrameworkSource + AppKit.framework/Headers/NSButtonCell.h + + + + NSCell + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSCell.h + + + + NSColorWell + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSColorWell.h + + + + NSControl + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSControl.h + + + + NSFormatter + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFormatter.h + + + + NSMatrix + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSMatrix.h + + + + NSMenu + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSMenu.h + + + + NSMenuItem + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSMenuItem.h + + + + NSMenuItemCell + NSButtonCell + + IBFrameworkSource + AppKit.framework/Headers/NSMenuItemCell.h + + + + NSMovieView + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSMovieView.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSAccessibility.h + + + + NSObject + + + + NSObject + + + + NSObject + + + + NSObject + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSDictionaryController.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSDragging.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSFontManager.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSFontPanel.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSKeyValueBinding.h + + + + NSObject + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSNibLoading.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSOutlineView.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSPasteboard.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSSavePanel.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSTableView.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSToolbarItem.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSView.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSClassDescription.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObjectScripting.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSPortCoder.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptClassDescription.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptObjectSpecifiers.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptWhoseTests.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLDownload.h + + + + NSObject + + IBFrameworkSource + Sparkle.framework/Headers/SUAppcast.h + + + + NSObject + + IBFrameworkSource + Sparkle.framework/Headers/SUUpdater.h + + + + NSPopUpButton + NSButton + + IBFrameworkSource + AppKit.framework/Headers/NSPopUpButton.h + + + + NSPopUpButtonCell + NSMenuItemCell + + IBFrameworkSource + AppKit.framework/Headers/NSPopUpButtonCell.h + + + + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSInterfaceStyle.h + + + + NSResponder + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSResponder.h + + + + NSSlider + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSSlider.h + + + + NSSliderCell + NSActionCell + + IBFrameworkSource + AppKit.framework/Headers/NSSliderCell.h + + + + NSStepper + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSStepper.h + + + + NSStepperCell + NSActionCell + + IBFrameworkSource + AppKit.framework/Headers/NSStepperCell.h + + + + NSTableView + NSControl + + + + NSText + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSText.h + + + + NSTextField + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSTextField.h + + + + NSTextFieldCell + NSActionCell + + IBFrameworkSource + AppKit.framework/Headers/NSTextFieldCell.h + + + + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSClipView.h + + + + NSView + + + + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSRulerView.h + + + + NSView + NSResponder + + + + NSWindow + + IBFrameworkSource + AppKit.framework/Headers/NSDrawer.h + + + + NSWindow + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSWindow.h + + + + NSWindow + + IBFrameworkSource + AppKit.framework/Headers/NSWindowScripting.h + + + + + 0 + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 + + + YES + ../MidiKeys.xcodeproj + 3 + + diff --git a/Spanish.lproj/Preferences.xib b/Spanish.lproj/Preferences.xib new file mode 100644 index 0000000..e40e0bd --- /dev/null +++ b/Spanish.lproj/Preferences.xib @@ -0,0 +1,1267 @@ + + + + 1060 + 10C540 + 740 + 1038.25 + 458.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 740 + + + YES + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + + + YES + + YES + + + YES + + + + YES + + PreferencesController + + + FirstResponder + + + NSApplication + + + 1 + 2 + {{445, 317}, {334, 407}} + 1886912512 + MidiKeys Preferences + NSWindow + + View + + {1.79769e+308, 1.79769e+308} + {213, 107} + + + 256 + + YES + + + 256 + + YES + + YES + + NSColor pasteboard type + + + + {{217, 361}, {38, 26}} + + YES + YES + + 1 + MC4wNTgxMzA0OTg5OCAwLjA1NTU0MTg5OTA2IDEAA + + + + + 256 + {{130, 276}, {164, 26}} + + YES + + -2076049856 + 1024 + + LucidaGrande + 13 + 1044 + + + -2038284033 + 1 + + + + + + 400 + 75 + + + US-English + + 1048576 + 2147483647 + 1 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + _popUpItemAction: + + + YES + + + OtherViews + + + YES + + + + UK-English + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + German + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + French + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + 3 + YES + YES + 1 + + + + + 256 + {{42, 282}, {86, 17}} + + YES + + 67239424 + 4194304 + Mapa teclas: + + + + 6 + System + controlColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 6 + System + controlTextColor + + 3 + MAA + + + + + + + 256 + {{43, 244}, {219, 18}} + + YES + + 67239424 + 0 + Teclas que son teclas sensibles + + + 1211912703 + 2 + + NSSwitch + + + + 200 + 25 + + + + + 256 + {{43, 125}, {267, 18}} + + YES + + 67239424 + 0 + La ventana del teclado siempre encima + + + 1211912703 + 2 + + + + 200 + 25 + + + + + 256 + {{58, 319}, {231, 17}} + + YES + + 67501824 + 131072 + + + + + Helvetica + 12 + 16 + + + 100 + 0.0 + 75 + 0.0 + 10 + 0 + NO + NO + + + + + 256 + {{55, 344}, {104, 14}} + + YES + + 67239424 + 4194304 + VHJhbnNwYXJlbmNpYToKA + + LucidaGrande + 11 + 3100 + + + + + + + + + 256 + {{42, 366}, {174, 17}} + + YES + + 67239424 + 4194304 + SWx1bWluYWNpb24gdGVjbGEgcHVsc2FkYQo + + + + + + + + + 256 + {{58, 80}, {231, 17}} + + YES + + 67501824 + 131072 + + + + + + 100 + 0.0 + 75 + 0.0 + 10 + 0 + NO + NO + + + + + 256 + {{211, 12}, {84, 32}} + + YES + + 67239424 + 134217728 + OK + + + -2038284033 + 1 + + + DQ + 200 + 25 + + + + + 256 + {{121, 12}, {95, 32}} + + YES + + 67239424 + 134217728 + Cancelar + + + -2038284033 + 1 + + + Gw + 200 + 25 + + + + + 256 + {{57, 224}, {74, 16}} + + YES + + 67239424 + 131072 + ⌃ Control + + + 1211912703 + 2 + + + + 200 + 25 + + + + + 256 + {{57, 204}, {102, 16}} + + YES + + 67239424 + 131072 + ⇧ Mayúsculas + + + 1211912703 + 2 + + + + 200 + 25 + + + + + 256 + {{57, 184}, {78, 16}} + + YES + + 67239424 + 131072 + ⌥ Opción + + + 1211912703 + 2 + + + + 200 + 25 + + + + + 256 + {{57, 164}, {92, 16}} + + YES + + 67239424 + 131072 + ⌘ Comando + + + 1211912703 + 2 + + + + 200 + 25 + + + + + 256 + {{55, 105}, {88, 14}} + + YES + + 67239424 + 4194304 + Transparencia: + + + + + + + + + 256 + {{57, 58}, {223, 16}} + + YES + + 67239424 + 131072 + Opaco cuando MidiKeys está al frente + + + 1211912703 + 2 + + + + 200 + 25 + + + + {{1, 9}, {334, 407}} + + {{0, 0}, {1024, 746}} + {213, 129} + {1.79769e+308, 1.79769e+308} + + + + + YES + + + delegate + + + + 18 + + + + keymapPopup + + + + 23 + + + + highlightColourWell + + + + 24 + + + + floatWindowCheckbox + + + + 25 + + + + useHotKeysCheckbox + + + + 26 + + + + transparencySlider + + + + 32 + + + + windowTransparencySlider + + + + 35 + + + + ok: + + + + 40 + + + + cancel: + + + + 41 + + + + nextKeyView + + + + 49 + + + + nextKeyView + + + + 50 + + + + controlModifierCheckbox + + + + 56 + + + + shiftModifierCheckbox + + + + 57 + + + + optionModifierCheckbox + + + + 58 + + + + commandModifierCheckbox + + + + 59 + + + + refreshModifierCheckboxState: + + + + 60 + + + + nextKeyView + + + + 61 + + + + nextKeyView + + + + 62 + + + + nextKeyView + + + + 63 + + + + nextKeyView + + + + 64 + + + + initialFirstResponder + + + + 67 + + + + nextKeyView + + + + 68 + + + + nextKeyView + + + + 69 + + + + nextKeyView + + + + 70 + + + + nextKeyView + + + + 72 + + + + nextKeyView + + + + 73 + + + + nextKeyView + + + + 74 + + + + solidOnTopCheckbox + + + + 77 + + + + + YES + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + 5 + + + YES + + + + PreferencesPanel + + + 6 + + + YES + + + + + + + + + + + + + + + + + + + + + + 7 + + + + + 11 + + + YES + + + + + + 14 + + + YES + + + + + + 16 + + + YES + + + + + + 17 + + + YES + + + + + + 27 + + + YES + + + + + + 28 + + + YES + + + + + + 29 + + + YES + + + + + + 33 + + + YES + + + + + + 36 + + + YES + + + + + + 37 + + + YES + + + + + + 52 + + + YES + + + + + + 53 + + + YES + + + + + + 54 + + + YES + + + + + + 55 + + + YES + + + + + + 66 + + + YES + + + + + + 76 + + + YES + + + + + + 79 + + + YES + + + + + + 80 + + + + + 81 + + + + + 82 + + + + + 83 + + + + + 84 + + + + + 85 + + + + + 86 + + + + + 87 + + + + + 88 + + + + + 89 + + + + + 90 + + + + + 91 + + + + + 92 + + + + + 93 + + + + + 94 + + + + + 9 + + + YES + + + + + + + + + 15 + + + + + 13 + + + + + 12 + + + + + 10 + + + + + -3 + + + Application + + + + + YES + + YES + 10.IBPluginDependency + 10.ImportedFromIB2 + 11.IBPluginDependency + 11.ImportedFromIB2 + 12.IBPluginDependency + 12.ImportedFromIB2 + 13.IBPluginDependency + 13.ImportedFromIB2 + 14.IBPluginDependency + 14.ImportedFromIB2 + 15.IBPluginDependency + 15.ImportedFromIB2 + 16.IBPluginDependency + 16.ImportedFromIB2 + 17.IBPluginDependency + 17.ImportedFromIB2 + 27.IBPluginDependency + 27.ImportedFromIB2 + 28.IBPluginDependency + 28.ImportedFromIB2 + 29.IBPluginDependency + 29.ImportedFromIB2 + 33.IBPluginDependency + 33.ImportedFromIB2 + 36.IBPluginDependency + 36.ImportedFromIB2 + 37.IBPluginDependency + 37.ImportedFromIB2 + 5.IBPluginDependency + 5.ImportedFromIB2 + 5.windowTemplate.hasMinSize + 5.windowTemplate.minSize + 52.IBPluginDependency + 52.ImportedFromIB2 + 53.IBPluginDependency + 53.ImportedFromIB2 + 54.IBPluginDependency + 54.ImportedFromIB2 + 55.IBPluginDependency + 55.ImportedFromIB2 + 6.IBPluginDependency + 6.ImportedFromIB2 + 66.IBPluginDependency + 66.ImportedFromIB2 + 7.IBPluginDependency + 7.ImportedFromIB2 + 76.IBPluginDependency + 76.ImportedFromIB2 + 9.IBPluginDependency + 9.ImportedFromIB2 + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + {213, 107} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + + + YES + + + YES + + + + + YES + + + YES + + + + 94 + + + + YES + + FirstResponder + + IBUserSource + + + + + PreferencesController + NSObject + + YES + + YES + cancel: + ok: + refreshModifierCheckboxState: + + + YES + id + id + id + + + + YES + + YES + commandModifierCheckbox + controlModifierCheckbox + floatWindowCheckbox + highlightColourWell + keymapPopup + optionModifierCheckbox + shiftModifierCheckbox + solidOnTopCheckbox + transparencySlider + useHotKeysCheckbox + windowTransparencySlider + + + YES + NSButton + NSButton + NSButton + NSColorWell + NSPopUpButton + NSButton + NSButton + NSButton + NSSlider + NSButton + NSSlider + + + + IBUserSource + + + + + + 0 + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 + + + YES + + 3 + + diff --git a/Sparkle.framework/Headers b/Sparkle.framework/Headers new file mode 120000 index 0000000..a177d2a --- /dev/null +++ b/Sparkle.framework/Headers @@ -0,0 +1 @@ +Versions/Current/Headers \ No newline at end of file diff --git a/Sparkle.framework/Resources b/Sparkle.framework/Resources new file mode 120000 index 0000000..953ee36 --- /dev/null +++ b/Sparkle.framework/Resources @@ -0,0 +1 @@ +Versions/Current/Resources \ No newline at end of file diff --git a/Sparkle.framework/Sparkle b/Sparkle.framework/Sparkle new file mode 120000 index 0000000..b2c5273 --- /dev/null +++ b/Sparkle.framework/Sparkle @@ -0,0 +1 @@ +Versions/Current/Sparkle \ No newline at end of file diff --git a/Sparkle.framework/Versions/A/Headers/SUAppcast.h b/Sparkle.framework/Versions/A/Headers/SUAppcast.h new file mode 100644 index 0000000..171148a --- /dev/null +++ b/Sparkle.framework/Versions/A/Headers/SUAppcast.h @@ -0,0 +1,33 @@ +// +// SUAppcast.h +// Sparkle +// +// Created by Andy Matuschak on 3/12/06. +// Copyright 2006 Andy Matuschak. All rights reserved. +// + +#ifndef SUAPPCAST_H +#define SUAPPCAST_H + +@class SUAppcastItem; +@interface SUAppcast : NSObject { + NSArray *items; + NSString *userAgentString; + id delegate; + NSMutableData *incrementalData; +} + +- (void)fetchAppcastFromURL:(NSURL *)url; +- (void)setDelegate:delegate; +- (void)setUserAgentString:(NSString *)userAgentString; + +- (NSArray *)items; + +@end + +@interface NSObject (SUAppcastDelegate) +- (void)appcastDidFinishLoading:(SUAppcast *)appcast; +- (void)appcast:(SUAppcast *)appcast failedToLoadWithError:(NSError *)error; +@end + +#endif diff --git a/Sparkle.framework/Versions/A/Headers/SUAppcastItem.h b/Sparkle.framework/Versions/A/Headers/SUAppcastItem.h new file mode 100644 index 0000000..7f1ca65 --- /dev/null +++ b/Sparkle.framework/Versions/A/Headers/SUAppcastItem.h @@ -0,0 +1,47 @@ +// +// SUAppcastItem.h +// Sparkle +// +// Created by Andy Matuschak on 3/12/06. +// Copyright 2006 Andy Matuschak. All rights reserved. +// + +#ifndef SUAPPCASTITEM_H +#define SUAPPCASTITEM_H + +@interface SUAppcastItem : NSObject { + NSString *title; + NSDate *date; + NSString *itemDescription; + + NSURL *releaseNotesURL; + + NSString *DSASignature; + NSString *minimumSystemVersion; + + NSURL *fileURL; + NSString *versionString; + NSString *displayVersionString; + + NSDictionary *propertiesDictionary; +} + +// Initializes with data from a dictionary provided by the RSS class. +- initWithDictionary:(NSDictionary *)dict; + +- (NSString *)title; +- (NSString *)versionString; +- (NSString *)displayVersionString; +- (NSDate *)date; +- (NSString *)itemDescription; +- (NSURL *)releaseNotesURL; +- (NSURL *)fileURL; +- (NSString *)DSASignature; +- (NSString *)minimumSystemVersion; + +// Returns the dictionary provided in initWithDictionary; this might be useful later for extensions. +- (NSDictionary *)propertiesDictionary; + +@end + +#endif diff --git a/Sparkle.framework/Versions/A/Headers/SUUpdater.h b/Sparkle.framework/Versions/A/Headers/SUUpdater.h new file mode 100644 index 0000000..e78c4d3 --- /dev/null +++ b/Sparkle.framework/Versions/A/Headers/SUUpdater.h @@ -0,0 +1,118 @@ +// +// SUUpdater.h +// Sparkle +// +// Created by Andy Matuschak on 1/4/06. +// Copyright 2006 Andy Matuschak. All rights reserved. +// + +#ifndef SUUPDATER_H +#define SUUPDATER_H + +#import + +@class SUUpdateDriver, SUAppcastItem, SUHost, SUAppcast; +@interface SUUpdater : NSObject { + NSTimer *checkTimer; + SUUpdateDriver *driver; + + SUHost *host; + IBOutlet id delegate; +} + ++ (SUUpdater *)sharedUpdater; ++ (SUUpdater *)updaterForBundle:(NSBundle *)bundle; +- (NSBundle *)hostBundle; + +- (void)setDelegate:(id)delegate; +- delegate; + +- (void)setAutomaticallyChecksForUpdates:(BOOL)automaticallyChecks; +- (BOOL)automaticallyChecksForUpdates; + +- (void)setUpdateCheckInterval:(NSTimeInterval)interval; +- (NSTimeInterval)updateCheckInterval; + +- (void)setFeedURL:(NSURL *)feedURL; +- (NSURL *)feedURL; + +- (void)setSendsSystemProfile:(BOOL)sendsSystemProfile; +- (BOOL)sendsSystemProfile; + +- (void)setAutomaticallyDownloadsUpdates:(BOOL)automaticallyDownloadsUpdates; +- (BOOL)automaticallyDownloadsUpdates; + +// This IBAction is meant for a main menu item. Hook up any menu item to this action, +// and Sparkle will check for updates and report back its findings verbosely. +- (IBAction)checkForUpdates:sender; + +// This kicks off an update meant to be programmatically initiated. That is, it will display no UI unless it actually finds an update, +// in which case it proceeds as usual. If the fully automated updating is turned on, however, this will invoke that behavior, and if an +// update is found, it will be downloaded and prepped for installation. +- (void)checkForUpdatesInBackground; + +// Date of last update check. Returns null if no check has been performed. +- (NSDate*)lastUpdateCheckDate; + +// This begins a "probing" check for updates which will not actually offer to update to that version. The delegate methods, though, +// (up to updater:didFindValidUpdate: and updaterDidNotFindUpdate:), are called, so you can use that information in your UI. +- (void)checkForUpdateInformation; + +// Call this to appropriately schedule or cancel the update checking timer according to the preferences for time interval and automatic checks. This call does not change the date of the next check, but only the internal NSTimer. +- (void)resetUpdateCycle; + +- (BOOL)updateInProgress; +@end + +@interface NSObject (SUUpdaterDelegateInformalProtocol) +// This method allows you to add extra parameters to the appcast URL, potentially based on whether or not Sparkle will also be sending along the system profile. This method should return an array of dictionaries with keys: "key", "value", "displayKey", "displayValue", the latter two being specifically for display to the user. +- (NSArray *)feedParametersForUpdater:(SUUpdater *)updater sendingSystemProfile:(BOOL)sendingProfile; + +// Use this to override the default behavior for Sparkle prompting the user about automatic update checks. +- (BOOL)updaterShouldPromptForPermissionToCheckForUpdates:(SUUpdater *)bundle; + +// Implement this if you want to do some special handling with the appcast once it finishes loading. +- (void)updater:(SUUpdater *)updater didFinishLoadingAppcast:(SUAppcast *)appcast; + +// If you're using special logic or extensions in your appcast, implement this to use your own logic for finding +// a valid update, if any, in the given appcast. +- (SUAppcastItem *)bestValidUpdateInAppcast:(SUAppcast *)appcast forUpdater:(SUUpdater *)bundle; + +// Sent when a valid update is found by the update driver. +- (void)updater:(SUUpdater *)updater didFindValidUpdate:(SUAppcastItem *)update; + +// Sent when a valid update is not found. +- (void)updaterDidNotFindUpdate:(SUUpdater *)update; + +// Sent immediately before installing the specified update. +- (void)updater:(SUUpdater *)updater willInstallUpdate:(SUAppcastItem *)update; + +// Return YES to delay the relaunch until you do some processing; invoke the given NSInvocation to continue. +- (BOOL)updater:(SUUpdater *)updater shouldPostponeRelaunchForUpdate:(SUAppcastItem *)update untilInvoking:(NSInvocation *)invocation; + +// Called immediately before relaunching. +- (void)updaterWillRelaunchApplication:(SUUpdater *)updater; + +// This method allows you to provide a custom version comparator. +// If you don't implement this method or return nil, the standard version comparator will be used. +- (id )versionComparatorForUpdater:(SUUpdater *)updater; + +// Returns the path which is used to relaunch the client after the update is installed. By default, the path of the host bundle. +- (NSString *)pathToRelaunchForUpdater:(SUUpdater *)updater; + +@end + +// Define some minimum intervals to avoid DOS-like checking attacks. These are in seconds. +#ifdef DEBUG +#define SU_MIN_CHECK_INTERVAL 60 +#else +#define SU_MIN_CHECK_INTERVAL 60*60 +#endif + +#ifdef DEBUG +#define SU_DEFAULT_CHECK_INTERVAL 60 +#else +#define SU_DEFAULT_CHECK_INTERVAL 60*60*24 +#endif + +#endif diff --git a/Sparkle.framework/Versions/A/Headers/SUVersionComparisonProtocol.h b/Sparkle.framework/Versions/A/Headers/SUVersionComparisonProtocol.h new file mode 100644 index 0000000..3d11ae8 --- /dev/null +++ b/Sparkle.framework/Versions/A/Headers/SUVersionComparisonProtocol.h @@ -0,0 +1,27 @@ +// +// SUVersionComparisonProtocol.h +// Sparkle +// +// Created by Andy Matuschak on 12/21/07. +// Copyright 2007 Andy Matuschak. All rights reserved. +// + +#ifndef SUVERSIONCOMPARISONPROTOCOL_H +#define SUVERSIONCOMPARISONPROTOCOL_H + +/*! + @protocol + @abstract Implement this protocol to provide version comparison facilities for Sparkle. +*/ +@protocol SUVersionComparison + +/*! + @method + @abstract An abstract method to compare two version strings. + @discussion Should return NSOrderedAscending if b > a, NSOrderedDescending if b < a, and NSOrderedSame if they are equivalent. +*/ +- (NSComparisonResult)compareVersion:(NSString *)versionA toVersion:(NSString *)versionB; + +@end + +#endif diff --git a/Sparkle.framework/Versions/A/Headers/Sparkle.h b/Sparkle.framework/Versions/A/Headers/Sparkle.h new file mode 100644 index 0000000..08dd577 --- /dev/null +++ b/Sparkle.framework/Versions/A/Headers/Sparkle.h @@ -0,0 +1,21 @@ +// +// Sparkle.h +// Sparkle +// +// Created by Andy Matuschak on 3/16/06. (Modified by CDHW on 23/12/07) +// Copyright 2006 Andy Matuschak. All rights reserved. +// + +#ifndef SPARKLE_H +#define SPARKLE_H + +// This list should include the shared headers. It doesn't matter if some of them aren't shared (unless +// there are name-space collisions) so we can list all of them to start with: + +#import + +#import +#import +#import + +#endif diff --git a/Sparkle.framework/Versions/A/Resources/Info.plist b/Sparkle.framework/Versions/A/Resources/Info.plist new file mode 100644 index 0000000..c7f277d --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + Sparkle + CFBundleIdentifier + org.andymatuschak.Sparkle + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + Sparkle + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.5 Beta 6 + CFBundleSignature + ???? + CFBundleVersion + 313 + + diff --git a/Sparkle.framework/Versions/A/Resources/License.txt b/Sparkle.framework/Versions/A/Resources/License.txt new file mode 100644 index 0000000..20466c4 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/License.txt @@ -0,0 +1,7 @@ +Copyright (c) 2006 Andy Matuschak + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/Sparkle.framework/Versions/A/Resources/SUModelTranslation.plist b/Sparkle.framework/Versions/A/Resources/SUModelTranslation.plist new file mode 100644 index 0000000..92ef947 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/SUModelTranslation.plist @@ -0,0 +1,174 @@ + + + + + ADP2,1 + Developer Transition Kit + MacBook1,1 + MacBook (Core Duo) + MacBook2,1 + MacBook (Core 2 Duo) + MacBook4,1 + MacBook (Core 2 Duo Feb 2008) + MacBookAir1,1 + MacBook Air (January 2008) + MacBookPro1,1 + MacBook Pro Core Duo (15-inch) + MacBookPro1,2 + MacBook Pro Core Duo (17-inch) + MacBookPro2,1 + MacBook Pro Core 2 Duo (17-inch) + MacBookPro2,2 + MacBook Pro Core 2 Duo (15-inch) + MacBookPro3,1 + MacBook Pro Core 2 Duo (15-inch LED, Core 2 Duo) + MacBookPro3,2 + MacBook Pro Core 2 Duo (17-inch HD, Core 2 Duo) + MacBookPro4,1 + MacBook Pro (Core 2 Duo Feb 2008) + MacPro1,1 + Mac Pro (four-core) + MacPro2,1 + Mac Pro (eight-core) + MacPro3,1 + Mac Pro (January 2008 4- or 8- core "Harpertown") + Macmini1,1 + Mac Mini (Core Solo/Duo) + PowerBook1,1 + PowerBook G3 + PowerBook2,1 + iBook G3 + PowerBook2,2 + iBook G3 (FireWire) + PowerBook2,3 + iBook G3 + PowerBook2,4 + iBook G3 + PowerBook3,1 + PowerBook G3 (FireWire) + PowerBook3,2 + PowerBook G4 + PowerBook3,3 + PowerBook G4 (Gigabit Ethernet) + PowerBook3,4 + PowerBook G4 (DVI) + PowerBook3,5 + PowerBook G4 (1GHz / 867MHz) + PowerBook4,1 + iBook G3 (Dual USB, Late 2001) + PowerBook4,2 + iBook G3 (16MB VRAM) + PowerBook4,3 + iBook G3 Opaque 16MB VRAM, 32MB VRAM, Early 2003) + PowerBook5,1 + PowerBook G4 (17 inch) + PowerBook5,2 + PowerBook G4 (15 inch FW 800) + PowerBook5,3 + PowerBook G4 (17-inch 1.33GHz) + PowerBook5,4 + PowerBook G4 (15 inch 1.5/1.33GHz) + PowerBook5,5 + PowerBook G4 (17-inch 1.5GHz) + PowerBook5,6 + PowerBook G4 (15 inch 1.67GHz/1.5GHz) + PowerBook5,7 + PowerBook G4 (17-inch 1.67GHz) + PowerBook5,8 + PowerBook G4 (Double layer SD, 15 inch) + PowerBook5,9 + PowerBook G4 (Double layer SD, 17 inch) + PowerBook6,1 + PowerBook G4 (12 inch) + PowerBook6,2 + PowerBook G4 (12 inch, DVI) + PowerBook6,3 + iBook G4 + PowerBook6,4 + PowerBook G4 (12 inch 1.33GHz) + PowerBook6,5 + iBook G4 (Early-Late 2004) + PowerBook6,7 + iBook G4 (Mid 2005) + PowerBook6,8 + PowerBook G4 (12 inch 1.5GHz) + PowerMac1,1 + Power Macintosh G3 (Blue & White) + PowerMac1,2 + Power Macintosh G4 (PCI Graphics) + PowerMac10,1 + Mac Mini G4 + PowerMac10,2 + Mac Mini (Late 2005) + PowerMac11,2 + Power Macintosh G5 (Late 2005) + PowerMac12,1 + iMac G5 (iSight) + PowerMac2,1 + iMac G3 (Slot-loading CD-ROM) + PowerMac2,2 + iMac G3 (Summer 2000) + PowerMac3,1 + Power Macintosh G4 (AGP Graphics) + PowerMac3,2 + Power Macintosh G4 (AGP Graphics) + PowerMac3,3 + Power Macintosh G4 (Gigabit Ethernet) + PowerMac3,4 + Power Macintosh G4 (Digital Audio) + PowerMac3,5 + Power Macintosh G4 (Quick Silver) + PowerMac3,6 + Power Macintosh G4 (Mirrored Drive Door) + PowerMac4,1 + iMac G3 (Early/Summer 2001) + PowerMac4,2 + iMac G4 (Flat Panel) + PowerMac4,4 + eMac + PowerMac4,5 + iMac G4 (17-inch Flat Panel) + PowerMac5,1 + Power Macintosh G4 Cube + PowerMac6,1 + iMac G4 (USB 2.0) + PowerMac6,3 + iMac G4 (20-inch Flat Panel) + PowerMac6,4 + eMac (USB 2.0, 2005) + PowerMac7,2 + Power Macintosh G5 + PowerMac7,3 + Power Macintosh G5 + PowerMac8,1 + iMac G5 + PowerMac8,2 + iMac G5 (Ambient Light Sensor) + PowerMac9,1 + Power Macintosh G5 (Late 2005) + RackMac1,1 + Xserve G4 + RackMac1,2 + Xserve G4 (slot-loading, cluster node) + RackMac3,1 + Xserve G5 + Xserve1,1 + Xserve (Intel Xeon) + Xserve2,1 + Xserve (January 2008 quad-core) + iMac1,1 + iMac G3 (Rev A-D) + iMac4,1 + iMac (Core Duo) + iMac4,2 + iMac for Education (17-inch, Core Duo) + iMac5,1 + iMac (Core 2 Duo, 17 or 20 inch, SuperDrive) + iMac5,2 + iMac (Core 2 Duo, 17 inch, Combo Drive) + iMac6,1 + iMac (Core 2 Duo, 24 inch, SuperDrive) + iMac8,1 + iMac (April 2008) + + diff --git a/Sparkle.framework/Versions/A/Resources/SUStatus.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/SUStatus.nib/classes.nib new file mode 100644 index 0000000..22f13f8 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/SUStatus.nib/classes.nib @@ -0,0 +1,56 @@ + + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + CLASS + NSApplication + LANGUAGE + ObjC + SUPERCLASS + NSResponder + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + CLASS + SUStatusController + LANGUAGE + ObjC + OUTLETS + + actionButton + NSButton + progressBar + NSProgressIndicator + + SUPERCLASS + SUWindowController + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/SUStatus.nib/info.nib b/Sparkle.framework/Versions/A/Resources/SUStatus.nib/info.nib new file mode 100644 index 0000000..a9ac867 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/SUStatus.nib/info.nib @@ -0,0 +1,20 @@ + + + + + IBFramework Version + 670 + IBLastKnownRelativeProjectPath + Sparkle.xcodeproj + IBOldestOS + 5 + IBOpenObjects + + 6 + + IBSystem Version + 10A96 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/SUStatus.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/SUStatus.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..4f1d598179ccecb32c7a12eead96bb5fe3663eb0 GIT binary patch literal 7344 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 I{hK-Azn((800000 literal 0 HcmV?d00001 diff --git a/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/classes.nib new file mode 100644 index 0000000..4b1ab30 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/classes.nib @@ -0,0 +1,50 @@ + + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + ACTIONS + + doNotInstall + id + installLater + id + installNow + id + + CLASS + SUAutomaticUpdateAlert + LANGUAGE + ObjC + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/info.nib b/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/info.nib new file mode 100644 index 0000000..2e04cfa --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/info.nib @@ -0,0 +1,20 @@ + + + + + IBFramework Version + 667 + IBLastKnownRelativeProjectPath + ../Sparkle.xcodeproj + IBOldestOS + 5 + IBOpenObjects + + 6 + + IBSystem Version + 9D34 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..6b926302ea4751c08c4de4d180bdee22f01709ff GIT binary patch literal 7278 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 f{!{!>{8{{^8|{{$9#l~I + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + CLASS + NSApplication + LANGUAGE + ObjC + SUPERCLASS + NSResponder + + + ACTIONS + + installUpdate + id + remindMeLater + id + skipThisVersion + id + + CLASS + SUUpdateAlert + LANGUAGE + ObjC + OUTLETS + + delegate + id + description + NSTextField + releaseNotesView + WebView + + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib/info.nib b/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib/info.nib new file mode 100644 index 0000000..2e04cfa --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib/info.nib @@ -0,0 +1,20 @@ + + + + + IBFramework Version + 667 + IBLastKnownRelativeProjectPath + ../Sparkle.xcodeproj + IBOldestOS + 5 + IBOpenObjects + + 6 + + IBSystem Version + 9D34 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..b4353d2f7c1f412919b46c5526549892ff7ab525 GIT binary patch literal 10493 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 + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + ACTIONS + + finishPrompt + id + toggleMoreInfo + id + + CLASS + SUUpdatePermissionPrompt + LANGUAGE + ObjC + OUTLETS + + delegate + id + descriptionTextField + NSTextField + moreInfoButton + NSButton + moreInfoView + NSView + + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib/info.nib b/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib/info.nib new file mode 100644 index 0000000..2e04cfa --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib/info.nib @@ -0,0 +1,20 @@ + + + + + IBFramework Version + 667 + IBLastKnownRelativeProjectPath + ../Sparkle.xcodeproj + IBOldestOS + 5 + IBOpenObjects + + 6 + + IBSystem Version + 9D34 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..b403a3e45f6ac2ba253f8f9747b79ecd2acb28e1 GIT binary patch literal 13189 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 literal 0 HcmV?d00001 diff --git a/Sparkle.framework/Versions/A/Resources/de.lproj/Sparkle.strings b/Sparkle.framework/Versions/A/Resources/de.lproj/Sparkle.strings new file mode 100644 index 0000000000000000000000000000000000000000..b31f928fd57dad14168601c6c9bc3bacb27c9cdc GIT binary patch literal 9806 zcmeI2TTdHD6vyW|pJG!rrHu-`y|t|yBYdH!b^ZMm&h>qu z?=yY6p&v$izX$`hT!vnp*-=Y7yw*4UM{4cssjD#?YJ03b9)u6VBdz&i*i_4-@a6RB zIJCkr&SrdHPaUm0(bK8^x2{%isfAs7ar8iA>0`%{#uZ_#_HKBnr(g6w)@(+aU)wiRKO>?SnmrCQV@tbVM7xBtkyb$7$n#K7STB(>h&><9W7p1G;vK68=3FX$z#R+kdVb^?6S)5x@^Vs0a?dAbTeA# zJXxcfnJiKu`FV1J%hT-bFuavtwnYcg;NvUHw_cC;G{?y-EC7y)aqO1i6-+*%n^rLUY?H+Gtz35@a*RCv*wVJa)osA_Kcw9^ID))+2#FLvz zXBLGb56eHq$lH>Yqr<(@ZV5$H5#lPW%+Le5ihNt>`#>MhUWViugA73`4`u_0wIixC^ae$Syy&SzHlT(h z?dQmm8SKk0j+ct?gVsNew81--#9@rpbr>ke9gcqte+-2X|J1rff7V_t8rc%(Mn$tu z!O&m~v{8-Wu3JN^W&FJyT|T|aQ1fZgqTIXmMqWX~e3Or%^?lM~H~bO#Z^?i0J@Zi4 zBKXBnJlSM9dfe3>BiTMXQnh1ucqKUg`mAqbw=$ZT?{J&+>TPG@G++ zg~j~wexjJgCH=KzSgsQiDp|d}6LoieW_MGZL1qT!fy^uunVtLTCueAF^^)g3Yc*9s zlZak85wS;o%$Gl1<5BNzmr$vT8!9eHgc@uLn*qI(f(S6}mWN$Oc*VU6c%Pn^D=JktF zVl|)P>iKIv*Cg}&Jk+8g_Ylxe=J%V2?GpCC`$+P=w2O6Osi_K~_GnA0-6%UOVYQSM z;iXWQS2j7F&6N<<&3)hkTnJipbI6q3_B1sKu{G)x}Eq-L0)V7UvetRjP^`@YNh|xb5VIr7rIL zs7f(eo4wt2J}qNx{MGIoe~!^8<;_HAc?S7|7)4Yk+F~zx2CLrlm1EfQPKK*gS(abi z9`GN_N}SbYT+UcUv+jvE+*8--{z*yq_Ll3uc~vk)lSMr%t!i)is>_r2^YA3IU3|$Ho(pi=v zL)i^46;y7!L;a?p2*1X48I70XtEY<6Ev*2WdG{Jc+`F%p)6Ug<;)G5ajbD!|Ig$Hk zFmN+xc5@4=oI7WV1JAYn$g7`qp6J&L+&^1{Ih*R1`XAk*acWaeQ$fMBIbG}eB&+iM$C&&qD*JpI3a2NCvGx;4vxo)ke z$q;>B%Wx-lI}ybF2CFANcr;1(ydG_>@@u*!Pd8v?lxQ^+tDy-zlm8xx@XhLNYtt=x xSsu5iGn2?#q|qV`^(w!Va(tg#oBJYnftKO%CvGy`550a&72dwqGc0k%#lIFPR=NNH literal 0 HcmV?d00001 diff --git a/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/classes.nib new file mode 100644 index 0000000..4b1ab30 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/classes.nib @@ -0,0 +1,50 @@ + + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + ACTIONS + + doNotInstall + id + installLater + id + installNow + id + + CLASS + SUAutomaticUpdateAlert + LANGUAGE + ObjC + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/info.nib b/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/info.nib new file mode 100644 index 0000000..ab36d31 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/info.nib @@ -0,0 +1,20 @@ + + + + + IBFramework Version + 658 + IBLastKnownRelativeProjectPath + ../Sparkle.xcodeproj + IBOldestOS + 5 + IBOpenObjects + + 6 + + IBSystem Version + 9C7010 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..7630390c89e63ae4aa0af3491cb03518c1321d8a GIT binary patch literal 7148 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 literal 0 HcmV?d00001 diff --git a/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/classes.nib new file mode 100644 index 0000000..994d4c3 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/classes.nib @@ -0,0 +1,67 @@ + + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + CLASS + NSApplication + LANGUAGE + ObjC + SUPERCLASS + NSResponder + + + ACTIONS + + installUpdate + id + remindMeLater + id + skipThisVersion + id + + CLASS + SUUpdateAlert + LANGUAGE + ObjC + OUTLETS + + delegate + id + description + NSTextField + releaseNotesView + WebView + + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/info.nib b/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/info.nib new file mode 100644 index 0000000..2fb8a83 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/info.nib @@ -0,0 +1,20 @@ + + + + + IBFramework Version + 670 + IBLastKnownRelativeProjectPath + ../Sparkle.xcodeproj + IBOldestOS + 5 + IBOpenObjects + + 18 + + IBSystem Version + 10A96 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..e7e7497db4bbc8e89d15986ad7531f1b0a07c217 GIT binary patch literal 10623 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 literal 0 HcmV?d00001 diff --git a/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib/classes.nib new file mode 100644 index 0000000..5220a22 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib/classes.nib @@ -0,0 +1,59 @@ + + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + ACTIONS + + finishPrompt + id + toggleMoreInfo + id + + CLASS + SUUpdatePermissionPrompt + LANGUAGE + ObjC + OUTLETS + + delegate + id + descriptionTextField + NSTextField + moreInfoButton + NSButton + moreInfoView + NSView + + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib/info.nib b/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib/info.nib new file mode 100644 index 0000000..b1cd28e --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib/info.nib @@ -0,0 +1,21 @@ + + + + + IBFramework Version + 670 + IBLastKnownRelativeProjectPath + ../Sparkle.xcodeproj + IBOldestOS + 5 + IBOpenObjects + + 6 + 41 + + IBSystem Version + 10A96 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..e8dc5b88028a8bf491e46d29e25091c39735c921 GIT binary patch literal 13263 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 C5g()g literal 0 HcmV?d00001 diff --git a/Sparkle.framework/Versions/A/Resources/en.lproj/Sparkle.strings b/Sparkle.framework/Versions/A/Resources/en.lproj/Sparkle.strings new file mode 100644 index 0000000000000000000000000000000000000000..16e0787b46dd69d9a9d59133dfdfc683787f5293 GIT binary patch literal 8216 zcmeHM+fEcg5UppP{eXdpBt$goqcMO=j3J=$6653S1(>kRlD)9<^XfTWTXfH5*;%s< z8)691)0dj+s#Dcxs(=5H=dvw{97`X6+xUBdpRVLG!tO?f$Ook=P~x0>^Fv^tPGL92)V>5cRhJ$y^%W)Coz zV|?QX^AZ`Ozbor#{lN1Wt2z7HwG%vLa*lDEP5p*gnPQ}e-puXE-a+X-jEym?EoT__ zn&*%>kzMR2kvI5#XuEn1Ppw7td>eMnWy{&SR5P9uy` zTjHaGu?#Z14$nszXFJ4&qEPWhIs1@siM1+&vZx!8eu5U!$>?~B=PKG1jed_KXA#ch zd_(C7E4fqZpF(~P-Re;J-{NsC9xGxrPx7zkyf)B0aA;u$R+K9;68OH0xaqo_M(h(? z!zt#7kSm7}=Cl@862)~$@mV>}8}G_enxpIXy(2p}X97O*G*22^66w}N3(N5 z?K)Gx3-rMweD+or%Q@7M zr+9|{WYT2LWU`(QF}viBF$^42F&@EO@Y!W@vS;PBWi~+8qpXT7+{fTPB(9=<_vZ~V z&dgb}nw!ikcG8C4iS32E)N3`Y-<4l3B2vT)v91wewoef&{2ud6JZ21p){m{%YFMB4 z_Fu(i>)#jh<7%}UmcK-%R>odLd}woiIkHC5SvZ@ANM8I+t6?FYm0?ZB&}o$!ei^rL zcCt2Q`C=B^nz(Gw?|Q93RJoQiHRd8pW0instW}c+cn{A|d-tNJYv_+v-&g2;vnzLR zH40@oto^Zm!}^9*``!kegY8h#F*wn3YKrd=IjqtV9iHP9d*i=3k?#R(tJkAECze*M zp0!c!v7V2<$V~ba=S@Ui@gAw@Bag!QGvjFZ72iAlKFb&f zB^-^WaU#1np~=jpxfq+`Dt=p|@zP z;gs(zJV)Ye-s+4Cr_RINT^uBY3?q>PoV8kC3TtGy&55m*Wx!&U)oWB7kE4xYnusJ9 rvDo&te#?Eg- + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + ACTIONS + + doNotInstall + id + installLater + id + installNow + id + + CLASS + SUAutomaticUpdateAlert + LANGUAGE + ObjC + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/info.nib b/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/info.nib new file mode 100644 index 0000000..2e04cfa --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/info.nib @@ -0,0 +1,20 @@ + + + + + IBFramework Version + 667 + IBLastKnownRelativeProjectPath + ../Sparkle.xcodeproj + IBOldestOS + 5 + IBOpenObjects + + 6 + + IBSystem Version + 9D34 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..6b2f938f90ecd44f661ea8b2d6ec06e2fd5cc720 GIT binary patch literal 7273 zcmcgwd3Y36wmK4iF%El|@mI z-Ce|lO%OrF1w;juCj;)n2e^!=pKk`mZP0OK-pD&u)g6K|esBJH-CuWA-MVMF=lsrc zZ*5b+ABkpUoCX3ERGNHBIm94f`7WI5e$qsCJ&{i$)wk zR&IR{bfBMIR+Od;)_J2|MyffR+cREl5$g(LMEkg{U;;B_LJkapVK5vDVKh|0G-!ZZ z@J$$2!y4EO_rZhk5Nv^MupOR&r{FmJ7yJp{f_LFV_zQdwKfvGMGW-ZX!QbI$LWz#( ziGi4jjW|d*(w+1p$z&iIOmfH&Qb2~2B2r9BNf{|8m1GK;MZCmM=8-UokY>_KZY6h- zRb&mhm#ilbl7~neX(!vrE-;ZN$R6?}*-M@xPm^cJbL0?ti5wwE$tm(Cd5gSF-XrJ8 zdGaCojC@YMAYYMh$=}Fj@*|~GL$y>-1=^1era5#7&82yCD9xt@bQm2@N6?XU6fLHu zbT*CBX1ahbq>E?^T}+qIrL>jaN;2tfl+oMi9dsF8PFK*C^iFy=T|?JR=^Jbg1U}^) zU;!)GfCD=?fCncefB=cm1-e2v=ng%gC-j0Oa6xal3Hm@^=m$4Le;5GCFc4B86$U{X zq(erP+cP;7idOaY1-y~SY`15k;#YKBMD}2@G%iM}yn$vBN4mN_g+8AciTG>%0e`e* zqQ5To4rz-+!61SH;S!nY_PD)`VnpJD_oZQcSQrY=mu4v(r8hHB9x{+_@r6wA?*zqo zhr-g#(oiru!5j3}i{WaHb9<`%s82wg>JQe17Aktj))8lycmus9vC~nkxG0KR%u;kw z2pDCLv0K;*wuR~00;XZh*-EyMJ;H!#Su=Z->&NbVA3cx-*)SN_C$CA;pQ)LuniD)z z3Y(*$MsL*bo6>~wAQlG1aP)o1g*+Gv`O_40i;)@1O%N&DARh|mAgksGQYz|Ci~9pt zSyogW@`bz|mXySgfRQi?jTj5O2-9s zD(DF{hkfEyx2N1&D+X91n$F0Cb1)q#XTVID1+!reR6`ATp%#2l2O`Xc8W~)Y=_iYk zrckg>3?mD9aR|v`F%Ur33rYjtddWqjgVF-(a7b}6THMpzB!(CG#f8ko5}27;?F0$3gDABLZRKgMmB>0!>G3ZXk*mo zn(A7TnVp^L%Fb$S{RASoq$o7Q0$2!(pamAg5?BhYa4Xyf3~q-zU>PjO>q`8uf>m%g z+#_KF7b7pEn&T0Lfv6ZpioVk91Ab-1`r2D&CzHmC=+JM zAn%|oYeeA3)9dJ4n*B(CoN#S%o@g?(Pg5uymEsKrg+qZVT(nFSmsKJLye$Zi4*jxl zawn+{HTe~olkr?vjxdh#%!dC)?u0`R0Q^<_th{5?)oRXO7K}u_0dLsl4Y(rSfIlpu z=3ZC}>tH=>fQ_&TeJa@*FH(@8ALq&oV~#$f1|l>3FuPstoK@cJ^VfODguMs|1kHj8z|@R<2A>_Y?Xho|8gcoq)8bMQR8058Hp43d}NFe2y`comMoQ80`GdDBUl`}Y73ZR_4T#Tihyw+AJ@w@>iU=FfOi$udHko8cEdlF8y!zp-EGA{NF z@suUcL6>>tn>hVDtVgA!NIa3f&pbQf12_$5Fzn94IXKUfSUMZQjI4-_VeSuO$><}5 z%g3D((x2f|Oh%u<=kSG+lrV%w*ZJjaiEAwhd+RG(n#2gMHI4N*umQ|vCuTXzD56Kg zMW)*UU%}UK3BG}E;XBrw-NgE^zN{a+8LMSsQ&T{6Rg{#vn!J&ySR3+&>s(RfdF`Eh z%v=pQXvbHbg$-m z$-FAdN=sb}2B&5Gp0Ha?$+F_g-@kN9xiHn0J5=)Ikin_0A%k06&&iqaAD97ufh(B* z{t5pB|AJrPD*k>YKnSLC89sO|4EXDV(z6ef6xz2i=*O}sN{u6Cmq8q`WCz9g*METE z$RaADCK{r}NWxf@D~nuJQ`tb4f?Q&$4?!v^?f1z=sLU4%$|xd6VrnBM2}9TvD1|i6 zMwwtC)^=i*vIhEBX4a7>2uJMOi9Mbt;_oG#-JqBeCrKbe95)D%;Vgq?%Fw9h5-|WW zauD=cLnN~e9wOc6#_UFV#41NC=?S-yUL*-_C%xe`=|lR;;U|S+eK^z{tSb%$LSa;- z63e7~&xWzVn1{1ix`P{qVK?-;L`(XU0nEX&?fNdrsBg+l)2R4!#sTkgjk$@j8hUOkOPzt=H zj)?IVO747$SxIN5uC*;0L;s_;g#<|m+m^FR+ai^HEcT^rH2xRObcb9@LG*^>Iru^L zZxmcaTCP)YEGz4*Acg{_5R8iKJVn?4Q(twA+>TMQj7-PmzKX0QcghNmM;M zyH;?F9X9D|h|9ySSHuM6!+tXi_42<9M_k~?9x#FpoEJMn>75JzoAEh>{o!YL^~*Gk zI5&t-5`{D`BG2>TNV81o$F|RlGyO;xlq8`=$lc@~vO1nJ!_RD3D)E z*0qs!QgXsJQ0YPB45T#BH}>`>viUk=PGl9=jF~Ox6}d^x%EK1cb~Xd3c+dk%b)s(qv-ikeNHUwVLa;Bs*;|4rhre+0yc^ zJzyt+J1Me{>~ACcW9dHD28oSLQo*cRDDMT8dC!sq?c{*cxjE$?ZDKQaOPEt*joY)0f6jJzi8n#k+q zI3$rb$O%mFC*c@2KDg_w@J1W(t_W3>d#)a`PO--hrK*&Z7barMSjT+W(9~i=#9qHy z%y&hlc2CM*Q{;i^9nZ>&-y!d|lXpA!s=wuaBQ;N>nrFyaI3~+%K$#;LwuC}VW}O(3 z8xZL@2qj~h{msaYcz%LBKOh%kJm(|NBsT9FPw(|*9C`j`+@2{BF$J7^1_CY0_8w#Ak6z2&BKe8@okjOx(A8k0x(6H9 zDg?!sa1L|VS?0!UJ_5G~N!YZevqoG|m=#HMc*H=}OwFWok4{aGydJ6}JKLlXj0vDd zNk9!UuR$Ew$Y1G-KV;t(e-wYxSGwXaPS=G+pOh6#imQf-o$jO>?NF`})$34h1o?^f zM_M|7Cewj5g{IO$G>xXy44O%^Xf|8KTG(Q?ge_&Q>{fOgW9)Wz2U}Ln4XkL6G`N&B z=o;`x2`71$TY= zT+JojSaf{ziZg5qd|YvC%{>3%GW?&F+T{l_C#&PdQi|4%?fOvD2s2~Vf-a7Y5G zbXZi5yQ*qL&j=Z;jd)PxW&u1nk`R`Thei@Qq(dZcTvD~noz_qL3`rK>Vk z*{U4X2-P@Mxyr4oS2d|xRLfPXR1c^gR~=BjtU94OsXC=Pt@=pySJk(wpH;u8jcT*n zs^-)VwNovqyQsUVQ`AG%Me1?taJUb9v6tme4pUCoD@ziO^%b=m}N zH*F7XFRe>^leVw+X6*p&Ky9ivO`EM9rmfI=wGG;kc9C|mcA0jC_Ac#a?G|mjcDHtq z_JHNGmLE=e~)m#!P5tJ2l${JQzNMqNm^Rkv4nNOwZ_zV3qV z8{N-(gTAM}zdl=^qtDe3)febT>5KFw`cnN^{WyKOzFyy?U#wrMU!h;E-=g2C->-j0 z|APLA{+Rwf{RjFp`m_4;`j7OV=sz{+4ZI=A(A&_*(9dwQVSr(vVUQuskYUI&6c~mZ z#u>^DZbOA(vZ2yYWe6MYH5@a1X!xhGi!t3;VVq{HF*X<@#zn@(#-+wvjmwP7jq8nD zjcvwl#vR6|jK_?pjPDx1FkUiVHeNO9O}r_|G|E(DDlwIs#+u4Z<4qGx^`^T_kC=9u zcAK6wJ!RT&ddBpE>7ePP=}ptyruR%=ny#3s*=Fu;PBy2Q2bt5&ndWSBzIlwf(mcyN z$6R9$n48Uu&1=o;%^S^|&G(ykn_n;=G#@q}H@|JZV7_Sn(E^sf;>mlo5>nqkH*5lTb zw&Au?+hkj%t;$wyYp^ximf5!1cGz~=cH5q`?X~T*J#9N_yUGzxg)ynaI5lw=E|p8; za=8)Q1a1mf!}+-;ZWXtQdzw4My~@4Mo##I1F51CvxAXP{d!oIoy`O!EJTsy%>Uw~PPMbAGs)T8*~i(>+25J$OmPl!raLp8+0Gp22-0HAXT8(!obPOOhMc!Jw>bAWUv$3iJmtKUU`=o(q$M0oIG*rX!dD5G623|Jd%`~w zei5jk7Se@GAzR21a)qHnfiPScDHICD!f0WPP$rBQCI}OSNrFe1B1{!(gj!*ZuvSw;3P*+4gyX^+ z!k>gw!dt>S!h6C8!pFj&g$u&x!q>t#!neZD!Y{&=L{*|DQJZK>bjrI|pjarR58bF- J + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + CLASS + NSApplication + LANGUAGE + ObjC + SUPERCLASS + NSResponder + + + ACTIONS + + installUpdate + id + remindMeLater + id + skipThisVersion + id + + CLASS + SUUpdateAlert + LANGUAGE + ObjC + OUTLETS + + delegate + id + description + NSTextField + releaseNotesView + WebView + + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib/info.nib b/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib/info.nib new file mode 100644 index 0000000..2e04cfa --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib/info.nib @@ -0,0 +1,20 @@ + + + + + IBFramework Version + 667 + IBLastKnownRelativeProjectPath + ../Sparkle.xcodeproj + IBOldestOS + 5 + IBOpenObjects + + 6 + + IBSystem Version + 9D34 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..c9b1e7d8831c67d3f55c8044ba2b1fdad7eb1248 GIT binary patch literal 10668 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 GrT+t(0j`Vy literal 0 HcmV?d00001 diff --git a/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib/classes.nib new file mode 100644 index 0000000..5220a22 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib/classes.nib @@ -0,0 +1,59 @@ + + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + ACTIONS + + finishPrompt + id + toggleMoreInfo + id + + CLASS + SUUpdatePermissionPrompt + LANGUAGE + ObjC + OUTLETS + + delegate + id + descriptionTextField + NSTextField + moreInfoButton + NSButton + moreInfoView + NSView + + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib/info.nib b/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib/info.nib new file mode 100644 index 0000000..3eb7f81 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib/info.nib @@ -0,0 +1,20 @@ + + + + + IBFramework Version + 667 + IBLastKnownRelativeProjectPath + ../../Sparkle.xcodeproj + IBOldestOS + 5 + IBOpenObjects + + 6 + + IBSystem Version + 9D34 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..8c54c217c00797d827b49b9adcc92151d64c3194 GIT binary patch literal 13404 zcmeHt2~<q=OjpPZQok&t@YM=Ydx|! zXYYOX@Xg=1zr7pU0{%!eKmRboh#(H}NP(0{jWpBT3w+^-KNPHSM?-CwyS?GY7C$si zbB7w{`WmAVJ;EzCyonN!YG%doJh`#S8}(9LFCB%?MT4}l!&yb0QE=3 zXbAcnDnp~tR8)@wXg*qjR-!x6dh`r>7VSYVqF2yC^fCGdeT#lV|3?2ozhR8kSc4O> z4jZuzXJHr4!MV5(&cg+`1P{d{@fbV-SK>*y22a7$@eDi*dvPlc;t&qw4*Yk#6jOW+ zz80^>x8U3G?f5RV550`<#`oY2cr(5qKZ2h`iTEje03X6{w<-BRp4=Tge7;KY4&`BM*}8C&f_zC%lGEe|a)z8Izmng`1y0E&a4Ig5GjQpglgr{ zxUt+gZai1XP2{FxzD*TxG%Y{xD(t-?rZKF?py9V?iBYucbfZw`-wZt+p&@_=STBn z_zHe3KaL;IPv9&0Dt;nAiJ#0@^ELbwzLuZLPvbAgFY?pzUVa8&$Is+v@%8*{-pe=e zjeHaDv%iv2QSTL?{>p*$1tN%&4rc^tSpUY#u0= zhoQ1C6rRU=$uqJq(_uZBfED3`G~mw`ip?Dgv!3OlV03~v=xz3e>jj~*y4DZy1bkEd z!KTnc8SWS!@#)N$fSWCQIV|g26a^^iWLV?@lyqV}eTjb6iBqVGzCjiAOL~I7*@=@W zqDuODCl-V*dh!r(p%C>$MS!D(7sG+_l&crgs;5k81C94h^o3jfK(J77VmQ>=7CnRp zpb|6?4Voqs-4~fI7lJUh3k^bpXTfCck!Yw@Mq*l=D}Zao@DZWLkhhzj41l3%7%Bx) z#;i<)CTx(`7>-74LL<;fG#HSZ&>r;yjjDaoDV5dmlt-4M(KK&|kc`Hl3N#jtL*vl| zREet4L^KIaM%AbWO+mF(O()Q)bSCxD+v%P3F1mqkqTA?px|2Rn_Z$WorlHHxbTk9i zfzZtY4vq9hqW++l$pV019cm9Z`leP^kM}nC0(3mpP(sJOi)O<}FKR%IK*S~x%Q>hS zwIDy5i{?qf$5=Dj7ikLxn|xuwu)4irf#0_<0#hz14|toqMXTDs#0M-GwJ7QfGD-uJ z#?r(Ttf8an7+Mj>HAwTiPzbeAEiF9;tA}Cz2#Nv>?Eu9Bv=A*qivfoY^mnurU4gDd z6m>%VDzqFehxx};H-J3d{t}M)v^yHlU5D3vEK1(H68-;^n>QK6F2< z{Q%kq;B80$L_5&G&_n29^a#N5DB6i0L%Y!9=n44x6neT|umcofZ*#Lh*epxR1aD+s zc_>^N3XTsodIJDkjSO$SkOFXe8|O8LL+!yP3Ep}^56T?~facdMZUX@ifDHnEj0lB; zzA(eBUI6v408)bx1_IS>-bPqys=q1PA{jK8rM)#+)*cOoeG&f>21Rsnzy~V)$5CT^ z{^ph_05mGdw5bW$J38!-17iIXL?kRgt83U8c{wH|lS2#T`KV4nw9s$?{ti8l5Y16h zy{l9ui-4BezfQ=-0ovkE5WtaOvTg1T=syJ&$&y7eEh; z)R2NvyxBm_yU3A#(2fgMa7;L8MmFy3i`cac;Cz$BV7Ak|c)W>@KK znJUyJaIVska>Z4;s#Gdb;a&6zfVvTViatZf(dXz3^dE&iyF+Q#MQ^<#g90|x>}n7g@vQ5QyNF!Yh&eH-bZdJYrJq4QXQ zl{f*b82ZctFbJ7-0!{=%&8$Xk)F~*bgW7AW7e}JLRxr;k68E|(&;u@=kF+XE>EH4x6wUrvcm6 z;S6kz*-|jhOcM0G^EXUA)D5fvJ4HaFdi@Sz^e;fzfmMK34$Y?adchEd_5aJT^u#C| zFe(7K{%@*zq)D8#H=9Ig1pWXF-87MCkNe`3&2jwYmdkK{7tRM|`<+Sn6D`6;xIZqA zYY~(3KCaTHk7ar8`@fLriz4}#^otXV_L2b{h08bLay(j!MPiXdSvc%n4Dutre@}_A zK+bUzB?@RhwO`&GH;Fw-IFZ^$=I8Z~iN$2}&KC3zu9mG1Xc$vApq*r>3cxxsGu3U_ zmi~Udsj%KOX}x0FpHbcvqx@fRaHgad#qwWFEpR=ay&2DzVPFa$@V7AmI)Y~72GBDW z8#LfXv;a4O-wfeq+=5=femob-0np(ZZ@AePg@P=tfCU75jo{J2WoqeQI#4p{6gH1^ z5Y@Vdosc!XUP$fe=v&Bauw;xGx`q9hF0HF?3dLiEK{6xS@cb=!ew<7IV*LA`gSY@M z1RxoROJZRBEd^s4fKw0s;s6-H?EwG<`T2bu>?x7Ds6Rkauym=!fTBK*{xSnfptZOt z<|*(M_{z=rN||1uq%ts!Vsb1O0TpjR_k!=Q!^`khcsWFKyHFj~&~jQvhpVYZLY?6| zV1P7#F_Z`7FJ1cHMY9~!@9RLnZ@?=-!`tvGY}NA^46KKaq$5D9OZ7r2)9R3L93oaP zazM}+gzzy0Azdrf8=-y%S{x8o`rz3H&oF%V!-hKE7J(XLuumG{fKfqdj34SD=oOJh zw!@pv-v-aHRPsWI*beiudJuX>;H%st0Pi4-VqYBaW@|;IQ4P=r9D%wF4|}qC!|)41 zzku{@4$K>cf7X@sle?s|d~sv5GwHM%=Xtci~OURT;rq`x~m-qX8dy zd1-GO3PW51josBAn;*Ot+3|g_yQzfTP3?PfEGBCNegJI9HvAyoj{k{wpk4SOyba8T zykVtPbPAnFC#PVonogosJ@!S?xQFmg{1~V-8}$TqxP{K6H^Y0iq^c#L#Qh}|E*tsoR5rXl8Vv=d=%r9{-LRh-HNV{tU%~Q8E%8w! zeF5)caB@9{&>EU1qzhL=oRmhZX{GS8UIn`>$xuGNzw|A(9thVS@bm9sKSV{BB%0fYNe@S#f^L)ta8g zjrOXmta6O68c{aBVtUzR;B1pG(irx)u^n`GY}5@fJ`LcW!9UU_0CyH`ycEC>;vv|d_(hGH!Ax9%*Lc*a2Z+KG1%sKv`Khh#6M`X80bR>Bb zNtU%RHLh?hJh+tJ5k0aKBk*nx5aYIE#DsLjOwvd?v5*X6B{q^t?8Je$ku2guCrCEQ zA-za%;vs~HBp1X-)bjBuK9OrN$2?0KEIu8cFQC+ohCG_joo0I>FwA zMf#E=$irDw0^1lV_LWSra>kk%;0U%8Y;pJ-5F1a5slP_HhAgpEP6pDvd&wYth77?+$xt#3Z>0f{xcMNm3+Xai32_Ju zlrEY%GMpJYGK!SPWseZZIMsNYB|FzjgBNA6kO`hFgM|gKH)S&T;h)PO8BWH_7EF@D ziDVMU;viWH36V_5auy|ki2xm8m5sHtcoE7tdXohK|vAYO<@U`fqoD={Yh*?8c7pS zHEsr?v>m7l5lta_?ven@Ub_XrTnye+_VexV4gl~=q`Du_Vg6i>Nd5vnH0*a~mdqvd zXa-%7qDli9?YRT(J3JIYFzf?Ol#Af)7_vxE2du9}MSa>s(Ay!<~7w8Vg{7*X@bkC5*w1VdRO>0&WBXSR!xRFOP{J|z#6 zN6>NdDA`FKL)*zN_$TCXveSNo4--YfLAnzf-*FUN?$Xuet0Mp@Ofn# za%xV~#c8CYq>+9pIp+;8{!{cIR5-`!W29q9Ed-<mn0m|jwQ5M*OP=_^`WeNBES1s1C>AuC(~SIG6_iei91N1vsS(P!S{ih&IS zxDsw4H;5a|4S~bwq3~bIl|fnrexR9>?Sq{c_zH-_;Nn0mTIzPNj3HGNu5pQO9gYPIY{$~ibZ?Bd3774&iX#PkL7 zDJ;NH7b{Bg^(N3@0)0x-M6QY}>EcSzV7WGlo4lEu%vEzW%=Ey~j+9#jHD{qd9J5JV zP#LU?jSz2Ntkes+pylikO&SWyBBiHe!oarn5I8VuN}r`PLcA|%*k5-31Dk=tGsq|C z05?lw^JDY{kjGrQyIyd`OoA6uq`~HHO6K(>L%m@AtIwBOtqE4!&o#$Z+Y76i=!^A& z^RHI}`h#5k$y)GH;vF}S3($i*1S9Nn1rgXsP!Y^LfU+YGTjw*(^Q5CCum zIsj3B6-1{3ME(Jg>}6mH=THspOI@Il`)Da78clRR5Tlam+CXj@cNMps$v31>BuDr= z4Wh5nm%Bv>PBFW<>$vObEA&-}ovNo)1RDeGO}>lzTs@_SelwQJ!gCY1Y7@6g799}g zDWE4KeRI6+foSBSd@y9;fS$XB^7H@%l0Ce#Jj+@E zgmdi!Xg{l?I{2-F_d3V}%mKP+;lBzzk^Ce;1(Q_Q0EGl-7id*{_8n~Y)IXy+vU5ww z&^Xm0opb=^xir-YP<>%H-79Hse1(0|3f#-wE8MHxYutYB0C$jkoqL0OlRLz{#U19} z=HB7n<=*3taPMu`rCm;XBWd5Qydg|mdBgzbzE1U|KB3n_c7^#?`n4*}fxLh$q zF;lTbu~KoHVuRvA#p8-66;CUkRqR&mQS4RhQ@o)#q6LS+w5(g#zEwMatQlc+$VdC<{8xrqJ zd@S*)#AgzpOWd8fC-LRPR}()<{3P+S#LpAIO#D@=(Q38HTDLYw+gmGY`)G%0$7m;M zr)%rAt=e0(YqV>%w`n(MyR@6NyS00?d$s$tuV`P>ex*IB{YLwp_IvFQ+Fz1LQc6;K zQeIMiQeje2QgKpg(uAa{q?)9eNi9j?r0bH_Cv8aTO4^*XHR-ve{YeLt-cR~0>6@gV zbyi)rE>BmY8>Abe8>%bSRp`d)Cg^H)L0yM#xo(y2PTh05-MT%xy}Et6S9SY!2X*i2 z&LnG+4awGIPjY$knB=j^;)~DQ`vNPrRlvh#?rF@j~P0CLx=k*4CmcF09zkYyzpnkBvPVdt<>;3w9 z`c{3Le!f1UZ`a?Vzg53Zf4lxp{oVTY`kneO^ydvJ28W^0Fw!vDP-CbyOfyV3)EQVVXNse@DhmO3o8EOkWcsMOJ^<5Q=kHl#MChEqFIm!;mBx-E5k>W!wdkCrxKeKbg*%IkUoSG@Hz6W{cTs&NMsBS?1B^3Fa#EBy+WSin-Q2%{<*4 zF+XVDY2Iai!u*u^8S``I-R3>!v*vSY8ELjOdzv%Nm6ns%E6tOZn>H$KPFhRa+_XSi zFs&^uoOUGbWZE}r-=&>SSET2p_f8kn`=sZkUzT2w-Yy|eyZ&{96KD2yo`POpEa@umn@{{G~3`53c8I2ho8Fyzqk?}^x z>5Ttau~ls~TGOo=R+}};>aylr3#~=gV(VCIwRO66jx}UmVqIZfZN1aF(fXuyuk};w z*VgZCoK0iPu-R;Oo73j9^|zJV#@NQ%#@i}w^K9+5D{bp-8*E*+&9<$!`)m)`9N15)eP-Xxvdo6eKxQzrEi;@M&0LVVD04~XotYampU8YE z^I+y1nQvvjo%vqo`%z{U!Tb_P6ct+mG2lw0~y*-2SEg7l+Z2>L_#+If@-6jzNwg zj-ifv$KM@m99tZZI*vGgbS61!t(+bz2L zxbxik?m~BwyVzag9^@Y49_lW24|k7rm%GQfC%LQL)V<8T+`Ynmt^0cSO7~6fo87m# zZ*{M8-|oKCeYbnPdxN{nz1h9heV_XQ_ap9|?oZvv-CwxBa-Vd6GWLhS?PJ#bHsDh^MU6h&nKSGJfC~M^qlZ~?fKSo z%5&Ot#`BZsXU~5;zj%K2ToAFyi3%}6REvpXl9()}hz2oLG>hqChG-M*VsB9t+r@?A zVzEP9DqbmeidTtOi`R(Pi8qKhimSxc;u>+Sc$;{Kc$fGO@gA{D+#=p5ZWI40J|sRW z?h>CApAnxI_lPfvuZa7_gW?PvJzALPd*!AwnfI6;xH*KtU)&$8pkt6B}O=(zoGB`YahTVANR$ z!2j*vD|;V1H$+bgRg~ki@9Xlf%Ub60)0wbPBXnr@~q)f%Q9J$YZ%?-%-Ky-Y{(E|#Xm0HORka`QtXxfxQr+*CM;kLM?5k&2 z>(R&KtU1d$&Y!BUBl!-s<5+KN((ot^v;&k)^*huV$a_a`gRJ#&`bh1ub{%LAl=MWS z>0<KT&OwSAbLSZlWZ~~NjRbRi; zbfR`Y{iJ{9Of^4dvEO9AEA%3zJ;}?mLAE~8k^}R|>wBHo)jGHge1_cEVWLx@2f9W& zffFskkY8^uKTfw~#(B?!^o!QQBYVSXkvVH#iAH#VO6>0U{6yaHY+4TT4u_f6roFsL zoMO4Q-{+zd9DvfmBgla3f&T0bLib0aoL}j3x{}&U)4uHI-$=edhfCN zCuv2!KZ@6x_5@o-Eb`kE(plqOmr)72j?%p|kr)1^BmAO=iFPxtkbCe3-Hh7L1yv{N zFHBe%m;wfK=GvllypV?0@G#Z+}nLeBQKFfg_r{M26t!Tws?khfOF&bC{J9CB)p%+=3CP!`}C;SY=OVi4*XU?(z4PDo= zVr-=S*psM)hLP4*=H9s?`03iaCUFU-mfYHN2%pl)8zXbVVn5=U*gX>AhFdb z8_Mp;Y#nX!``fvNp11|n`odbmR}oh>WSwLZ&NY@Zb4OMDA9uHMLwkC9B3Y^BgRK{; zOapnJy{GN8riDD-Ijt!%H#?$+?A5mk=3kcQc4U7i;s8&DH^S=Lw6V+O57o}ikSLLo zo3XVqlSheroOQzuiuiL~njtSYb=+w1Z|DYp1&xK8&<>t%D6dXLi!5vT4i>ZDHC=Mg zMndrJ8wv4_$Q~Lk8Npcn%*OLs4sBVNby(=Z@*>uv%b>$I){TrXBL4s1wrYLYUllz# zr&!E_Lq9unJzj@qoO!qg;EeZO(axg(!ta7cyhGgN(MZ$;ck>9D^~I6(e2;?U%6>hy z@JH=s5ckCgwJS2$67lL@EUc~k<$lh`d$~?$Urcl@F#~x!qa&w;5^7r^y$xsK`;ZOq?Nt-jb#{G|4GXX3a919-&PdiXt;OP^ z#&<5RI`6lp!w0!?wHPNZqQ0y+79Veu_J=y%$a0-7DtF&ydnk3?Vj1-caN&v=Iox1= z2k@PC5kGBNP)!eYz~#Ja5j*t?^GhUo8_0PgsTIk()y_TXslJ7jliX_OB#;x4!8Mdx z-nEb25PJIZWgvwWXdzn7dkiz$!p{$tx9zC@5O3C2dW< zy7{dne2eF`qw$NYm97973FN8N$*6SwvuL+m3ya!6F@SsliBP-SQ#&enuHDtAa_^#Q zL5y>ix_mW@%+VD4Yv-&HbzY`#wU!$m$gQjR@kOXaU%u@4TOJjme;<99D^=winRzFQ z+avq-U1;Gx2VUcwQZ0q}stZ5PV|hmY>e1I~NBzCMyY{Beom5`xS^A?jtKXEjndv*K k^+>Faif`Q3Yy01n^qQ4XOL(#76_p8gMcTx6u$X<<-!>mgkN^Mx literal 0 HcmV?d00001 diff --git a/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/classes.nib new file mode 100644 index 0000000..4b1ab30 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/classes.nib @@ -0,0 +1,50 @@ + + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + ACTIONS + + doNotInstall + id + installLater + id + installNow + id + + CLASS + SUAutomaticUpdateAlert + LANGUAGE + ObjC + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/info.nib b/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/info.nib new file mode 100644 index 0000000..33a6020 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/info.nib @@ -0,0 +1,16 @@ + + + + + IBFramework Version + 629 + IBOldestOS + 5 + IBOpenObjects + + IBSystem Version + 9D34 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..4cd529a56b82299c1652f066cc95089a8bf1a192 GIT binary patch literal 7245 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 + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + CLASS + NSApplication + LANGUAGE + ObjC + SUPERCLASS + NSResponder + + + ACTIONS + + installUpdate + id + remindMeLater + id + skipThisVersion + id + + CLASS + SUUpdateAlert + LANGUAGE + ObjC + OUTLETS + + delegate + id + description + NSTextField + releaseNotesView + WebView + + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib/info.nib b/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib/info.nib new file mode 100644 index 0000000..d2586ea --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib/info.nib @@ -0,0 +1,16 @@ + + + + + IBFramework Version + 629 + IBOldestOS + 5 + IBOpenObjects + + IBSystem Version + 9E17 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..65dfc95e3c2a0d483abf2be092c76db216dadb3c GIT binary patch literal 10338 zcmd5>d3;k<_CNQ&?CWciCTWs3PXPg0Y)dI+hf)d!S_&;?r-t^m1k$D^DNt+W0)mQw zh=Lm;wCsY&BFN@~E4U+~gMbL?Aflt=jJxtX@4d7XVP^jQrJpo!x%b?2&-Oj%+^IF8 zU^JGRdK?H);6Mdx(10Ecym#4Nsjemc^nrAPd*L z4_eSo&dctqJS-2y0*sXM)`FtpVx3q%Fg|HJ|1B871ZmJ6GNBLjg@G^_#zHAnK`qRL zW$*wz3Xj1Puo|9(CfE#H;Az+eZ^JwAF1!cF;bZt5zJp)jSNIKnhd-d6m3IUMFvmBjhM~k9n+~GG=?I!n3+PB%NJr6PI);v; zlj#&%M$2iCPN!j7Lu=_w%II7=kIttH>HTyWeSj{fkI+ZyV{{c=N7vI0bSvFOchhI- zLHZ(ng}zE(qwmn;^b|cuzoHlE*Ypn#IKpvUBG;bl$@SuTbA7nJTtBWqH-H<+WpjhL z9Bwd|%MIa%a>Ka-u7+FAJxF?U4{AU1ek~xHW{X% zLUP1tELa_oRFCWzg=-^a;@E+3VJ(mD%i z=?$HQ`kr{zExn=PG|WQIXG0y_4)t&cG{BuO2N=wSc`zUDf(5V;?uL8dURZ?xC&Ln0 z3inG^fqct6m-2SBzfeq!po~N`<(OCbz7TVe@q2HcD!@Wc27m1EL~+OlAIU`Ql@T2~DDaah#| ztDrYdl{~$0lv#Pc2G*{Fwa|zrB$>Fvv9t-i87Rjc=|&m54%V-S^{@dp!Y1gAt1F{X zKFv~*!iG2t)zo5gQ-aE76z}b&5PAx>Ho;cd2EEZda4*5BaRT@wMZ0hWRi->uZm;;q zcJz-Ou#+uB2S{QIPQz}L(X+4z_QG?p5B9?WI0%Q}d3XVx;UzeXhV%-&3a`QI@CF=# zqwprYgVA_Hq<;b>r{D9IT$sf;fU#zG=)cWkjN_Lk>z zsA{1q5yC-DFkj4kArST{{i7lBVdf;7b zF0(POY#iUsM*aGjht20HZ)NjXaw+ewukV)Hy|d6gGfQ%>?pc}WUp-PA8p6B_<4_R2 zR7A)+i{I(!xwYuGf*dLY2;qGtjwr*g2vRgq*p$NB`)~|CK&HAzV-aMTr4&m{DcbuG zPBg&@_(;+o=1R>`Q67jyisXyt*m#naZ-!6c6r6@L=*DN^GdKt5nZQz6f0n}xERWT& z7_0wVJd%BZhWKSmG`j#_VI=z+F2OfaL_?<>TppBzFp4QB5~wV$s}Z9prdwDCJ?qGB zNFXMRRm~y&pG>;}et>_$zu`yt34UfbvNo(OYsYS4?Gbke*3^VVp)e;`s0l=4;?!^; zQZB@h;+1y=L#}<7Rv?Zm76wLn{i_#Dtk?UDL0fgI1m!#JGai z6fKk&k~lBrQ)F7jdAYg5%#5z7*G}}rnamqheC$Fm5H?kACg2o>xrj1_%y$ltnwNVB*`R&_=zBy4BAFN zmd4T(hz<>-ly}wFr=?0h(oOc4jEruGOg)-~)-H}ibIDDlJ?TI?!UEC>PLVF8tL(Ls z2UkYIwbkW=!l7^kxhO__m9K3oNn(9jcXZcoEY-#jKxgfBRRkw#B%LL&j0BwULpNPi$wA4GDH^4Mv?n8>B$sq= zB;BF+)lB6fQ^QDK)|2&Ny;&wIGETll46TWY2q$X~MiEJ>-O(25Ir&F>+ z$@b)|D6Pl;PK!wUD`^p#P3kZ$I-{gTQc8h|#85T_|K}j2=2cdQBVt4-6JxQK9W;ma zCs@j9xRo%pg}D$Q^8j-?GN0T<7Jx_=LIv8!J>*`ph#1IXvIHx~r9_KQmmwNthi6M+ zOEP;22_?-T1{PzQ5v>VCFl$09%??K})0Bqcgpm~$QBlgu5GUj*7$}2MMvK!B>!p-U z@?g|pm<3s-jt#?tm`%g`;c);V53=&LWEmTNA`TEz1}Y+s+(sTDk0QFAMFgo}A{)W- znx{M=OVT}1XjRoI#ft} z2mQ$orrkz%l3ips{6zMUz2rHvkL-sZ$wBy;JkLh5LN*E!X*4Th#cT{KL3|p^+Ou&J zYHFuq5batU2}wnw1UjROb91hR0Ze%n&~1$@adaCqdc?I8yko_w_#!$s7@H=mU&VsIZz`B;u&C0%lWzz)7+Xa*@0+58F*8xMs zyDsP`sj_Ex$0(lG6GOKYa^56wk+)He?@q`oN23Z>1jR^6yzZQe%9tn(dLR0cW8?$! z5r)35Gq6%+fhKaCd`M2PNo+Ek(nLPSzmu#K|86biJt%?U!B~!15vUDeteP#BOR2Mx z)Fod1@~_V^nG06cRyB|3O-fWfOFnBNpOJGC24eXVPn~jta-toGNCm`|8)eGp`S@5I(2}H)i{$Gj@-?|6m%{ON21X)*I^4VbTgp2y1fd8O zVPXm?3sa%{57^kGP>myI&(1=ROl4#bX=KlahLZYJNfjT-*@gm~&9M0|)WnaNYy5;k zbp}d*I;(C4gk%~#OnyTk)m@fXl-g)mfw2$Ke_pJ-Xn z{8S;eYgVfKNmJm5>ZxHJH7Hxc;vECoHPM(QdlBzM1dJFK5i!ioL-;Mjjza*;ib{MV6&IrXHi)CJL4a>U_@}&) zexo>|DqfaI*H;%N(p?C9Y5{DkO6vq6fH*3c~8ZW)+K$AP&Un*0CgSG0&1`xSHu z9g4tw{wiRe!|p_2uAfpEhzeDKpagq?>ewjnge&Em+$NFz36qwzj10WY>VaAvD>+$u zdILtI`fgn_Qq!~2#ZKL_kf$p*4T=Cp)1pRN6wj{X^{QA^BNZs)%Egdai5JSq5<0et zj#bKUhg@intVKA-JT_i^w=TCo13#UF<#r7g-1kf@7o&2SgAm?o5Lu0brsAM{9JC0t z!U(Pxh>CI&CB>vGW2OGqc{)vQVAZq5QzBv&b{O-;5y)Lc&asp}*mkV){j?fsCLztG zC9~u{m#gK#?e`Hw$xXnb@X#>fxG zx7;hDzKbqsq6=DgI{r%iUns8@vy|prANqd-~ z{^iLvH0fUY9MU{T56Cn(u+2y_#x_X->JWV%W}s1ENScO;aJk&U!}O7D)GK!I5a$K!aw+foZ?FHe zLe8Q>-fpFkJXFY2R|NbXJ=R*l|B((^jdVU~MJFHWY`a3|3_aVL&NV_spZo%a`U$-d zr|}F5Rbbn%C@OGuCjk}pmnU-8PcPAL*lwu{FZGuy;0)c1U8l1!nf{2u={yFL(^$qY zLmP-;w9jE1aFIOhKJCPiRgWR2KYF#Cu;b|iz06c>7gi{(ni#ScIZ7@yN-0%*NlvXS zS%C}gz^@;_(x0C!Yq>j%%NcP2BL)xYO8On%a;KCm^b+T4#XPcpMq-}+hz+yz$Ua6w ziTyb98<2g8`JKpqJ+d#wM`XX5r;aiu?q;qN*O}|Wb>(j1Qn@rPo$JPBaNW5~t_PRJ zo@4vies+KzWQW-E>;?8Bdx;%pFSA$JtL(LjMKLLg$oY7fFT~@IX$Zz;n1~3FjS0bQ z{O$1nB|U(Slj4P>AOQ`UhvI=kvwNW*71lP=be8JMb{ekH=YsXp19cXIg@XT1Iv++M^q-u^tbyR^!3e{j!}l zJ6Jv*dOeMYTuH1E?Q}gJd-ca7u(-4JL(7lIoN!St#?^8&xmnz7u8zB%tLN_E8n`>T zIUM8Wa`U+P++ExPZXtI!cMo?jw}`usTg)xtmU8!V%eV*Fo9r$2HhYJ?%id$}vt#T7 zcAS04POy*I$Lw$HB>RM&VyD>|_9;8dK4a(DdG{Uf^Eh zUgloqUgwT*Z*p&Q?{e>RC%G@V3*1HSXBANyREa8&s-r4hHCR=k8n2qDnxqm{Ayu7f zj_MxOBGpr>ZL0069jaZbXH|Pu`&0*1hg2`9UQ)fRdR6th>WJ#3>VoQf)i0{wRDY;0 ztBE>AovO}K_g4>9k5*4n->ROfE>~BmgX-z(kb16qvHB79W9n7v)#|nCCiMaJck16Y zHcfj?rY27_QB$F*(cGz7rg=j1lxDYPkLEeee$7G6^O_emhc&NgUemmxd0TTrb5`@c z=4Z`itxjvu+O>&Vx3-+K07G+MU`1+QZtD z+OM>~YJb=MsRJF=_0Z+$M(HYbwYoXFCA!CS>vVf`M|H<_XLaXvpX?B{h<4| z?kC+Zy5Dqv=q~Gt-lxykm*`9NLH!JUjlNFL^vm^+>(}Ww==bRl=nv^%(7&XAS^uj3 zb^Q_joBHqczZtX!y}@WO8!QIiU^65doCdey216S|sv+HwVaPOO8G0G|7{(c5hE0YS z4WAkQG&+qvjQx#6j3bQ`jHSkavCJqMryFM&XB+P}-fO(ixWu@^xY@YVxYu~p_<`}H z@k`@BjK7*RrZ%Q_ruL?ercS1=rdv#Drs1ZLiJ2Cg9xy#tc~rmsyun^k6;*5!D_cATDw>?ty$J8>n!Vh z>jT!+)=k#^);Fw2t#4W1vA$=0-}-^|g!N*Ex4&pVZ2!pqH~S~{)Amp8|8`J^%As{Q98O1D zM;Aw?qmN^}W1?fSqtp>_lsiO6rDLw6(Xr04!LiA)#j(|~!?DZpisLoM8;&;}7aSKI zmmJ?ZzH@x<_#x4hI52Tg;^4#~iFt{`6Y~>CCKe}-Py9Ubo5Wude@pzssc~AJ4(H9z zAU`RH$oYcvsPmljqD$-IU5Ty^t~6IK z*Fe`eSI{-XRpko1ZgVxbmb#X?mb)Hut#oa6?ROn?J@0zab=dX3>zwOz*O#sfu8Xek z-PEmeYuq}w!JX{x<<4;zxU1Y@_igT|yVgC+UFTlxUhZDyUhm%Oe#QNT`ycM_-9Nbh z?f%LAi~BeCA4w@m?UMQ>4NuBXDoh%kG$v_mQccplr2CSVCGAMsmGo@V-lTm=2a*mY zy^!=t(m#@ZPx{kCJe)`4(Rtc=+Iu>BI(fQyZtOA$H2G1PNT+e*Z0?$&< zT2GT_ooAb8x945YDKGWj;LY~tcyql&y~DgCyanDu?__VOcdEDCTj>pY7kL+ZmwK0Z zmwO-buJk_QUGLrK-QwNq-R|AteaHKr_n7y%_k{Oj?@8|uKDE!{<9%tqZoclm9=@Kw z-oC!R{=R{}LB7GhA-+7{a9_S}q;H&Wf^U*igaIXEG$yWL2^zS(j`` zHYFz}yOOh#dnNZt?w33uIXgKgIX8J|^04F)$py)U$)l5tlS`7Prl?bFDQ#1RrOZeP zr_`scNZFloDCJbjSALV<<8R|{=fBB+i$Beu?(gmI>%Y^_{PX;G`4{@{@h|c(_Am7> z^Dp;5q&cDIG$-l+F)&I2r8UIfIZvP(tbN>DQgZ@|juM0ZC zAeaP;zza6PAvguM;1PU6iXaF#3T=g(gbu>ZLT90?kSe4L8A7IzCG-;d2>pZsLbi}2 z + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + ACTIONS + + finishPrompt + id + toggleMoreInfo + id + + CLASS + SUUpdatePermissionPrompt + LANGUAGE + ObjC + OUTLETS + + delegate + id + descriptionTextField + NSTextField + moreInfoButton + NSButton + moreInfoView + NSView + + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/info.nib b/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/info.nib new file mode 100644 index 0000000..d2586ea --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/info.nib @@ -0,0 +1,16 @@ + + + + + IBFramework Version + 629 + IBOldestOS + 5 + IBOpenObjects + + IBSystem Version + 9E17 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..4b7cc9054ee9d1ce02297c9b8484b41ec561c5ee GIT binary patch literal 13156 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 literal 0 HcmV?d00001 diff --git a/Sparkle.framework/Versions/A/Resources/fr.lproj/Sparkle.strings b/Sparkle.framework/Versions/A/Resources/fr.lproj/Sparkle.strings new file mode 100644 index 0000000000000000000000000000000000000000..ea175ae718007ffa8325619d382eb2db6e5b1133 GIT binary patch literal 8554 zcmd^^-)>t)5XSeqPjOliB2}aaxJ0N4w5m`^sh}<5(s4}c#&wKi$4#ClkJdY69s>A& zGZ}Wzv7JAVV+1IQeY|J?%+7o>^X=?!zo(DW{ZyrA=}4bleZJLSFAdW~zej1TmXp*^ z`)b=)%U(LwC+`o`I@D87eIBUozGk|U?xl_NN%|mdt7Rj7dhzr+b<(korvFe+`wSkKj`;Vqv?HW&y{}l)1lr+Z{$1H$d29& z)Y`W_#Tv{$(7UO6b<=CT&yo){<19VYZmRT!{+I8nqc?NSIoCIz1N}2oM;bZMGg^6d zA!je0r7dX^snNtBZJPeFeCQF)qW6#u$-F(w_Ez(=vx(je^~}?`$@;nUf2T!zc5Ssy zlW$6&@oxC#7w()`=aa33oD}Gp~-xpK0j%9psdn3aDc53_0(5eM|$g--gedJ z#Ma0=cMQ0-(bbMtA4!vaX$cwn8iU1I<4EmbcAP%a@6czqwPPX6GBL^NNB_XcL?b~T za=F$YEX4$VfVcFd5$yM?KAEf1o*c{X_54OsP1RmWM*l`0dgZ-`Mt)Wg*Tf?siCuOK z3uo$`HG=Ma#{-)OuR7LWU%xKXP^lBg80cgU-ee4x@c<;A$u{>=TR8KW!Kdr2Yg$5& zV0>^92S8Y5dYkD9|EUZqW7{_fz+NY2FSNF2`&w?d9HC++Ml8Sav_bQ zcx3qN7b~tyQy#CD?R!ghjrd4p3ZL3GFS||@ZAR*dqt}a(q1R;^Iv0}Ab;Lw`r!O62 zeXvH9TxN}p^qJ+A%i}9{S&Yi=7weCqpt`9^GHRJ&=(8yCyk(C&QnVzdY}aIo93GJ> zJf$t~-;oT&!kNCoXz9&a!iWru{(ZNQ{-w>td?1V2$p7G>IWrl;_fFLFSh5_c%-@bT z-)!eZ!#XFbvz*)01Kf{1hKAnjKj*aiigWciPi^Xlhz=s)4P><=Wx|{roG;P`-H><5 zesESeYMrBipP{jXv9XQd3`COWh7owGM~-IZ_h^JZ;Jevx18puL3;-DeP3}M7Zm2iR z?EJ_x2>fZT{?6i9fpM#(M_pq=GNaFm{ zw>Z0g+hplZ3!At{fhtZR?hD~ZoWd5RekC0KyL|}D{Z^{W_W$vnks*z< zS>0<&YjAR=4O(-UnuKYPS+oyN(SQ|zAJ zayE?Uw2EEMEb|O(1o>x?TRJl(@-Z7{b^67rYHU*EQ~7Oh1K-^+{UT}Ha^=qa^x{<{ z&PP}CTsRFZgSf}(s(w;+eivt4Se93@Kq@;87CqMPVK<(o`3$L=>>+fHeWKFh+>QDn z917{9V)$jjrdXTz6ZL2dZC{yIsb>s|m3Jg791RvSUd!55dMQgp{VX%ex+HN5Ud}7p z(-C!+t}1g8uc)cP9m{xiEZ)dpmi;>$#aQP887m<_mghWi!CI>i8@hfW>v$EHs-B|_ zguC}q1@_9|Sh14oF(<~ro98@G$|`s^^f;V~6F=n)`Yo=1{Ni_ACy# zcRDM-g#Y~myL`Nqt6jFo<_NE)-F$ChjYaS0&VWklvMBH*m2u#SY}6LEzZNPoJ0jxy ztpnICvr0yFeT1K(a+Q=ZQK_%X+&-4;l3fSM^%1#lo;fjjBE0o-UtMi!;s)Ni%+gP5 zmOfmt^y*p3ysPlDTbq^pgSsuAspWQVxV}wKi-_mH+NlkJ$a=M>ZoQ1q=Zch6XgJ%) zEyLm+Q?_qncH-gp}` z4iwj^X%OqLo&!uXa%v-e<>viQW;FEnnoXJA@_xuFFqabJw-jqTTYQFBIb z&6UW-J2gLHa8uP*v~ulinr58Y!X?QQ!OBbIvD>)UCAYz5y86ePvLBWfE-?28FTbYl literal 0 HcmV?d00001 diff --git a/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/classes.nib new file mode 100644 index 0000000..4b1ab30 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/classes.nib @@ -0,0 +1,50 @@ + + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + ACTIONS + + doNotInstall + id + installLater + id + installNow + id + + CLASS + SUAutomaticUpdateAlert + LANGUAGE + ObjC + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/info.nib b/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/info.nib new file mode 100644 index 0000000..2e04cfa --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/info.nib @@ -0,0 +1,20 @@ + + + + + IBFramework Version + 667 + IBLastKnownRelativeProjectPath + ../Sparkle.xcodeproj + IBOldestOS + 5 + IBOpenObjects + + 6 + + IBSystem Version + 9D34 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..15ba8f4c8e18093cec6121a6aab21fdf4a8cea1d GIT binary patch literal 7161 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 + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + CLASS + NSApplication + LANGUAGE + ObjC + SUPERCLASS + NSResponder + + + ACTIONS + + installUpdate + id + remindMeLater + id + skipThisVersion + id + + CLASS + SUUpdateAlert + LANGUAGE + ObjC + OUTLETS + + delegate + id + description + NSTextField + releaseNotesView + WebView + + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib/info.nib b/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib/info.nib new file mode 100644 index 0000000..2e04cfa --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib/info.nib @@ -0,0 +1,20 @@ + + + + + IBFramework Version + 667 + IBLastKnownRelativeProjectPath + ../Sparkle.xcodeproj + IBOldestOS + 5 + IBOpenObjects + + 6 + + IBSystem Version + 9D34 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..2984064502b81dee5147f477cb7f28350dd4d945 GIT binary patch literal 10360 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 + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + ACTIONS + + finishPrompt + id + toggleMoreInfo + id + + CLASS + SUUpdatePermissionPrompt + LANGUAGE + ObjC + OUTLETS + + delegate + id + descriptionTextField + NSTextField + moreInfoButton + NSButton + moreInfoView + NSView + + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib/info.nib b/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib/info.nib new file mode 100644 index 0000000..c493485 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib/info.nib @@ -0,0 +1,20 @@ + + + + + IBFramework Version + 667 + IBLastKnownRelativeProjectPath + ../Sparkle.xcodeproj + IBOldestOS + 5 + IBOpenObjects + + 5 + + IBSystem Version + 9D34 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..55cc2c271b5b63daf69c155ca294fdfa17a9e0e5 GIT binary patch literal 12659 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 literal 0 HcmV?d00001 diff --git a/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/classes.nib new file mode 100644 index 0000000..4b1ab30 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/classes.nib @@ -0,0 +1,50 @@ + + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + ACTIONS + + doNotInstall + id + installLater + id + installNow + id + + CLASS + SUAutomaticUpdateAlert + LANGUAGE + ObjC + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/info.nib b/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/info.nib new file mode 100644 index 0000000..3f09790 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/info.nib @@ -0,0 +1,18 @@ + + + + + IBFramework Version + 629 + IBOldestOS + 5 + IBOpenObjects + + 6 + + IBSystem Version + 9D34 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..aa38f86ba2610ef2aff9b9ba9b2bdfcdfaf38147 GIT binary patch literal 7234 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 literal 0 HcmV?d00001 diff --git a/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/classes.nib new file mode 100644 index 0000000..994d4c3 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/classes.nib @@ -0,0 +1,67 @@ + + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + CLASS + NSApplication + LANGUAGE + ObjC + SUPERCLASS + NSResponder + + + ACTIONS + + installUpdate + id + remindMeLater + id + skipThisVersion + id + + CLASS + SUUpdateAlert + LANGUAGE + ObjC + OUTLETS + + delegate + id + description + NSTextField + releaseNotesView + WebView + + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/info.nib b/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/info.nib new file mode 100644 index 0000000..d2586ea --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/info.nib @@ -0,0 +1,16 @@ + + + + + IBFramework Version + 629 + IBOldestOS + 5 + IBOpenObjects + + IBSystem Version + 9E17 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..c82d3581bf07ad42836237f2cd3ea55ca48b73b6 GIT binary patch literal 10220 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 O_|R9B- + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + ACTIONS + + finishPrompt + id + toggleMoreInfo + id + + CLASS + SUUpdatePermissionPrompt + LANGUAGE + ObjC + OUTLETS + + delegate + id + descriptionTextField + NSTextField + moreInfoButton + NSButton + moreInfoView + NSView + + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/info.nib b/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/info.nib new file mode 100644 index 0000000..d2586ea --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/info.nib @@ -0,0 +1,16 @@ + + + + + IBFramework Version + 629 + IBOldestOS + 5 + IBOpenObjects + + IBSystem Version + 9E17 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..ac298ce7e33ac2b2b9e3971c5a730f431ed872a7 GIT binary patch literal 12535 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 &-a!7R(}MG2KUBgXUDll+r+*ztt;Vw2g`>-E2it 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 literal 0 HcmV?d00001 diff --git a/Sparkle.framework/Versions/A/Resources/relaunch b/Sparkle.framework/Versions/A/Resources/relaunch new file mode 100755 index 0000000000000000000000000000000000000000..e7b96d61466005ca15b235b527e3ceb5d4819283 GIT binary patch literal 58924 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 + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + ACTIONS + + doNotInstall + id + installLater + id + installNow + id + + CLASS + SUAutomaticUpdateAlert + LANGUAGE + ObjC + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/info.nib b/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/info.nib new file mode 100644 index 0000000..2b3d425 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/info.nib @@ -0,0 +1,20 @@ + + + + + IBFramework Version + 670 + IBLastKnownRelativeProjectPath + ../Sparkle.xcodeproj + IBOldestOS + 5 + IBOpenObjects + + 6 + + IBSystem Version + 9E17 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..1d4655c593e467e2972b1800808d53a152f4e56b GIT binary patch literal 7675 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 + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + CLASS + NSApplication + LANGUAGE + ObjC + SUPERCLASS + NSResponder + + + ACTIONS + + installUpdate + id + remindMeLater + id + skipThisVersion + id + + CLASS + SUUpdateAlert + LANGUAGE + ObjC + OUTLETS + + delegate + id + description + NSTextField + releaseNotesView + WebView + + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib/info.nib b/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib/info.nib new file mode 100644 index 0000000..2b3d425 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib/info.nib @@ -0,0 +1,20 @@ + + + + + IBFramework Version + 670 + IBLastKnownRelativeProjectPath + ../Sparkle.xcodeproj + IBOldestOS + 5 + IBOpenObjects + + 6 + + IBSystem Version + 9E17 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..103b1cf8478a00db14aafa192b05f1868c294c9f GIT binary patch literal 10895 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 SGKqLr0)O + + + + IBClasses + + + CLASS + NSObject + LANGUAGE + ObjC + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + ACTIONS + + finishPrompt + id + toggleMoreInfo + id + + CLASS + SUUpdatePermissionPrompt + LANGUAGE + ObjC + OUTLETS + + delegate + id + descriptionTextField + NSTextField + moreInfoButton + NSButton + moreInfoView + NSView + + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/info.nib b/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/info.nib new file mode 100644 index 0000000..5132e29 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/info.nib @@ -0,0 +1,18 @@ + + + + + IBFramework Version + 670 + IBLastKnownRelativeProjectPath + ../Sparkle.xcodeproj + IBOldestOS + 5 + IBOpenObjects + + IBSystem Version + 9E17 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..c09d9e70d19c579ac605ff48aaee067448e0cea7 GIT binary patch literal 12898 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 lomi4xP~K + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + ACTIONS + + doNotInstall + id + installLater + id + installNow + id + + CLASS + SUAutomaticUpdateAlert + LANGUAGE + ObjC + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/info.nib b/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/info.nib new file mode 100644 index 0000000..c5a067e --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/info.nib @@ -0,0 +1,20 @@ + + + + + IBFramework Version + 670 + IBLastKnownRelativeProjectPath + ../Sparkle.xcodeproj + IBOldestOS + 5 + IBOpenObjects + + 6 + + IBSystem Version + 10A96 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..53cb91a9b32fc4ddcc2a4506d3ae1c0458085256 GIT binary patch literal 7474 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 LVePl=TiW?wt9#5* literal 0 HcmV?d00001 diff --git a/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/classes.nib new file mode 100644 index 0000000..018710a --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/classes.nib @@ -0,0 +1,39 @@ +{ + IBClasses = ( + { + CLASS = FirstResponder; + LANGUAGE = ObjC; + SUPERCLASS = NSObject; + }, + { + CLASS = NSApplication; + LANGUAGE = ObjC; + SUPERCLASS = NSResponder; + }, + { + CLASS = NSObject; + LANGUAGE = ObjC; + }, + { + ACTIONS = { + installUpdate = id; + remindMeLater = id; + skipThisVersion = id; + }; + CLASS = SUUpdateAlert; + LANGUAGE = ObjC; + OUTLETS = { + delegate = id; + description = NSTextField; + releaseNotesView = WebView; + }; + SUPERCLASS = SUWindowController; + }, + { + CLASS = SUWindowController; + LANGUAGE = ObjC; + SUPERCLASS = NSWindowController; + } + ); + IBVersion = 1; +} \ No newline at end of file diff --git a/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/info.nib b/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/info.nib new file mode 100644 index 0000000..6b787d4 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/info.nib @@ -0,0 +1,18 @@ + + + + + IBDocumentLocation + 69 14 356 240 0 0 1280 778 + IBFramework Version + 489.0 + IBLastKnownRelativeProjectPath + ../Sparkle.xcodeproj + IBOldestOS + 5 + IBSystem Version + 9D34 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..7e6d490e723329c1372940af22e3d49bc0ee5da0 GIT binary patch literal 10180 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 literal 0 HcmV?d00001 diff --git a/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/classes.nib new file mode 100644 index 0000000..5220a22 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/classes.nib @@ -0,0 +1,59 @@ + + + + + IBClasses + + + CLASS + SUWindowController + LANGUAGE + ObjC + SUPERCLASS + NSWindowController + + + ACTIONS + + finishPrompt + id + toggleMoreInfo + id + + CLASS + SUUpdatePermissionPrompt + LANGUAGE + ObjC + OUTLETS + + delegate + id + descriptionTextField + NSTextField + moreInfoButton + NSButton + moreInfoView + NSView + + SUPERCLASS + SUWindowController + + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + CLASS + NSObject + LANGUAGE + ObjC + + + IBVersion + 1 + + diff --git a/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/info.nib b/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/info.nib new file mode 100644 index 0000000..c5a067e --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/info.nib @@ -0,0 +1,20 @@ + + + + + IBFramework Version + 670 + IBLastKnownRelativeProjectPath + ../Sparkle.xcodeproj + IBOldestOS + 5 + IBOpenObjects + + 6 + + IBSystem Version + 10A96 + targetFramework + IBCocoaFramework + + diff --git a/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib b/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..64babac12911fdb05ddb63ef96193137c91f3ddf GIT binary patch literal 13483 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 C^-$vg literal 0 HcmV?d00001 diff --git a/Sparkle.framework/Versions/A/Sparkle b/Sparkle.framework/Versions/A/Sparkle new file mode 100755 index 0000000000000000000000000000000000000000..0db0a8f01fb6f1cf39bbe427ac76153793a26a3e GIT binary patch literal 463540 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

B-YH*!3RdDu#}q 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 literal 0 HcmV?d00001 diff --git a/Sparkle.framework/Versions/Current b/Sparkle.framework/Versions/Current new file mode 120000 index 0000000..8c7e5a6 --- /dev/null +++ b/Sparkle.framework/Versions/Current @@ -0,0 +1 @@ +A \ No newline at end of file diff --git a/ToDo.ooutline b/ToDo.ooutline new file mode 100644 index 0000000..e923889 --- /dev/null +++ b/ToDo.ooutline @@ -0,0 +1,1108 @@ + + + + + BackgroundColor + + b + 1 + g + 1 + r + 1 + + Columns + + + Identifier + 8edf65ce3e447ba105390001 + MaximumWidth + 3.000000e+01 + MinimumWidth + 1.300000e+01 + OOPlainTextExportWidthKey + 1 + Title + + Width + 1.300000e+01 + + + Identifier + 514465cf3e447ba105390001 + MaximumWidth + 1.000000e+06 + MinimumWidth + 1.300000e+01 + OOPlainTextExportWidthKey + 72 + Title + Topic + Width + 5.680000e+02 + + + IsNoteExpanded + + NoteColumn + 8edf65ce3e447ba105390001 + NoteHeight + 51 + Other Information + + Page Layout + + BAt0eXBlZHN0cmVhbYED6IQBQISEhAtOU1ByaW50SW5mbwGEhAhOU09iamVj + dACFkoSEhBNOU011dGFibGVEaWN0aW9uYXJ5AISEDE5TRGljdGlvbmFyeQCU + hAFpCJKEhIQITlNTdHJpbmcBlIQBKw5OU0JvdHRvbU1hcmdpboaShISECE5T + TnVtYmVyAISEB05TVmFsdWUAlIQBKoSEAWadJIaShJmZFE5TVmVydGljYWxs + eUNlbnRlcmVkhpKEm5yEhAFzngCGkoSZmQxOU0xlZnRNYXJnaW6GkoSbnJ2d + JIaShJmZDU5TUmlnaHRNYXJnaW6GkoSbnJ2dJIaShJmZFE5TVmVydGljYWxQ + YWdpbmF0aW9uhpKEm5ygngCGkoSZmRZOU0hvcml6b250YWxseUNlbnRlcmVk + hpKfkoSZmQtOU1RvcE1hcmdpboaShJucnZ0khpKEmZkVTlNIb3Jpem9uYWxQ + YWdpbmF0aW9uhpKEm5ygngCGhoY= + + SpellCheckingEnabled + + + OutlineColumn + 514465cf3e447ba105390001 + Root Item + + Children + + + Children + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 add preferences panel} + + State + 1 + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 selectable and customisable key maps} + + State + 1 + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 system-wide hot keys} + + State + 1 + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 floating window} + + State + 1 + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 up and down arrows move octave up or down (or right/left)} + + State + 1 + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 make white key highlighting not overlap the black keys} + + State + 1 + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 support clicking the keys to send notes} + + State + 1 + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 radically improve visual playback of incoming notes by supporting multiple inputs, mapping of channel ranges and input port to different colours} + + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 adjustable fade time for key highlighting on note off} + + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 save the unique id for our virtual source and reuse it in future sessions} + + State + 3 + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 improve response time for handling keydown events, with a goal of handling at least 8 "simultaneous" keydowns fast enough to simulate true polyphony} + + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 preference for transparency of entire main window} + + State + 1 + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 allow MIDI sources to go "offline" and mark them as such in the popup menu} + + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 add inverted keymaps with the lower octave on top} + + State + 1 + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 the black key keycodes for the lower octave (physically upper on the computer keyboard)} + + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 add option to only make the window transparent when MidiKeys is not on top} + + State + 1 + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 support using the mouse for control of pitch bend or modulation} + + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 add temporary octave adjustment modifiers. so ctl is for normal playing, but ctl-shift is up an octave and ctl-option is down an octave.} + + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 visual representation of which octave is currently active} + + State + 1 + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 make the up and down arrows adjust velocity} + + State + 1 + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 support for an alternate velocity setting accessed by another modifier key (?)} + + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 better icon!} + + State + 1 + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 fixed Deutsch localisation} + + State + 1 + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 Deutsch documentation} + + State + 1 + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 html credits so the urls are working hyperlinks} + + State + 1 + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 make the MidiKeys Help item in the Help menu open the readme} + + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 reduce the keyboard window's level when the prefs panel is on screen} + + State + 1 + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 add a standard window toolbar button to the main window that toggles the upper part of the window, so you can hide everything but the keyboard} + + State + 1 + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 update documentation for new 1.6 features} + + State + 1 + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 put a note in the documentation that you can hold down the command key while the keyboard window is floating and another app is active to click into it or drag it around without bringing it to the front} + + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 incorporate the further Deutsch localisation fixes (beyong ralf@macnews.de's)} + + State + 1 + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 add MIDI Thru option for the listen source} + + State + 1 + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 add "None" item to "Listen to port" popup, which will also disable the MIDI Thru checkboif selected} + + State + 1 + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 add "all notes off" command (panic)} + + State + 1 + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 reverse the transparency sliders so that opaque is the leftmost position and moving the thumb to the right makes it more transparent} + + State + 1 + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 make the preferences take effect immediately. for example, moving the transparency slider changes the window's transparency immediately.} + + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 add preference-configurable keys to switch between velocity settings.} + + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 add a key to reset the octave shift back to the center.} + + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 BUG: the problem where playing a note on an external device highlights a key on the keyboard, then a widget is opened (e.g., popup menu) and the key is let go while the mouse is still down prevents the note off from being handled.} + + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 was two copies of MidiKeys running simultaneously} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica-Oblique;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\i\fs24 \cf0 there is a bug with at least the Japanese localisation where the MIDI Source popup does not filter out the "MidiKeys" virtual source correctly} + + State + 1 + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 BUG: MIDI Thru. broken according to Ralf Welter.} + + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 BUG: the octave offset when clicking on the keyboard. [fixed by making the mouse ignore the octave offset]} + + State + 1 + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 BUG: when the keyboard window is toggled closed on app quit, on next startup it will appear shifted up by the toggle amount.} + + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 French localisation} + + State + 1 + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 Japanese localisation} + + State + 1 + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 make up and down arrow keys work without hot keys when keyboard has focus} + + State + 1 + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 BUG: keys can get stuck down if you press down on a key and then change the octave offset before releasing that key. can be fixed by cancelling all active notes when the octave offset is changed.} + + + + Children + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 then add configurable hot keys to toggle the keyboard take-over mode on and off.} + + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 put an NSStatusItem in the menu bar when the keyboard take-over mode is active to make it clear why the keyboard doesn't work like normal. or instead, maybe even a large translucent floating window somewhere on screen.} + + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 add option to take over the entire keyboard when in the background (using hot keys) so notes can be played without requiring any modifiers to be held down.} + + Expanded + + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 Use CGGetLastMouseDelta() to transform mouse and trackpad movements into pitchbend and other controller values.} + + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 Add an option to set other modifier key combinations for an octave above and below the current one.} + + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 Create a virtual destination that users can select to send data to from other programs. It should appear in the "Listen to port" popup menu.} + + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 Support another octave up and down. Maybe even two additional octaves. Currently the lowest note playable is 36. Could even move 3 additional octaves down to reach note 0.} + + State + 1 + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 Add option to create new, fully configurable key maps that can be saved in external XML files and shared between users. (Could also save them in ~/Library somewhere.)} + + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 When adjusting the velocity or octave offset through the keyboard, the new value should be presented in an overlay window, somewhat like what happens when you change the screen brightness or computer volume.} + + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 Add a way to change the MIDI channel via the keyboard and hot keys. This too should be presented in an overlay window when the value changes.} + + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 Add hot keys for the F-keys like F1, F2, and so on to switch between key maps.} + + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica-Bold;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\b\fs28 \cf0 MidiKeys To Do List} + + Expanded + + State + 3 + + + Cols + + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} + + Expanded + + + Styles + + + Heading + + type + None + + ShouldAllowSorting + + TextColor + + b + 0 + g + 0 + r + 0 + + TextFont + + name + Helvetica + size + 1.200000e+01 + + + + Heading + + type + None + + ShouldAllowSorting + + + + Heading + + type + None + + ShouldAllowSorting + + + + Heading + + type + None + + ShouldAllowSorting + + + + Version + 6 + + diff --git a/Version history.rtf b/Version history.rtf new file mode 100644 index 0000000..10aa6ef --- /dev/null +++ b/Version history.rtf @@ -0,0 +1,119 @@ +{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +{\*\listtable{\list\listtemplateid1\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid1\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid1} +{\list\listtemplateid2\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid101\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid2} +{\list\listtemplateid3\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid201\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid3} +{\list\listtemplateid4\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid301\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid4} +{\list\listtemplateid5\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid401\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid5} +{\list\listtemplateid6\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid501\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid6}} +{\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}{\listoverride\listid2\listoverridecount0\ls2}{\listoverride\listid3\listoverridecount0\ls3}{\listoverride\listid4\listoverridecount0\ls4}{\listoverride\listid5\listoverridecount0\ls5}{\listoverride\listid6\listoverridecount0\ls6}} +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural + +\f0\b\fs24 \cf0 Version 1.8\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural + +\b0 \cf0 \'95 MidiKeys is now a universal binary. +\b \ + +\b0 \'95 Minimum system is now 10.5.\ +\'95\'a0Changed ownership to Immo Software.\ +\'95 New configurable hot key to toggle global hot keys.\ +\'95 Support for automatic software updates using the Sparkle framework.\ +\'95\'a0New option to show the key caps on the on-screen keyboard.\ +\'95 The MIDI channel field has been changed to a pop-up menu.\ +\'95 The disclosure button to show the destination and listen menus is now a normal button instead of being a repurposed toolbar toggle button.\ +\'95 Pressed key highlights are drawn with a slight gradient.\ +\'95 New Global Hot Keys menu item.\ +\'95 New preferences to control the visibility of overlay notifications.\ +\'95 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.\ +\'95 Key maps were extended to use more keys on the keyboard.\ +\'95 Non-English localisations have been disabled for this release due to the number of UI changes.\ +\'95 Added a preference to make the keyboard window transparent to mouse clicks when MidiKeys is in the background.\ +\'95 Made the keyboard window minimizable.\ +\'95 Reorganized the preferences window with several tabs.\ +\'95 Added preferences to control software updates.\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural + +\b \cf0 \ +Version 1.7b1\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural + +\b0 \cf0 \'95 Support for 10.4. +\b \ +\ +Version 1.6b3\ + +\b0 \'95 increased the octave offset range to -4 through +4 to encompass more MIDI notes\ +\'95 added Spanish localisation\ +\'95 MIDI through should work now (it works on my system) +\b \ +\ + +\itap1\trowd \taflags0 \trgaph108\trleft-108 \trbrdrt\brdrnil \trbrdrl\brdrnil \trbrdrt\brdrnil \trbrdrr\brdrnil +\clvertalc \clshdrawnil \clwWidth13820\clftsWidth3 \clmart10 \clmarl10 \clmarb10 \clmarr10 \clbrdrt\brdrnil \clbrdrl\brdrnil \clbrdrb\brdrnil \clbrdrr\brdrnil \clpadt20 \clpadl20 \clpadb20 \clpadr20 \gaph\cellx8640 +\pard\intbl\itap1\pardeftab720\sa480\ql\qnatural +\cf0 Version 1.6b2\ +\pard\intbl\itap1\tx220\tx720\pardeftab720\li720\fi-720\ql\qnatural +\ls1\ilvl0 +\b0 \cf0 {\listtext \'95 }The previous beta accidentally had all but the Japanese localisations included but turned off.\ +{\listtext \'95 }Fixed a bug where the velocity hotkey could get stuck.\ +{\listtext \'95 }Updated the LiesMich and Lisez-Moi.\ +\pard\intbl\itap1\pardeftab720\sa480\ql\qnatural + +\b \cf0 \ +Version 1.6b1\ +\pard\intbl\itap1\tx220\tx720\pardeftab720\li720\fi-720\ql\qnatural +\ls2\ilvl0 +\b0 \cf0 {\listtext \'95 }Added a button to the keyboard window's title bar that will hide and show the MIDI options (destination and source).\ +{\listtext \'95 }The octave offset is shown visually through up and down arrow icons.\ +{\listtext \'95 }Added a MIDI through option for the source. (May be broken in this release.)\ +{\listtext \'95 }New icon! This one is much better. To see it, you have to log out and log back in.\ +{\listtext \'95 }French and Japanese localisations.\ +{\listtext \'95 }A preference to make the keyboard window opaque when MidiKeys is the frontmost application.\ +{\listtext \'95 }The keyboard window will not float above other windows while the Preferences panel is open.\ +{\listtext \'95 }Added Full Reversed and Upper Single keymaps.\ +{\listtext \'95 }Added Send All Notes Off command to Keys menu.\ +{\listtext \'95 }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.\ +{\listtext \'95 }Similiarly, the up and down arrow keys are hot keys for increasing and decreasing the velocity.\ +{\listtext \'95 }Added a "None" option to the Listen to port popup menu.\ +{\listtext \'95 }Fixed the black keys, the number keys on the computer keyboard, for the upper octave of the Full keymap.\ +\pard\intbl\itap1\pardeftab720\sa480\ql\qnatural + +\b \cf0 \ +Version 1.5\ +\pard\intbl\itap1\tx220\tx720\pardeftab720\li720\fi-720\ql\qnatural +\ls3\ilvl0 +\b0 \cf0 {\listtext \'95 }Added preferences panel.\ +{\listtext \'95 }Global hot keys option.\ +{\listtext \'95 }Option to float window above all applications.\ +{\listtext \'95 }Changed how keypresses are detected, so it works with non-US keyboards.\ +{\listtext \'95 }Added German localisation.\ +{\listtext \'95 }Supports clicking on the keyboard!\ +{\listtext \'95 }Many more new features and changes...\ +\pard\intbl\itap1\pardeftab720\sa480\ql\qnatural + +\b \cf0 \ +Version 1.1.1\ +\pard\intbl\itap1\tx220\tx720\pardeftab720\li720\fi-720\ql\qnatural +\ls4\ilvl0 +\b0 \cf0 {\listtext \'95 }Fixed a problem with the name of the first destination in the destination popup.\ +\pard\intbl\itap1\pardeftab720\sa480\ql\qnatural + +\b \cf0 \ +Version 1.1\ +\pard\intbl\itap1\tx220\tx720\pardeftab720\li720\fi-720\ql\qnatural +\ls5\ilvl0 +\b0 \cf0 {\listtext \'95 }Changed to textured window style.\ +{\listtext \'95 }Added destination menu.\ +{\listtext \'95 }Saves source and destination in prefs.\ +{\listtext \'95 }Saves window position in prefs.\ +{\listtext \'95 }Fixed many bugs.\ +\pard\intbl\itap1\pardeftab720\sa480\ql\qnatural + +\b \cf0 \ +Version 1.0.1\ +\pard\intbl\itap1\tx220\tx720\pardeftab720\li720\fi-720\ql\qnatural +\ls6\ilvl0 +\b0 \cf0 {\listtext \'95 }Oops! I forgot to support NoteOff events, since the controller I was testing with, an Oxygen8, sends NoteOn with velocity instead.\cell \lastrow\row +} \ No newline at end of file diff --git a/dsa_pub.pem b/dsa_pub.pem new file mode 100644 index 0000000..9667f72 --- /dev/null +++ b/dsa_pub.pem @@ -0,0 +1,20 @@ +-----BEGIN PUBLIC KEY----- +MIIDOzCCAi0GByqGSM44BAEwggIgAoIBAQCK3zwwhog2q01dAXxM+Hgt9K/J28EE +N0MnDtLsFnCwVsds6KHc0jn9FBt4hX9dTHG/PZe9ytzrVjI/r3N3sKu3p6rbqK95 +6RnNx/OylHHRtAOnmfxUDXuyiwTyBA7KPBhR7YSSL1EApSrf7yE1fdjbpSwNVTAw +TewGK10Z6nfH9SjfRCRfUxviEVG8ZiBVlSc2RE6AL3nECRgIq4MJm8A/S6/RCSG6 +yZzlv0K/22KtaLFlwgenhDXH3wcEdNpZBlN6mmbHhS9xIQMCK+pLA5q+x0omriCz +iz7rR6wosb6EX/NklTJtbs0QPjrVmrSrZMdQiXa3DXowRy7aluDBPePJAhUAw3yy +6Wv7PUjW8PxiOUt16kN0JHkCggEAAN7yi3+pHqaA3fRbwkOvQsAFxJL8YHa1m3wy +cZdyfhS3bp5A9NjH9R0R6IsOFWRZGtJDZ6E5sxgQFYnD+T//0rjuQroHvXCN+Eja +EdnSPruMeeTVsg0PEWo/ie7jH9pdbZSRO0Aw2kX5K2WvSNOC1S+lQ0/4RMS1MmpK +OoO0HKWHzmOR7PRDHaaILb0apC/wiutt5eVkLN0+83Ryu2lADDkLSEUCs4dktNzf +7OzUrBIJInT9s+hmCsjf8N92voBZgVhnvv7pdc1zXZkRIaHAaEYKZVxspN1OWx4J +ZQUMwJ85IEIJrSlzhbLJfz9ZLRyco9l4he2lnlwCC4VHccDP5gOCAQYAAoIBAQCI +8wiJ4Qr37379d/wdxwRG6IbFxgGPt2/hVjS1dXsN+fm4iBCP8bqZAccM0Ki58NEU +QnYsXQCRD3OFaMt04F/Uj/Lnb72CZcofz0QPZLL/rONoQp+bPKO3icS4SyI+/FI2 +uSdYsKDbb6laEHiDyTNiyIeHyvprE8An/Di3BmIKIpxIpvFmm67djoLas2OHXVv6 +ftuNCXIZChpQJsiU31Fjo/MbUyTWHreA6+gqblv4SlfhBvs7OM9iuOuRxFISMQc2 +eUAsF1e1MgaypFhaMW84b9cnSYaZQqWevTT1Jr0Dwq8qoVAVpWLGnhkY/sI/VCMT +J920TrzqqpNizNAduzfD +-----END PUBLIC KEY----- diff --git a/main.m b/main.m new file mode 100644 index 0000000..1641938 --- /dev/null +++ b/main.m @@ -0,0 +1,14 @@ +// +// main.m +// MidiKeys +// +// Created by Chris Reed on Tue Oct 15 2002. +// Copyright (c) 2002 Chris Reed. All rights reserved. +// + +#import + +int main(int argc, const char *argv[]) +{ + return NSApplicationMain(argc, argv); +} diff --git a/sv.lproj/Localizable.strings b/sv.lproj/Localizable.strings new file mode 100644 index 0000000000000000000000000000000000000000..25bc9325487424b63405301db3e0a6f0f9a2ebb3 GIT binary patch literal 2502 zcmd6p-)<675XR@)r&yb4wOaZBjfvVTLu#9VciupE3j|oq@~7c_>uadLZ-(swET!HM zLtxLIb7tn7`MxuU-@nf6#4?*&-zHYs%x-MXZ^pP_tht;~#mtGF*$X?emi@2}YX#%X zKJY!VOWsC&I#%LK&mObqzW*CD1-mB9=RCJ#B`=@Z*SDYUDYM}Uk)C5d@|`oT{kClh z5_#V3u?_MiScmM|=kJ2JgVo*{aW-r4RFvj}We2MXKKhPI=v0dgza_uBGP!1tD)Y)d zuGRD_OpNhRVLkN>Vm+$bCWdk!^1I|IuEy5&NF5j)@UED$iPbq+a^{Ym->zHFotxZV zuElL)DJ5*9l`6v95M<&)@s-)kN8)E;_rB7>uYCR+*6&y-f}Z;^zh{rKxS@KHN8oEb zGndV1&&x?M3%m73vrw;MUy6*{4UvqV9}cJy$q~t85}pys6KL!RR6tJCe_J{qD+3eJ_xe z+#@|0S0tfS_8JfPwtXhDnYm6v_n{JL_tfvWP)Ot~yLF97aZ>BO$1CwGHR=R~O8(zo zP@fXrEv0j;K2kX6>pk)CeY94O&fL>l59~{ns2&t2WE*=haDfKWzlY4;!DITzp}Q`v zs&mD9*j}N6bdzpcej=`_R;`pZ0L!Lz%X^>hih92Ox70%A1HVP;m4sDYv;vh**Jeav KO{;1B-2MQBR;_6O literal 0 HcmV?d00001