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 0000000..f5c8862 Binary files /dev/null and b/English.lproj/InfoPlist.strings differ diff --git a/English.lproj/KeyMapNames.strings b/English.lproj/KeyMapNames.strings new file mode 100644 index 0000000..414ad82 Binary files /dev/null and b/English.lproj/KeyMapNames.strings differ diff --git a/English.lproj/Localizable.strings b/English.lproj/Localizable.strings new file mode 100644 index 0000000..a0103a2 Binary files /dev/null and b/English.lproj/Localizable.strings differ 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 0000000..80759e6 Binary files /dev/null and b/French.lproj/InfoPlist.strings differ diff --git a/French.lproj/KeyMapNames.strings b/French.lproj/KeyMapNames.strings new file mode 100644 index 0000000..8e37282 Binary files /dev/null and b/French.lproj/KeyMapNames.strings differ diff --git a/French.lproj/Lisez-Moi.rtf b/French.lproj/Lisez-Moi.rtf new file mode 100644 index 0000000..ccc9b25 --- /dev/null +++ b/French.lproj/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;} +\paperw11904\paperh16835\margl1440\margr1440\vieww12960\viewh14420\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 clavier 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 clavier, 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 deuxi\'8fme 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". Deux 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 "cal\'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 configuration de clavier possible. "Compl\'8fte" r\'8eparti 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\'8ee 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\'8ee 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. Tant que maintenant, 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/French.lproj/Localizable.strings b/French.lproj/Localizable.strings new file mode 100644 index 0000000..4bc4342 Binary files /dev/null and b/French.lproj/Localizable.strings differ diff --git a/French.lproj/MainMenu.xib b/French.lproj/MainMenu.xib new file mode 100644 index 0000000..dc4fceb --- /dev/null +++ b/French.lproj/MainMenu.xib @@ -0,0 +1,2806 @@ + + + + 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 0000000..d56ff05 Binary files /dev/null and b/German.lproj/InfoPlist.strings differ diff --git a/German.lproj/KeyMapNames.strings b/German.lproj/KeyMapNames.strings new file mode 100644 index 0000000..ef09e26 Binary files /dev/null and b/German.lproj/KeyMapNames.strings differ diff --git a/German.lproj/Localizable.strings b/German.lproj/Localizable.strings new file mode 100644 index 0000000..cf411d4 Binary files /dev/null and b/German.lproj/Localizable.strings differ 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 0000000..80759e6 Binary files /dev/null and b/Japanese.lproj/InfoPlist.strings differ diff --git a/Japanese.lproj/KeyMapNames.strings b/Japanese.lproj/KeyMapNames.strings new file mode 100644 index 0000000..f62dd30 Binary files /dev/null and b/Japanese.lproj/KeyMapNames.strings differ diff --git a/Japanese.lproj/Localizable.strings b/Japanese.lproj/Localizable.strings new file mode 100644 index 0000000..4b8be5c Binary files /dev/null and b/Japanese.lproj/Localizable.strings differ 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 0000000..3dcb2e0 Binary files /dev/null and b/MidiKeys.icns differ 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 0000000..2ba0860 Binary files /dev/null and b/Octave.png differ diff --git a/OctaveDown.png b/OctaveDown.png new file mode 100644 index 0000000..59b9e05 Binary files /dev/null and b/OctaveDown.png differ diff --git a/OctaveUp.png b/OctaveUp.png new file mode 100644 index 0000000..6dbd9e9 Binary files /dev/null and b/OctaveUp.png differ diff --git a/OverlayIndicator.h b/OverlayIndicator.h new file mode 100644 index 0000000..5c8bf93 --- /dev/null +++ b/OverlayIndicator.h @@ -0,0 +1,51 @@ +// +// OverlayIndicator.h +// MidiKeys +// +// Created by Chris Reed on Tue Jun 17 2003. +// Copyright (c) 2003 Chris Reed. All rights reserved. +// + +#import + +//! 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 0000000..69b4990 Binary files /dev/null and b/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Frameworks/ShortcutRecorder.framework/Versions/A/ShortcutRecorder differ 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 0000000..bda3cab Binary files /dev/null and b/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/MacOS/ShortcutRecorder differ 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 0000000..308f874 Binary files /dev/null and b/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Resources/English.lproj/InfoPlist.strings differ 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 0000000..0c5de0d Binary files /dev/null and b/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Resources/English.lproj/SR_LeopardInspector.nib differ diff --git a/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Resources/English.lproj/SR_LeopardLibrary.nib b/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Resources/English.lproj/SR_LeopardLibrary.nib new file mode 100644 index 0000000..9683a72 Binary files /dev/null and b/ShortcutRecorder/ShortcutRecorder.ibplugin/Contents/Resources/English.lproj/SR_LeopardLibrary.nib differ 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 0000000..f091fb3 Binary files /dev/null and b/Spanish.lproj/InfoPlist.strings differ diff --git a/Spanish.lproj/KeyMapNames.strings b/Spanish.lproj/KeyMapNames.strings new file mode 100755 index 0000000..aed8717 Binary files /dev/null and b/Spanish.lproj/KeyMapNames.strings differ diff --git a/Spanish.lproj/Localizable.strings b/Spanish.lproj/Localizable.strings new file mode 100755 index 0000000..c5930e4 Binary files /dev/null and b/Spanish.lproj/Localizable.strings differ 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 0000000..4f1d598 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/SUStatus.nib/keyedobjects.nib differ 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 0000000..6b92630 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib differ diff --git a/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib/classes.nib new file mode 100644 index 0000000..994d4c3 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/de.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/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 0000000..b4353d2 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib/keyedobjects.nib differ diff --git a/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib/classes.nib new file mode 100644 index 0000000..5220a22 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/de.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/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 0000000..b403a3e Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib differ 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 0000000..b31f928 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/de.lproj/Sparkle.strings differ 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 0000000..7630390 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib differ 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 0000000..e7e7497 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/keyedobjects.nib differ 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 0000000..e8dc5b8 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib differ 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 0000000..16e0787 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/en.lproj/Sparkle.strings differ diff --git a/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/classes.nib new file mode 100644 index 0000000..4b1ab30 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/es.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/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 0000000..6b2f938 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib differ diff --git a/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib/classes.nib new file mode 100644 index 0000000..994d4c3 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/es.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/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 0000000..c9b1e7d Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib/keyedobjects.nib differ 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 0000000..8c54c21 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib differ diff --git a/Sparkle.framework/Versions/A/Resources/es.lproj/Sparkle.strings b/Sparkle.framework/Versions/A/Resources/es.lproj/Sparkle.strings new file mode 100644 index 0000000..f83ea23 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/es.lproj/Sparkle.strings differ 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 0000000..4cd529a Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib differ diff --git a/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib/classes.nib new file mode 100644 index 0000000..994d4c3 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/fr.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/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 0000000..65dfc95 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib/keyedobjects.nib differ diff --git a/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/classes.nib new file mode 100644 index 0000000..5220a22 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/fr.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/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 0000000..4b7cc90 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib differ 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 0000000..ea175ae Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/fr.lproj/Sparkle.strings differ 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 0000000..15ba8f4 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib differ diff --git a/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib/classes.nib new file mode 100644 index 0000000..994d4c3 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/it.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/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 0000000..2984064 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib/keyedobjects.nib differ diff --git a/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib/classes.nib new file mode 100644 index 0000000..5220a22 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/it.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/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 0000000..55cc2c2 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib differ diff --git a/Sparkle.framework/Versions/A/Resources/it.lproj/Sparkle.strings b/Sparkle.framework/Versions/A/Resources/it.lproj/Sparkle.strings new file mode 100644 index 0000000..5c410d0 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/it.lproj/Sparkle.strings differ 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 0000000..aa38f86 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib differ 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 0000000..c82d358 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/keyedobjects.nib differ diff --git a/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/classes.nib new file mode 100644 index 0000000..5220a22 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/nl.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/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 0000000..ac298ce Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib differ diff --git a/Sparkle.framework/Versions/A/Resources/nl.lproj/Sparkle.strings b/Sparkle.framework/Versions/A/Resources/nl.lproj/Sparkle.strings new file mode 100644 index 0000000..67cf535 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/nl.lproj/Sparkle.strings differ diff --git a/Sparkle.framework/Versions/A/Resources/relaunch b/Sparkle.framework/Versions/A/Resources/relaunch new file mode 100755 index 0000000..e7b96d6 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/relaunch differ diff --git a/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/classes.nib new file mode 100644 index 0000000..4b1ab30 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/ru.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/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 0000000..1d4655c Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib differ diff --git a/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib/classes.nib new file mode 100644 index 0000000..994d4c3 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/ru.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/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 0000000..103b1cf Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib/keyedobjects.nib differ diff --git a/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/classes.nib new file mode 100644 index 0000000..0f776c8 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/classes.nib @@ -0,0 +1,59 @@ + + + + + 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 0000000..c09d9e7 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib differ diff --git a/Sparkle.framework/Versions/A/Resources/ru.lproj/Sparkle.strings b/Sparkle.framework/Versions/A/Resources/ru.lproj/Sparkle.strings new file mode 100644 index 0000000..f3ff9d8 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/ru.lproj/Sparkle.strings differ diff --git a/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/classes.nib b/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/classes.nib new file mode 100644 index 0000000..4b1ab30 --- /dev/null +++ b/Sparkle.framework/Versions/A/Resources/sv.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/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 0000000..53cb91a Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib differ 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 0000000..7e6d490 Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/keyedobjects.nib differ 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 0000000..64babac Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib differ diff --git a/Sparkle.framework/Versions/A/Resources/sv.lproj/Sparkle.strings b/Sparkle.framework/Versions/A/Resources/sv.lproj/Sparkle.strings new file mode 100644 index 0000000..b676a4f Binary files /dev/null and b/Sparkle.framework/Versions/A/Resources/sv.lproj/Sparkle.strings differ diff --git a/Sparkle.framework/Versions/A/Sparkle b/Sparkle.framework/Versions/A/Sparkle new file mode 100755 index 0000000..0db0a8f Binary files /dev/null and b/Sparkle.framework/Versions/A/Sparkle differ 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 0000000..25bc932 Binary files /dev/null and b/sv.lproj/Localizable.strings differ