Chord editing mostly works again

This commit is contained in:
Matthias Neeracher 2006-10-03 17:52:54 +00:00
parent 74a6637574
commit 50da584417
10 changed files with 1614 additions and 372 deletions

View File

@ -7,7 +7,7 @@
ACTIONS = {hideFieldEditor = id; setDivisions = id; setKey = id; setTime = id; };
CLASS = VLSheetView;
LANGUAGE = ObjC;
OUTLETS = {fChords = id; fFieldBeingEdited = id; fFieldEditor = id; };
OUTLETS = {fFieldEditor = id; };
SUPERCLASS = NSView;
}
);

Binary file not shown.

View File

@ -6,13 +6,23 @@
// Copyright __MyCompanyName__ 2005 . All rights reserved.
//
#import <Cocoa/Cocoa.h>
#import "VLModel.h"
#import <Cocoa/Cocoa.h>
@interface VLEditable : NSObject
{
}
- (NSString *) stringValue;
- (void) setStringValue:(NSString*)val;
- (BOOL) validValue:(NSString*)val;
@end
@interface VLDocument : NSDocument
{
VLSong * song;
VLEditable *editTarget;
}
- (VLSong *) song;
@ -23,4 +33,5 @@
- (void) setKey:(int)key transpose:(BOOL)transpose;
- (void) setTimeNum:(int)num denom:(int)denom;
- (void) setDivisions:(int)divisions;
@end

View File

@ -8,6 +8,24 @@
#import "VLDocument.h"
@implementation VLEditable
- (NSString *) stringValue
{
return @"";
}
- (void) setStringValue:(NSString*)val
{
}
- (BOOL) validValue:(NSString*)val
{
return YES;
}
@end
@implementation VLDocument
- (id)init
@ -18,7 +36,8 @@
// Add your subclass-specific initialization here.
// If an error occurs here, send a [self release] message and return nil.
song = new VLSong;
song = new VLSong;
editTarget = nil;
}
return self;
}

View File

@ -53,20 +53,18 @@ enum VLRegion {
float fDisplayScale;
NSPoint fLastNoteCenter;
NSTrackingRectTag fCursorTracking;
VLRegion fCursorRegion;
int fCursorMeasure;
VLFract fCursorAt;
int fCursorPitch;
id fFieldBeingEdited;
BOOL fShowFieldEditor;
IBOutlet id fChords;
IBOutlet id fFieldEditor;
}
- (IBAction) setKey:(id)sender;
- (IBAction) setTime:(id)sender;
- (IBAction) setDivisions:(id)sender;
- (IBAction) showFieldEditor:(id)sender withAction:(SEL)selector;
- (IBAction) hideFieldEditor:(id)sender;
- (VLDocument *) document;
@ -83,6 +81,8 @@ enum VLRegion {
- (void) mouseEntered:(NSEvent *)event;
- (void) mouseExited:(NSEvent *)event;
- (BOOL)control:(NSControl *)control textShouldEndEditing:(NSText *)fieldEditor;
@end
// Local Variables:

View File

@ -346,15 +346,6 @@ static float sFlatPos[] = {
[self setNeedsDisplay: YES];
}
- (IBAction)showFieldEditor:(id)sender withAction:(SEL)selector
{
fFieldBeingEdited = sender;
[fFieldEditor setObjectValue:[sender title]];
[fFieldEditor setAction:selector];
[self setValue: [NSNumber numberWithBool:YES]
forKey: @"fShowFieldEditor"];
}
- (IBAction)hideFieldEditor:(id)sender
{
[fFieldEditor setAction:nil];
@ -386,14 +377,14 @@ static int sSemiToPitch[] = {
loc = [self convertPoint:loc fromView:nil];
if (loc.y < 0.0f || loc.y >= fNumSystems*kSystemH)
return kRegionNowhere;
return fCursorRegion = kRegionNowhere;
int system = fNumSystems - static_cast<int>(loc.y / kSystemH) - 1;
loc.y = fmodf(loc.y, kSystemH);
loc.x -= fClefKeyW;
if (loc.x < 0.0f || loc.x >= fMeasPerSystem*fMeasureW)
return kRegionNowhere;
return fCursorRegion = kRegionNowhere;
int measure = static_cast<int>(loc.x / fMeasureW);
loc.x -= measure*fMeasureW;
@ -404,16 +395,25 @@ static int sSemiToPitch[] = {
fCursorAt = VLFraction(div+group*fDivPerGroup, 4*prop.fDivisions);
fCursorMeasure = measure+system*fMeasPerSystem;
if (loc.y >= kSystemY+kChordY)
return kRegionChord;
else if (loc.y < kSystemY+kLyricsY)
return kRegionLyrics;
if (fCursorMeasure > [self song]->fMeasures.size())
return fCursorRegion = kRegionNowhere;
if (loc.y >= kSystemY+kChordY) {
//
// Chord, round to quarters
//
int scale = fCursorAt.fDenom / 4;
fCursorAt = VLFraction(fCursorAt.fNum / scale, 4);
return fCursorRegion = kRegionChord;
} else if (loc.y < kSystemY+kLyricsY) {
return fCursorRegion = kRegionLyrics;
}
loc.y -= kSystemY+kSemiFloor;
int semi = static_cast<int>(roundf(loc.y / (0.5f*kLineH)));
fCursorPitch = sSemiToPitch[semi];
return kRegionNote;
return fCursorRegion = kRegionNote;
}
- (void) mouseMoved:(NSEvent *)event
@ -446,6 +446,9 @@ static int sSemiToPitch[] = {
case kRegionNote:
[self addNoteAtCursor];
break;
case kRegionChord:
[self editChord];
break;
default:
break;
}
@ -470,4 +473,11 @@ static int sSemiToPitch[] = {
}
}
- (BOOL)control:(NSControl *)control textShouldEndEditing:(NSText *)fieldEditor
{
VLDocument * doc = [self document];
VLEditable * editable = [[self document] valueForKey: @"editTarget"];
return [editable validValue:[fFieldEditor stringValue]];
}
@end

View File

@ -8,9 +8,7 @@
@interface VLSheetView (Chords)
- (IBAction) editChord:(id)sender;
- (IBAction) doneEditingChord:(id)sender;
- (void) editChord;
- (void) drawChordsForSystem:(int)system;
@end

View File

@ -12,10 +12,49 @@
#import "VLModel.h"
#import "VLSoundOut.h"
#import "VLDocument.h"
@implementation VLSheetView (Chords)
std::string NormalizeName(NSString* rawName)
{
std::string chordName =
(const char *)[[rawName lowercaseString] UTF8String];
//
// Normalize # and b
//
for (;;) {
size_t found;
- (NSAttributedString *) attributedStringWithCppString:(const std::string &)s
found = chordName.find("\xE2\x99\xAF", 0, 3);
if (found != std::string::npos) {
chordName.replace(found, 3, 1, '#');
continue;
}
found = chordName.find("\xE2\x99\xAD", 0, 3);
if (found != std::string::npos) {
chordName.replace(found, 3, 1, 'b');
continue;
}
found = chordName.find(" ", 0, 1);
if (found != std::string::npos) {
chordName.erase(found);
continue;
}
break;
}
return chordName;
}
@interface NSAttributedString (Chords)
+ (NSAttributedString *) attributedStringWithCppString:(const std::string &)s
attributes:(NSDictionary *)a;
@end
@implementation NSAttributedString (Chords)
+ (NSAttributedString *) attributedStringWithCppString:(const std::string &)s
attributes:(NSDictionary *)a
{
return [[[NSAttributedString alloc]
@ -24,6 +63,98 @@
autorelease];
}
@end
@interface VLChordEditable : VLEditable {
NSView * fView;
VLSong * fSong;
int fMeasure;
VLFract fAt;
}
- (VLChordEditable *)initWithView:(NSView *)view
song:(VLSong *)song
measure:(int)measure
at:(VLFract)at;
- (NSString *) stringValue;
- (void) setStringValue:(NSString*)val;
- (BOOL) validValue:(NSString*)val;
@end
@implementation VLChordEditable
- (VLChordEditable *)initWithView:(NSView *)view
song:(VLSong *)song
measure:(int)measure
at:(VLFract)at;
{
self = [super init];
fView = view;
fSong = song;
fMeasure= measure;
fAt = at;
return self;
}
- (NSString *) stringValue
{
const VLMeasure measure = fSong->fMeasures[fMeasure];
const VLChordList & chords = measure.fChords;
VLFraction at(0);
for (VLChordList::const_iterator chord = chords.begin();
chord != chords.end() && at <= fAt;
++chord
) {
if (at == fAt && chord->fPitch != VLNote::kNoPitch) {
//
// Found it!
//
const VLProperties & prop = fSong->fProperties.front();
std::string name, ext, root;
chord->Name(name, ext, root, prop.fKey > 0);
return [NSString stringWithFormat:@"%s%s%s",
name.c_str(), ext.c_str(),
root.size() ? ("/"+root).c_str() : ""];
}
at += chord->fDuration;
}
return @"";
}
- (void) setStringValue:(NSString *)val
{
std::string chordName = NormalizeName(val);
if (!chordName.size()) {
fSong->DelChord(fMeasure, fAt);
} else {
VLChord chord(chordName);
VLSoundOut::Instance()->PlayChord(chord);
fSong->AddChord(chord, fMeasure, fAt);
[fView setNeedsDisplay:YES];
}
}
- (BOOL) validValue:(NSString *)val
{
std::string chordName = NormalizeName(val);
if (!chordName.size())
return YES;
//
// Check for valid chord
//
VLChord chord(chordName);
return chord.fPitch != VLNote::kNoPitch;
}
@end
@implementation VLSheetView (Chords)
- (NSAttributedString *) stringWithChord:(const VLChord &)chord
{
const VLSong * song = [self song];
@ -53,14 +184,14 @@
NSMutableAttributedString * s =
[[[NSMutableAttributedString alloc] init] autorelease];
[s appendAttributedString:
[self attributedStringWithCppString: name
[NSAttributedString attributedStringWithCppString: name
attributes: sBigFont]];
[s appendAttributedString:
[self attributedStringWithCppString: ext.size() ? ext : " "
[NSAttributedString attributedStringWithCppString: ext.size() ? ext : " "
attributes: sSuperFont]];
if (root.size())
[s appendAttributedString:
[self attributedStringWithCppString: "/" + root
[NSAttributedString attributedStringWithCppString: "/" + root
attributes: sBigFont]];
return s;
@ -68,7 +199,8 @@
- (void) drawChordsForSystem:(int)system
{
const VLSong * song = [self song];
const VLSong * song = [self song];
const float kSystemY = [self systemY:system];
//
// Build new list
@ -86,69 +218,25 @@
) {
NSAttributedString * chordName = [self stringWithChord:*chord];
NSPoint chordLoc =
NSMakePoint(kClefX+kClefW+(m+at)*fMeasureW+0.5f*kNoteW,
NSMakePoint(fClefKeyW+(m+at)*fMeasureW+0.5f*kNoteW,
kSystemY+kChordY);
[chordName drawAtPoint:chordLoc];
at += chord->fDuration;
}
}
}
- (IBAction) editChord:(id)sender
- (void) editChord
{
[self showFieldEditor:sender withAction:@selector(doneEditingChord:)];
}
- (IBAction) doneEditingChord:(id)sender
{
VLSong * song = [self song];
std::string chordName =
(const char *)[[[sender stringValue] lowercaseString] UTF8String];
//
// Normalize # and b
//
for (;;) {
size_t found;
found = chordName.find("\xE2\x99\xAF", 0, 3);
if (found != std::string::npos) {
chordName.replace(found, 3, 1, '#');
continue;
}
found = chordName.find("\xE2\x99\xAD", 0, 3);
if (found != std::string::npos) {
chordName.replace(found, 3, 1, 'b');
continue;
}
found = chordName.find(" ", 0, 1);
if (found != std::string::npos) {
chordName.erase(found);
continue;
}
break;
}
//
// Check for valid chord
//
VLChord chord(chordName);
if (!chordName.size()) {
[sender setTextColor: [NSColor blackColor]];
} else if (chord.fPitch == VLChord::kNoPitch) {
if (chordName.size()) {
NSBeep();
[sender setTextColor: [NSColor redColor]];
}
int tag = [sender tag];
song->DelChord(tag >> 8, VLFraction(tag & 0xFF, 4));
} else {
NSAttributedString * s = [self stringWithChord:chord];
[sender setAttributedStringValue: s];
[fFieldBeingEdited setTitle: s];
[sender setTextColor: [NSColor blackColor]];
VLSoundOut::Instance()->PlayChord(chord);
int tag = [fFieldBeingEdited tag];
song->AddChord(chord, tag >> 8, VLFraction(tag & 0xFF, 4));
}
VLDocument * doc= [self document];
VLEditable * e =
[[VLChordEditable alloc]
initWithView:self
song:[self song]
measure:fCursorMeasure
at:fCursorAt];
[doc setValue:e forKey:@"editTarget"];
[self setValue:[NSNumber numberWithBool:YES] forKey:@"fShowFieldEditor"];
}
@end

View File

@ -200,47 +200,7 @@
<key>Content</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>95DFE83A0AD105A300375606</string>
<key>PBXProjectModuleLabel</key>
<string>VLSheetView.mm</string>
<key>PBXSplitModuleInNavigatorKey</key>
<dict>
<key>Split0</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>95DFE83B0AD105A300375606</string>
<key>PBXProjectModuleLabel</key>
<string>VLSheetView.mm</string>
<key>_historyCapacity</key>
<integer>0</integer>
<key>bookmark</key>
<string>95DFE83E0AD105C900375606</string>
<key>history</key>
<array>
<string>95DFE8370AD1053A00375606</string>
</array>
</dict>
<key>SplitCount</key>
<string>1</string>
</dict>
<key>StatusBarVisibility</key>
<true/>
</dict>
<key>Geometry</key>
<dict>
<key>Frame</key>
<string>{{0, 20}, {763, 552}}</string>
<key>PBXModuleWindowStatusBarHidden2</key>
<false/>
<key>RubberWindowFrame</key>
<string>164 91 763 593 0 0 1024 746 </string>
</dict>
</dict>
<dict>
<key>Content</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>95D1F82E0AB694EC00EE6AC8</string>
<string>95B042FC0ACE431A00236B52</string>
<key>PBXProjectModuleLabel</key>
<string>&lt;No Editor&gt;</string>
<key>PBXSplitModuleInNavigatorKey</key>
@ -262,117 +222,7 @@
<key>Content</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>95D1F7FE0AB68C8C00EE6AC8</string>
<key>PBXProjectModuleLabel</key>
<string>&lt;No Editor&gt;</string>
<key>PBXSplitModuleInNavigatorKey</key>
<dict/>
<key>StatusBarVisibility</key>
<true/>
</dict>
<key>Geometry</key>
<dict>
<key>Frame</key>
<string>{{0, 20}, {763, 552}}</string>
<key>PBXModuleWindowStatusBarHidden2</key>
<false/>
<key>RubberWindowFrame</key>
<string>242 153 763 593 0 0 1024 746 </string>
</dict>
</dict>
<dict>
<key>Content</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>95D1F8130AB6908400EE6AC8</string>
<key>PBXProjectModuleLabel</key>
<string>&lt;No Editor&gt;</string>
<key>PBXSplitModuleInNavigatorKey</key>
<dict/>
<key>StatusBarVisibility</key>
<true/>
</dict>
<key>Geometry</key>
<dict>
<key>Frame</key>
<string>{{0, 20}, {763, 552}}</string>
<key>PBXModuleWindowStatusBarHidden2</key>
<false/>
<key>RubberWindowFrame</key>
<string>186 75 763 593 0 0 1024 746 </string>
</dict>
</dict>
<dict>
<key>Content</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>95D1F8850AB69B6700EE6AC8</string>
<key>PBXProjectModuleLabel</key>
<string>&lt;No Editor&gt;</string>
<key>PBXSplitModuleInNavigatorKey</key>
<dict/>
<key>StatusBarVisibility</key>
<true/>
</dict>
<key>Geometry</key>
<dict>
<key>Frame</key>
<string>{{0, 20}, {763, 552}}</string>
<key>PBXModuleWindowStatusBarHidden2</key>
<false/>
<key>RubberWindowFrame</key>
<string>168 116 763 593 0 0 1024 746 </string>
</dict>
</dict>
<dict>
<key>Content</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>95D1F8660AB6970400EE6AC8</string>
<key>PBXProjectModuleLabel</key>
<string>&lt;No Editor&gt;</string>
<key>PBXSplitModuleInNavigatorKey</key>
<dict/>
<key>StatusBarVisibility</key>
<true/>
</dict>
<key>Geometry</key>
<dict>
<key>Frame</key>
<string>{{0, 20}, {763, 552}}</string>
<key>PBXModuleWindowStatusBarHidden2</key>
<false/>
<key>RubberWindowFrame</key>
<string>15 148 763 593 0 0 1024 746 </string>
</dict>
</dict>
<dict>
<key>Content</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>95D1F8310AB694EC00EE6AC8</string>
<key>PBXProjectModuleLabel</key>
<string>&lt;No Editor&gt;</string>
<key>PBXSplitModuleInNavigatorKey</key>
<dict/>
<key>StatusBarVisibility</key>
<true/>
</dict>
<key>Geometry</key>
<dict>
<key>Frame</key>
<string>{{0, 20}, {763, 552}}</string>
<key>PBXModuleWindowStatusBarHidden2</key>
<false/>
<key>RubberWindowFrame</key>
<string>164 91 763 593 0 0 1024 746 </string>
</dict>
</dict>
<dict>
<key>Content</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>95B042FA0ACE431A00236B52</string>
<string>95B042FB0ACE431A00236B52</string>
<key>PBXProjectModuleLabel</key>
<string>&lt;No Editor&gt;</string>
<key>PBXSplitModuleInNavigatorKey</key>
@ -416,7 +266,7 @@
<key>Content</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>95B042FB0ACE431A00236B52</string>
<string>95B042FA0ACE431A00236B52</string>
<key>PBXProjectModuleLabel</key>
<string>&lt;No Editor&gt;</string>
<key>PBXSplitModuleInNavigatorKey</key>
@ -438,7 +288,315 @@
<key>Content</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>95B042FC0ACE431A00236B52</string>
<string>95D1F8310AB694EC00EE6AC8</string>
<key>PBXProjectModuleLabel</key>
<string>&lt;No Editor&gt;</string>
<key>PBXSplitModuleInNavigatorKey</key>
<dict/>
<key>StatusBarVisibility</key>
<true/>
</dict>
<key>Geometry</key>
<dict>
<key>Frame</key>
<string>{{0, 20}, {763, 552}}</string>
<key>PBXModuleWindowStatusBarHidden2</key>
<false/>
<key>RubberWindowFrame</key>
<string>164 91 763 593 0 0 1024 746 </string>
</dict>
</dict>
<dict>
<key>Content</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>95D1F8660AB6970400EE6AC8</string>
<key>PBXProjectModuleLabel</key>
<string>&lt;No Editor&gt;</string>
<key>PBXSplitModuleInNavigatorKey</key>
<dict/>
<key>StatusBarVisibility</key>
<true/>
</dict>
<key>Geometry</key>
<dict>
<key>Frame</key>
<string>{{0, 20}, {763, 552}}</string>
<key>PBXModuleWindowStatusBarHidden2</key>
<false/>
<key>RubberWindowFrame</key>
<string>15 148 763 593 0 0 1024 746 </string>
</dict>
</dict>
<dict>
<key>Content</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>95D1F8850AB69B6700EE6AC8</string>
<key>PBXProjectModuleLabel</key>
<string>&lt;No Editor&gt;</string>
<key>PBXSplitModuleInNavigatorKey</key>
<dict/>
<key>StatusBarVisibility</key>
<true/>
</dict>
<key>Geometry</key>
<dict>
<key>Frame</key>
<string>{{0, 20}, {763, 552}}</string>
<key>PBXModuleWindowStatusBarHidden2</key>
<false/>
<key>RubberWindowFrame</key>
<string>168 116 763 593 0 0 1024 746 </string>
</dict>
</dict>
<dict>
<key>Content</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>95D1F8130AB6908400EE6AC8</string>
<key>PBXProjectModuleLabel</key>
<string>&lt;No Editor&gt;</string>
<key>PBXSplitModuleInNavigatorKey</key>
<dict/>
<key>StatusBarVisibility</key>
<true/>
</dict>
<key>Geometry</key>
<dict>
<key>Frame</key>
<string>{{0, 20}, {763, 552}}</string>
<key>PBXModuleWindowStatusBarHidden2</key>
<false/>
<key>RubberWindowFrame</key>
<string>186 75 763 593 0 0 1024 746 </string>
</dict>
</dict>
<dict>
<key>Content</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>95D1F7FE0AB68C8C00EE6AC8</string>
<key>PBXProjectModuleLabel</key>
<string>&lt;No Editor&gt;</string>
<key>PBXSplitModuleInNavigatorKey</key>
<dict/>
<key>StatusBarVisibility</key>
<true/>
</dict>
<key>Geometry</key>
<dict>
<key>Frame</key>
<string>{{0, 20}, {763, 552}}</string>
<key>PBXModuleWindowStatusBarHidden2</key>
<false/>
<key>RubberWindowFrame</key>
<string>242 153 763 593 0 0 1024 746 </string>
</dict>
</dict>
<dict>
<key>Content</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>95D1F82E0AB694EC00EE6AC8</string>
<key>PBXProjectModuleLabel</key>
<string>&lt;No Editor&gt;</string>
<key>PBXSplitModuleInNavigatorKey</key>
<dict/>
<key>StatusBarVisibility</key>
<true/>
</dict>
<key>Geometry</key>
<dict>
<key>Frame</key>
<string>{{0, 20}, {763, 552}}</string>
<key>PBXModuleWindowStatusBarHidden2</key>
<false/>
<key>RubberWindowFrame</key>
<string>15 148 763 593 0 0 1024 746 </string>
</dict>
</dict>
<dict>
<key>Content</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>95DFE83A0AD105A300375606</string>
<key>PBXProjectModuleLabel</key>
<string>&lt;No Editor&gt;</string>
<key>PBXSplitModuleInNavigatorKey</key>
<dict/>
<key>StatusBarVisibility</key>
<true/>
</dict>
<key>Geometry</key>
<dict>
<key>Frame</key>
<string>{{0, 20}, {763, 552}}</string>
<key>PBXModuleWindowStatusBarHidden2</key>
<false/>
<key>RubberWindowFrame</key>
<string>164 91 763 593 0 0 1024 746 </string>
</dict>
</dict>
<dict>
<key>Content</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>95E725400AD25B5700407A9B</string>
<key>PBXProjectModuleLabel</key>
<string>&lt;No Editor&gt;</string>
<key>PBXSplitModuleInNavigatorKey</key>
<dict/>
<key>StatusBarVisibility</key>
<true/>
</dict>
<key>Geometry</key>
<dict>
<key>Frame</key>
<string>{{0, 20}, {763, 552}}</string>
<key>PBXModuleWindowStatusBarHidden2</key>
<false/>
<key>RubberWindowFrame</key>
<string>164 91 763 593 0 0 1024 746 </string>
</dict>
</dict>
<dict>
<key>Content</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>95E725560AD25CA500407A9B</string>
<key>PBXProjectModuleLabel</key>
<string>&lt;No Editor&gt;</string>
<key>PBXSplitModuleInNavigatorKey</key>
<dict/>
<key>StatusBarVisibility</key>
<true/>
</dict>
<key>Geometry</key>
<dict>
<key>Frame</key>
<string>{{0, 20}, {763, 552}}</string>
<key>PBXModuleWindowStatusBarHidden2</key>
<false/>
<key>RubberWindowFrame</key>
<string>164 91 763 593 0 0 1024 746 </string>
</dict>
</dict>
<dict>
<key>Content</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>95E725270AD2587900407A9B</string>
<key>PBXProjectModuleLabel</key>
<string>&lt;No Editor&gt;</string>
<key>PBXSplitModuleInNavigatorKey</key>
<dict/>
<key>StatusBarVisibility</key>
<true/>
</dict>
<key>Geometry</key>
<dict>
<key>Frame</key>
<string>{{0, 20}, {763, 552}}</string>
<key>PBXModuleWindowStatusBarHidden2</key>
<false/>
<key>RubberWindowFrame</key>
<string>15 148 763 593 0 0 1024 746 </string>
</dict>
</dict>
<dict>
<key>Content</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>95E7B5000AD2CBD800753F9B</string>
<key>PBXProjectModuleLabel</key>
<string>&lt;No Editor&gt;</string>
<key>PBXSplitModuleInNavigatorKey</key>
<dict/>
<key>StatusBarVisibility</key>
<true/>
</dict>
<key>Geometry</key>
<dict>
<key>Frame</key>
<string>{{0, 20}, {763, 552}}</string>
<key>PBXModuleWindowStatusBarHidden2</key>
<false/>
<key>RubberWindowFrame</key>
<string>15 148 763 593 0 0 1024 746 </string>
</dict>
</dict>
<dict>
<key>Content</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>95E7B51C0AD2CDC800753F9B</string>
<key>PBXProjectModuleLabel</key>
<string>&lt;No Editor&gt;</string>
<key>PBXSplitModuleInNavigatorKey</key>
<dict/>
<key>StatusBarVisibility</key>
<true/>
</dict>
<key>Geometry</key>
<dict>
<key>Frame</key>
<string>{{0, 20}, {763, 552}}</string>
<key>PBXModuleWindowStatusBarHidden2</key>
<false/>
<key>RubberWindowFrame</key>
<string>171 132 763 593 0 0 1024 746 </string>
</dict>
</dict>
<dict>
<key>Content</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>95E7B5280AD2CE8800753F9B</string>
<key>PBXProjectModuleLabel</key>
<string>&lt;No Editor&gt;</string>
<key>PBXSplitModuleInNavigatorKey</key>
<dict/>
<key>StatusBarVisibility</key>
<true/>
</dict>
<key>Geometry</key>
<dict>
<key>Frame</key>
<string>{{0, 20}, {763, 552}}</string>
<key>PBXModuleWindowStatusBarHidden2</key>
<false/>
<key>RubberWindowFrame</key>
<string>171 132 763 593 0 0 1024 746 </string>
</dict>
</dict>
<dict>
<key>Content</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>95E7B54E0AD2D12A00753F9B</string>
<key>PBXProjectModuleLabel</key>
<string>&lt;No Editor&gt;</string>
<key>PBXSplitModuleInNavigatorKey</key>
<dict/>
<key>StatusBarVisibility</key>
<true/>
</dict>
<key>Geometry</key>
<dict>
<key>Frame</key>
<string>{{0, 20}, {763, 552}}</string>
<key>PBXModuleWindowStatusBarHidden2</key>
<false/>
<key>RubberWindowFrame</key>
<string>171 132 763 593 0 0 1024 746 </string>
</dict>
</dict>
<dict>
<key>Content</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>95E7B5510AD2D12A00753F9B</string>
<key>PBXProjectModuleLabel</key>
<string>&lt;No Editor&gt;</string>
<key>PBXSplitModuleInNavigatorKey</key>
@ -490,6 +648,8 @@
<key>Layout</key>
<array>
<dict>
<key>BecomeActive</key>
<true/>
<key>ContentConfiguration</key>
<dict>
<key>PBXBottomSmartGroupGIDs</key>
@ -535,7 +695,7 @@
<key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key>
<array>
<array>
<integer>9</integer>
<integer>4</integer>
<integer>1</integer>
<integer>0</integer>
</array>
@ -605,8 +765,6 @@
<string>0pt</string>
</dict>
<dict>
<key>BecomeActive</key>
<true/>
<key>ContentConfiguration</key>
<dict>
<key>PBXProjectModuleGUID</key>
@ -643,9 +801,9 @@
</array>
<key>TableOfContents</key>
<array>
<string>95DFE81B0AD0F18B00375606</string>
<string>95E7B4FB0AD2CBD800753F9B</string>
<string>1CE0B1FE06471DED0097A5F4</string>
<string>95DFE81C0AD0F18B00375606</string>
<string>95E7B4FC0AD2CBD800753F9B</string>
<string>1CE0B20306471E060097A5F4</string>
<string>1CE0B20506471E060097A5F4</string>
</array>
@ -779,24 +937,37 @@
<integer>5</integer>
<key>WindowOrderList</key>
<array>
<string>95DFE82C0AD0F29C00375606</string>
<string>95DFE82D0AD0F29C00375606</string>
<string>95DFE82E0AD0F29C00375606</string>
<string>95B042FC0ACE431A00236B52</string>
<string>95B042FB0ACE431A00236B52</string>
<string>95B042F70ACE431A00236B52</string>
<string>95B042FA0ACE431A00236B52</string>
<string>95D1F8310AB694EC00EE6AC8</string>
<string>95D1F8660AB6970400EE6AC8</string>
<string>95D1F8850AB69B6700EE6AC8</string>
<string>95D1F8130AB6908400EE6AC8</string>
<string>95D1F7FE0AB68C8C00EE6AC8</string>
<string>95D1F82E0AB694EC00EE6AC8</string>
<string>1CD10A99069EF8BA00B06720</string>
<string>95E7B5B20AD2DA4F00753F9B</string>
<string>95E7B5A10AD2D8EE00753F9B</string>
<string>95E7B5A20AD2D8EE00753F9B</string>
<string>95E7B56A0AD2D24400753F9B</string>
<string>95E7B5510AD2D12A00753F9B</string>
<string>95E7B54E0AD2D12A00753F9B</string>
<string>1C530D57069F1CE1000CFCEE</string>
<string>95E7B5280AD2CE8800753F9B</string>
<string>95E7B51C0AD2CDC800753F9B</string>
<string>95E7B5100AD2CC9400753F9B</string>
<string>95E7B5110AD2CC9400753F9B</string>
<string>95E7B5120AD2CC9400753F9B</string>
<string>95D7BFC80AA6C1A500D5E02C</string>
<string>/Development/Vocalese/Vocalese.xcodeproj</string>
<string>95DFE83A0AD105A300375606</string>
<string>95D7BFC00AA6C1A500D5E02C</string>
<string>95E7B5000AD2CBD800753F9B</string>
<string>1CD10A99069EF8BA00B06720</string>
<string>95E725270AD2587900407A9B</string>
<string>95E725560AD25CA500407A9B</string>
<string>95E725400AD25B5700407A9B</string>
<string>95DFE83A0AD105A300375606</string>
<string>95D1F82E0AB694EC00EE6AC8</string>
<string>95D1F7FE0AB68C8C00EE6AC8</string>
<string>95D1F8130AB6908400EE6AC8</string>
<string>95D1F8850AB69B6700EE6AC8</string>
<string>95D1F8660AB6970400EE6AC8</string>
<string>95D1F8310AB694EC00EE6AC8</string>
<string>95B042FA0ACE431A00236B52</string>
<string>95B042F70ACE431A00236B52</string>
<string>95B042FB0ACE431A00236B52</string>
<string>95B042FC0ACE431A00236B52</string>
<string>/Development/Vocalese/Vocalese.xcodeproj</string>
</array>
<key>WindowString</key>
<string>167 326 690 397 0 0 1024 746 </string>
@ -815,12 +986,14 @@
<key>Dock</key>
<array>
<dict>
<key>BecomeActive</key>
<true/>
<key>ContentConfiguration</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>1CD0528F0623707200166675</string>
<key>PBXProjectModuleLabel</key>
<string>VLSheetView.mm</string>
<string>VLSheetViewChords.mm</string>
<key>StatusBarVisibility</key>
<true/>
</dict>
@ -837,8 +1010,6 @@
<string>293pt</string>
</dict>
<dict>
<key>BecomeActive</key>
<true/>
<key>ContentConfiguration</key>
<dict>
<key>PBXProjectModuleGUID</key>
@ -878,7 +1049,7 @@
<key>TableOfContents</key>
<array>
<string>95D7BFC00AA6C1A500D5E02C</string>
<string>95DFE81D0AD0F18B00375606</string>
<string>95E7B5010AD2CBD800753F9B</string>
<string>1CD0528F0623707200166675</string>
<string>XCMainBuildResultsModuleGUID</string>
</array>
@ -889,7 +1060,7 @@
<key>WindowToolGUID</key>
<string>95D7BFC00AA6C1A500D5E02C</string>
<key>WindowToolIsVisible</key>
<true/>
<false/>
</dict>
<dict>
<key>FirstTimeWindowDisplayed</key>
@ -920,8 +1091,8 @@
<string>yes</string>
<key>sizes</key>
<array>
<string>{{0, 0}, {308, 203}}</string>
<string>{{308, 0}, {386, 203}}</string>
<string>{{0, 0}, {412, 239}}</string>
<string>{{412, 0}, {516, 239}}</string>
</array>
</dict>
<key>VerticalSplitView</key>
@ -936,8 +1107,8 @@
<string>yes</string>
<key>sizes</key>
<array>
<string>{{0, 0}, {694, 203}}</string>
<string>{{0, 203}, {694, 178}}</string>
<string>{{0, 0}, {928, 239}}</string>
<string>{{0, 239}, {928, 210}}</string>
</array>
</dict>
</dict>
@ -957,7 +1128,7 @@
<key>DebugSTDIOWindowFrame</key>
<string>{{200, 200}, {500, 300}}</string>
<key>Frame</key>
<string>{{0, 0}, {694, 381}}</string>
<string>{{0, 0}, {928, 449}}</string>
<key>PBXDebugSessionStackFrameViewKey</key>
<dict>
<key>DebugVariablesTableConfiguration</key>
@ -967,24 +1138,24 @@
<string>Value</string>
<real>85</real>
<string>Summary</string>
<real>156</real>
<real>286</real>
</array>
<key>Frame</key>
<string>{{308, 0}, {386, 203}}</string>
<string>{{412, 0}, {516, 239}}</string>
<key>RubberWindowFrame</key>
<string>254 208 694 422 0 0 1024 746 </string>
<string>56 117 928 490 0 0 1024 746 </string>
</dict>
<key>RubberWindowFrame</key>
<string>254 208 694 422 0 0 1024 746 </string>
<string>56 117 928 490 0 0 1024 746 </string>
</dict>
<key>Module</key>
<string>PBXDebugSessionModule</string>
<key>Proportion</key>
<string>381pt</string>
<string>449pt</string>
</dict>
</array>
<key>Proportion</key>
<string>381pt</string>
<string>449pt</string>
</dict>
</array>
<key>Name</key>
@ -998,26 +1169,30 @@
<key>TableOfContents</key>
<array>
<string>1CD10A99069EF8BA00B06720</string>
<string>95DFE81E0AD0F18B00375606</string>
<string>95E7B5020AD2CBD800753F9B</string>
<string>1C162984064C10D400B95A72</string>
<string>95DFE81F0AD0F18B00375606</string>
<string>95DFE8200AD0F18B00375606</string>
<string>95DFE8210AD0F18B00375606</string>
<string>95DFE8220AD0F18B00375606</string>
<string>95DFE8230AD0F18B00375606</string>
<string>95E7B5030AD2CBD800753F9B</string>
<string>95E7B5040AD2CBD800753F9B</string>
<string>95E7B5050AD2CBD800753F9B</string>
<string>95E7B5060AD2CBD800753F9B</string>
<string>95E7B5070AD2CBD800753F9B</string>
</array>
<key>ToolbarConfiguration</key>
<string>xcode.toolbar.config.debugV3</string>
<key>WindowString</key>
<string>254 208 694 422 0 0 1024 746 </string>
<string>56 117 928 490 0 0 1024 746 </string>
<key>WindowToolGUID</key>
<string>1CD10A99069EF8BA00B06720</string>
<key>WindowToolIsVisible</key>
<true/>
</dict>
<dict>
<key>FirstTimeWindowDisplayed</key>
<false/>
<key>Identifier</key>
<string>windowTool.find</string>
<key>IsVertical</key>
<true/>
<key>Layout</key>
<array>
<dict>
@ -1032,26 +1207,16 @@
<key>PBXProjectModuleGUID</key>
<string>1CDD528C0622207200134675</string>
<key>PBXProjectModuleLabel</key>
<string>&lt;No Editor&gt;</string>
<key>PBXSplitModuleInNavigatorKey</key>
<dict>
<key>Split0</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>1CD0528D0623707200166675</string>
</dict>
<key>SplitCount</key>
<string>1</string>
</dict>
<string></string>
<key>StatusBarVisibility</key>
<integer>1</integer>
<true/>
</dict>
<key>GeometryConfiguration</key>
<dict>
<key>Frame</key>
<string>{{0, 0}, {781, 167}}</string>
<string>{{0, 0}, {781, 212}}</string>
<key>RubberWindowFrame</key>
<string>62 385 781 470 0 0 1440 878 </string>
<string>185 191 781 470 0 0 1024 746 </string>
</dict>
<key>Module</key>
<string>PBXNavigatorGroup</string>
@ -1060,11 +1225,9 @@
</dict>
</array>
<key>Proportion</key>
<string>50%</string>
<string>212pt</string>
</dict>
<dict>
<key>BecomeActive</key>
<integer>1</integer>
<key>ContentConfiguration</key>
<dict>
<key>PBXProjectModuleGUID</key>
@ -1075,18 +1238,18 @@
<key>GeometryConfiguration</key>
<dict>
<key>Frame</key>
<string>{{8, 0}, {773, 254}}</string>
<string>{{0, 217}, {781, 212}}</string>
<key>RubberWindowFrame</key>
<string>62 385 781 470 0 0 1440 878 </string>
<string>185 191 781 470 0 0 1024 746 </string>
</dict>
<key>Module</key>
<string>PBXProjectFindModule</string>
<key>Proportion</key>
<string>50%</string>
<string>212pt</string>
</dict>
</array>
<key>Proportion</key>
<string>428pt</string>
<string>429pt</string>
</dict>
</array>
<key>Name</key>
@ -1096,23 +1259,21 @@
<string>PBXProjectFindModule</string>
</array>
<key>StatusbarIsVisible</key>
<integer>1</integer>
<true/>
<key>TableOfContents</key>
<array>
<string>1C530D57069F1CE1000CFCEE</string>
<string>1C530D58069F1CE1000CFCEE</string>
<string>1C530D59069F1CE1000CFCEE</string>
<string>95E7B5410AD2D02200753F9B</string>
<string>95E7B5420AD2D02200753F9B</string>
<string>1CDD528C0622207200134675</string>
<string>1C530D5A069F1CE1000CFCEE</string>
<string>1CE0B1FE06471DED0097A5F4</string>
<string>1CD0528E0623707200166675</string>
</array>
<key>WindowString</key>
<string>62 385 781 470 0 0 1440 878 </string>
<string>185 191 781 470 0 0 1024 746 </string>
<key>WindowToolGUID</key>
<string>1C530D57069F1CE1000CFCEE</string>
<key>WindowToolIsVisible</key>
<integer>0</integer>
<false/>
</dict>
<dict>
<key>Identifier</key>
@ -1168,7 +1329,7 @@
<key>TableOfContents</key>
<array>
<string>95D7BFC80AA6C1A500D5E02C</string>
<string>95DFE82B0AD0F29400375606</string>
<string>95E7B50E0AD2CC9400753F9B</string>
<string>1C78EAAC065D492600B07095</string>
</array>
<key>WindowString</key>
@ -1351,18 +1512,18 @@
<string>743 379 452 308 0 0 1280 1002 </string>
</dict>
<dict>
<key>FirstTimeWindowDisplayed</key>
<false/>
<key>Identifier</key>
<string>windowTool.breakpoints</string>
<key>IsVertical</key>
<integer>0</integer>
<false/>
<key>Layout</key>
<array>
<dict>
<key>Dock</key>
<array>
<dict>
<key>BecomeActive</key>
<integer>1</integer>
<key>ContentConfiguration</key>
<dict>
<key>PBXBottomSmartGroupGIDs</key>
@ -1404,7 +1565,7 @@
<key>PBXTopSmartGroupGIDs</key>
<array/>
<key>XCIncludePerspectivesSwitch</key>
<integer>0</integer>
<false/>
</dict>
<key>GeometryConfiguration</key>
<dict>
@ -1416,7 +1577,7 @@
<real>168</real>
</array>
<key>RubberWindowFrame</key>
<string>315 424 744 409 0 0 1440 878 </string>
<string>117 147 744 409 0 0 1024 746 </string>
</dict>
<key>Module</key>
<string>PBXSmartGroupTreeModule</string>
@ -1424,6 +1585,8 @@
<string>185pt</string>
</dict>
<dict>
<key>BecomeActive</key>
<true/>
<key>ContentConfiguration</key>
<dict>
<key>PBXProjectModuleGUID</key>
@ -1436,7 +1599,7 @@
<key>Frame</key>
<string>{{190, 0}, {554, 368}}</string>
<key>RubberWindowFrame</key>
<string>315 424 744 409 0 0 1440 878 </string>
<string>117 147 744 409 0 0 1024 746 </string>
</dict>
<key>Module</key>
<string>XCDetailModule</string>
@ -1460,22 +1623,22 @@
<string>XCDetailModule</string>
</array>
<key>StatusbarIsVisible</key>
<integer>1</integer>
<true/>
<key>TableOfContents</key>
<array>
<string>1CDDB66807F98D9800BB5817</string>
<string>1CDDB66907F98D9800BB5817</string>
<string>95E7B56A0AD2D24400753F9B</string>
<string>95E7B56B0AD2D24400753F9B</string>
<string>1CE0B1FE06471DED0097A5F4</string>
<string>1CA1AED706398EBD00589147</string>
</array>
<key>ToolbarConfiguration</key>
<string>xcode.toolbar.config.breakpointsV3</string>
<key>WindowString</key>
<string>315 424 744 409 0 0 1440 878 </string>
<string>117 147 744 409 0 0 1024 746 </string>
<key>WindowToolGUID</key>
<string>1CDDB66807F98D9800BB5817</string>
<string>95E7B56A0AD2D24400753F9B</string>
<key>WindowToolIsVisible</key>
<integer>1</integer>
<true/>
</dict>
<dict>
<key>Identifier</key>

File diff suppressed because it is too large Load Diff