Switch to multi-line layout

This commit is contained in:
Matthias Neeracher 2006-10-02 05:29:37 +00:00
parent 7daabcb8b0
commit 925f3d1b28
11 changed files with 406 additions and 432 deletions

View File

@ -3,14 +3,14 @@
<plist version="1.0">
<dict>
<key>IBDocumentLocation</key>
<string>44 14 356 240 0 0 1024 746 </string>
<string>36 103 356 240 0 0 1024 746 </string>
<key>IBFramework Version</key>
<string>451.0</string>
<string>452.0</string>
<key>IBOpenObjects</key>
<array>
<integer>5</integer>
</array>
<key>IBSystem Version</key>
<string>9A255</string>
<string>9A274</string>
</dict>
</plist>

Binary file not shown.

View File

@ -354,13 +354,13 @@ VLSong::VLSong()
VLProperties defaultProperties = {fourFour, 0, 1, 3};
fProperties.push_back(defaultProperties);
fMeasures.resize(33); // Leadin, AABA
fMeasures.resize(32); // Leadin, AABA
VLNote rest = VLRest(1);
VLChord rchord;
rchord.fDuration = 1;
for (int i=0; i<33; ++i) {
for (int i=0; i<32; ++i) {
fMeasures[i].fProperties = &fProperties.front();
fMeasures[i].fChords.push_back(rchord);
fMeasures[i].fMelody.push_back(rest);

View File

@ -212,6 +212,8 @@ struct VLSong {
void AddNote(VLNote note, size_t measure, VLFraction at);
void DelChord(size_t measure, VLFraction at);
void DelNote(size_t measure, VLFraction at);
size_t CountMeasures() const { return fMeasures.size(); }
};
// Local Variables:

View File

@ -38,12 +38,15 @@ enum VLMusicElement {
BOOL showFieldEditor;
float clefKeyW;
float measureW;
float lineH;
int groups;
int quarterBeats;
int divPerGroup;
int firstMeasure;
int lastMeasure;
int visibleMeasures;
int measuresPerSystem;
int numSystems;
float displayScale;
NSImageRep * noteCursorCache;
NSPoint noteCursorLocation;
NSPoint lastNoteCenter;
@ -70,6 +73,7 @@ enum VLMusicElement {
- (VLSong *) song;
- (NSImage *) musicElement:(VLMusicElement)elt;
- (float) systemY:(int)system;
- (float) noteYWithPitch:(int)pitch;
- (float) noteXInMeasure:(int)measure at:(VLFraction)at;

View File

@ -40,23 +40,23 @@ static NSString * sElementNames[kMusicElements] = {
};
static float sSharpPos[] = {
kLineY+4.0f*kLineH, // F#
kLineY+2.5f*kLineH, // C#
kLineY+4.5f*kLineH, // G#
kLineY+3.0f*kLineH, // D#
kLineY+1.5f*kLineH, // A#
kLineY+3.5f*kLineH, // E#
kLineY+2.0f*kLineH, // B#
4.0f*kLineH, // F#
2.5f*kLineH, // C#
4.5f*kLineH, // G#
3.0f*kLineH, // D#
1.5f*kLineH, // A#
3.5f*kLineH, // E#
2.0f*kLineH, // B#
};
static float sFlatPos[] = {
kLineY+2.0f*kLineH, // Bb
kLineY+3.5f*kLineH, // Eb
kLineY+1.5f*kLineH, // Ab
kLineY+3.0f*kLineH, // Db
kLineY+1.0f*kLineH, // Gb
kLineY+2.5f*kLineH, // Cb
kLineY+0.5f*kLineH, // Fb
2.0f*kLineH, // Bb
3.5f*kLineH, // Eb
1.5f*kLineH, // Ab
3.0f*kLineH, // Db
1.0f*kLineH, // Gb
2.5f*kLineH, // Cb
0.5f*kLineH, // Fb
};
- (id)initWithFrame:(NSRect)frame
@ -80,6 +80,7 @@ static float sFlatPos[] = {
}
needsRecalc = YES;
showFieldEditor = NO;
displayScale = 1.0f;
firstMeasure = 0;
noteRectTracker = 0;
noteCursorCache = nil;
@ -103,13 +104,20 @@ static float sFlatPos[] = {
return sMusic[elt];
}
- (float) systemY:(int)system
{
NSRect b = [self bounds];
return kSystemY+b.origin.y+b.size.height-(system+1)*kSystemH;
}
- (float) noteYWithPitch:(int)pitch
{
int semi = pitch % 12;
int octave = (pitch / 12) - 5;
bool useSharps = [self song]->fProperties.front().fKey >= 0;
float y = kLineY+octave*3.5f*kLineH;
float y = octave*3.5f*kLineH;
float sharp = useSharps ? 0.0f : 0.5f*kLineH;
switch (semi) {
@ -156,6 +164,10 @@ static float sFlatPos[] = {
{
needsRecalc = NO;
NSSize contentSz = [[self enclosingScrollView] contentSize];
contentSz.width /= displayScale;
contentSz.height/= displayScale;
const VLSong * song = [self song];
const VLProperties & prop = song->fProperties.front();
@ -164,18 +176,12 @@ static float sFlatPos[] = {
divPerGroup = prop.fDivisions * (quarterBeats / groups);
clefKeyW = kClefX+kClefW+(std::labs(prop.fKey)+1)*kKeyW;
measureW = groups*(divPerGroup+1)*kNoteW;
visibleMeasures = (int)std::floor(([self bounds].size.width - clefKeyW)
/ measureW);
[self setValue:
[NSNumber numberWithInt:
std::max((int)song->fMeasures.size()-visibleMeasures, 0)]
forKey: @"lastMeasure"];
if (firstMeasure > lastMeasure)
[self setValue: [NSNumber numberWithInt:lastMeasure]
forKey: @"firstMeasure"];
[self setupChords];
measuresPerSystem =
(int)std::floor((contentSz.width - clefKeyW) / measureW);
numSystems = (song->CountMeasures()+measuresPerSystem-1)/measuresPerSystem;
contentSz.height = numSystems*kSystemH;
#if 0
noteRect = NSMakeRect(clefKeyW, kLineY-kMaxLedgers*kLineH,
visibleMeasures*measureW,
(4.0f+2.0f*kMaxLedgers)*kLineH);
@ -188,11 +194,27 @@ static float sFlatPos[] = {
noteRectTracker = [self addTrackingRect:noteRect owner:self
userData:nil assumeInside:inNoteRect];
[[self window] setAcceptsMouseMovedEvents:inNoteRect];
#endif
[[self window] makeFirstResponder:self];
NSSize frameSz = {contentSz.width * displayScale, contentSz.height * displayScale};
[self setFrameSize:frameSz];
[self setBoundsSize:contentSz];
[self setNeedsDisplay:YES];
}
- (void)drawRect:(NSRect)rect
{
static NSDictionary * sMeasNoFont = nil;
if (!sMeasNoFont)
sMeasNoFont =
[[NSDictionary alloc] initWithObjectsAndKeys:
[NSFont fontWithName: @"Helvetica" size: 10],
NSFontAttributeName,
nil];
const VLSong * song = [self song];
const VLProperties & prop = song->fProperties.front();
@ -204,12 +226,15 @@ static float sFlatPos[] = {
[bz setLineWidth:0.0];
if (needsRecalc)
[self recalculateDimensions];
for (int line = 0; line<5; ++line) {
const float x0 = kLineX;
const float xx = x0 + clefKeyW + visibleMeasures*measureW;
const float y = kLineY+line*kLineH;
[bz moveToPoint: NSMakePoint(x0, y)];
[bz lineToPoint: NSMakePoint(xx, y)];
for (int system = 0; system<numSystems; ++system) {
float kLineY = [self systemY:system];
for (int line = 0; line<5; ++line) {
const float x0 = kLineX;
const float xx = x0 + clefKeyW + measuresPerSystem*measureW;
const float y = kLineY+line*kLineH;
[bz moveToPoint: NSMakePoint(x0, y)];
[bz lineToPoint: NSMakePoint(xx, y)];
}
}
[bz stroke];
[bz removeAllPoints];
@ -217,11 +242,14 @@ static float sFlatPos[] = {
// Draw measure lines
//
[bz setLineWidth:2.0];
for (int measure = 0; measure<=visibleMeasures; ++measure) {
const float x = clefKeyW+measure*measureW;
const float yy = kLineY+4.0f*kLineH;
[bz moveToPoint: NSMakePoint(x, kLineY)];
[bz lineToPoint: NSMakePoint(x, yy)];
for (int system = 0; system<numSystems; ++system) {
float kLineY = [self systemY:system];
for (int measure = 0; measure<=measuresPerSystem; ++measure) {
const float x = clefKeyW+measure*measureW;
const float yy = kLineY+4.0f*kLineH;
[bz moveToPoint: NSMakePoint(x, kLineY)];
[bz lineToPoint: NSMakePoint(x, yy)];
}
}
[bz stroke];
[bz removeAllPoints];
@ -231,44 +259,56 @@ static float sFlatPos[] = {
//
[bz setLineWidth:0.0];
[[NSColor colorWithDeviceWhite:0.8f alpha:1.0f] set];
for (int measure = 0; measure<visibleMeasures; ++measure) {
const float mx = clefKeyW+measure*measureW;
const float y0 = kLineY-2.0f*kLineH;
const float yy = kLineY+6.0f*kLineH;
for (int group = 0; group < groups; ++group) {
for (int div = 0; div < divPerGroup; ++div) {
const float x = mx+(group*(divPerGroup+1)+div+1)*kNoteW;
[bz moveToPoint: NSMakePoint(x, y0)];
[bz lineToPoint: NSMakePoint(x, yy)];
for (int system = 0; system<numSystems; ++system) {
float kLineY = [self systemY:system];
for (int measure = 0; measure<measuresPerSystem; ++measure) {
const float mx = clefKeyW+measure*measureW;
const float y0 = kLineY-2.0f*kLineH;
const float yy = kLineY+6.0f*kLineH;
for (int group = 0; group < groups; ++group) {
for (int div = 0; div < divPerGroup; ++div) {
const float x = mx+(group*(divPerGroup+1)+div+1)*kNoteW;
[bz moveToPoint: NSMakePoint(x, y0)];
[bz lineToPoint: NSMakePoint(x, yy)];
}
}
}
}
[bz stroke];
//
// Draw clef
//
[[self musicElement:kMusicGClef]
compositeToPoint:NSMakePoint(kClefX, kClefY)
operation: NSCompositeSourceOver];
//
// Draw key (sharps & flats)
//
if (prop.fKey > 0) {
float x = kClefX+kClefW;
for (int i=0; i<prop.fKey; ++i) {
[[self musicElement:kMusicSharp] compositeToPoint:
NSMakePoint(x, sSharpPos[i]+kSharpY)
operation: NSCompositeSourceOver];
x += kAccW;
}
} else if (prop.fKey < 0) {
float x = kClefX+kClefW;
for (int i=0; -i>prop.fKey; ++i) {
[[self musicElement: kMusicFlat] compositeToPoint:
NSMakePoint(x, sFlatPos[i]+kFlatY)
operation: NSCompositeSourceOver];
x += kAccW;
for (int system = 0; system<numSystems; ++system) {
float kLineY = [self systemY:system];
//
// Draw clef
//
[[self musicElement:kMusicGClef]
compositeToPoint: NSMakePoint(kClefX, kLineY+kClefY)
operation: NSCompositeSourceOver];
//
// Draw measure #
//
[[NSString stringWithFormat:@"%d", system*measuresPerSystem+1]
drawAtPoint: NSMakePoint(kMeasNoX, kLineY+kMeasNoY)
withAttributes: sMeasNoFont];
//
// Draw key (sharps & flats)
//
if (prop.fKey > 0) {
float x = kClefX+kClefW;
for (int i=0; i<prop.fKey; ++i) {
[[self musicElement:kMusicSharp]
compositeToPoint: NSMakePoint(x, kLineY+sSharpPos[i]+kSharpY)
operation: NSCompositeSourceOver];
x += kAccW;
}
} else if (prop.fKey < 0) {
float x = kClefX+kClefW;
for (int i=0; -i>prop.fKey; ++i) {
[[self musicElement: kMusicFlat]
compositeToPoint: NSMakePoint(x, kLineY+sFlatPos[i]+kFlatY)
operation: NSCompositeSourceOver];
x += kAccW;
}
}
}

View File

@ -68,6 +68,7 @@
- (void) setupChords
{
#if 0
const VLSong * song = [self song];
const VLProperties & prop = song->fProperties.front();
NSView * chordView = [chords contentView];
@ -110,6 +111,7 @@
}
}
[chords setNeedsDisplay: YES];
#endif
}
- (IBAction) editChord:(id)sender

View File

@ -7,11 +7,14 @@
//
const float kLineX = 5;
const float kLineY = 90.5;
const float kLineH = 10;
const float kSystemH = 15.0f*kLineH;
const float kSystemY = 3.0f*kLineH;
const float kClefX = 20.5f;
const float kClefY = 75.0f;
const float kClefY =-15.0f;
const float kClefW = 30.0f;
const float kMeasNoX = 10.0f;
const float kMeasNoY = 4.5f*kLineH;
const float kNoteW = 12.0f;
const float kKeyW = 10.0f;
const float kAccW = 10.0f;

View File

@ -253,56 +253,61 @@ static int sSemiToPitch[] = {
VLFraction swung(3, prop.fDivisions*8, true); // Which notes to swing
VLFraction swingGrid(2*swung); // Alignment of swing notes
for (int m = 0; m<visibleMeasures; ++m) {
int measIdx = m+firstMeasure;
const VLMeasure measure = song->fMeasures[measIdx];
const VLNoteList & melody = measure.fMelody;
VLFraction at(0);
for (VLNoteList::const_iterator note = melody.begin();
note != melody.end();
++note
) {
VLFraction dur = note->fDuration;
BOOL first = !m || !note->fTied;
int pitch = note->fPitch;
while (dur > 0) {
VLFraction partialDur; // Actual value of note drawn
measure.fProperties->PartialNote(at, dur, &partialDur);
for (int system = 0; system<numSystems; ++system) {
float kLineY = [self systemY:system];
for (int m = 0; m<measuresPerSystem; ++m) {
int measIdx = m+system*measuresPerSystem;
if (measIdx >= song->CountMeasures())
break;
const VLMeasure measure = song->fMeasures[measIdx];
const VLNoteList & melody = measure.fMelody;
VLFraction at(0);
for (VLNoteList::const_iterator note = melody.begin();
note != melody.end();
++note
) {
VLFraction dur = note->fDuration;
BOOL first = !m || !note->fTied;
int pitch = note->fPitch;
while (dur > 0) {
VLFraction partialDur; // Actual value of note drawn
measure.fProperties->PartialNote(at, dur, &partialDur);
BOOL triplet = !(partialDur.fDenom % 3);
VLFraction noteDur(1); // Visual value of note
BOOL triplet = !(partialDur.fDenom % 3);
VLFraction noteDur(1); // Visual value of note
if (triplet) {
if (swing) { // Swing 8ths / 16ths are written as straight 8ths
if (partialDur == 4*swung/3 && (at % swingGrid) == 0) {
noteDur = swung;
triplet = NO;
} else if (partialDur == 2*swung/3 && ((at+partialDur) % swingGrid) == 0) {
noteDur = swung;
triplet = NO;
if (triplet) {
if (swing) { // Swing 8ths / 16ths are written as straight 8ths
if (partialDur == 4*swung/3 && (at % swingGrid) == 0) {
noteDur = swung;
triplet = NO;
} else if (partialDur == 2*swung/3 && ((at+partialDur) % swingGrid) == 0) {
noteDur = swung;
triplet = NO;
} else {
noteDur = 4*partialDur/3;
}
} else {
noteDur = 4*partialDur/3;
}
} else {
noteDur = 4*partialDur/3;
noteDur = partialDur;
}
} else {
noteDur = partialDur;
if (pitch != VLNote::kNoPitch)
[self drawNote:noteDur
at: NSMakePoint(
[self noteXInMeasure:m at:at],
kLineY+[self noteYWithPitch:pitch])
tied:!first];
else
[self drawRest:noteDur
at: NSMakePoint(
[self noteXInMeasure:m at:at],
kLineY+[self noteYWithPitch:65])];
dur -= partialDur;
at += partialDur;
first = NO;
}
if (pitch != VLNote::kNoPitch)
[self drawNote:noteDur
at: NSMakePoint(
[self noteXInMeasure:measIdx at:at],
[self noteYWithPitch:pitch])
tied:!first];
else
[self drawRest:noteDur
at: NSMakePoint(
[self noteXInMeasure:measIdx at:at],
[self noteYWithPitch:65])];
dur -= partialDur;
at += partialDur;
first = NO;
}
}
}

View File

@ -196,120 +196,15 @@
<array/>
<key>OpenEditors</key>
<array>
<dict>
<key>Content</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>95D1F8310AB694EC00EE6AC8</string>
<key>PBXProjectModuleLabel</key>
<string>VLSheetView.mm</string>
<key>PBXSplitModuleInNavigatorKey</key>
<dict>
<key>Split0</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>95D1F8320AB694EC00EE6AC8</string>
<key>PBXProjectModuleLabel</key>
<string>VLSheetView.mm</string>
<key>_historyCapacity</key>
<integer>0</integer>
<key>bookmark</key>
<string>95D1F8BD0AB69F2F00EE6AC8</string>
<key>history</key>
<array>
<string>95D1F82B0AB693AE00EE6AC8</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>95D1F8130AB6908400EE6AC8</string>
<key>PBXProjectModuleLabel</key>
<string>VLSheetViewChords.h</string>
<key>PBXSplitModuleInNavigatorKey</key>
<dict>
<key>Split0</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>95D1F8140AB6908400EE6AC8</string>
<key>PBXProjectModuleLabel</key>
<string>VLSheetViewChords.h</string>
<key>_historyCapacity</key>
<integer>0</integer>
<key>bookmark</key>
<string>95D1F8BE0AB69F2F00EE6AC8</string>
<key>history</key>
<array>
<string>95D1F86A0AB6970400EE6AC8</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>186 75 763 593 0 0 1024 746 </string>
</dict>
</dict>
<dict>
<key>Content</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>95D1F82E0AB694EC00EE6AC8</string>
<key>PBXProjectModuleLabel</key>
<string>VLSheetView.mm</string>
<string>&lt;No Editor&gt;</string>
<key>PBXSplitModuleInNavigatorKey</key>
<dict>
<key>Split0</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>95D1F82F0AB694EC00EE6AC8</string>
<key>PBXProjectModuleLabel</key>
<string>VLSheetView.mm</string>
<key>_historyCapacity</key>
<integer>0</integer>
<key>bookmark</key>
<string>95D1F8BF0AB69F2F00EE6AC8</string>
<key>history</key>
<array>
<string>95D1F8530AB6967E00EE6AC8</string>
<string>95D1F8540AB6967E00EE6AC8</string>
</array>
<key>prevStack</key>
<array>
<string>95D1F84C0AB6960700EE6AC8</string>
<string>95D1F8550AB6967E00EE6AC8</string>
<string>95D1F8560AB6967E00EE6AC8</string>
</array>
</dict>
<key>SplitCount</key>
<string>1</string>
</dict>
<dict/>
<key>StatusBarVisibility</key>
<true/>
</dict>
@ -329,27 +224,9 @@
<key>PBXProjectModuleGUID</key>
<string>95D1F7FE0AB68C8C00EE6AC8</string>
<key>PBXProjectModuleLabel</key>
<string>VLSheetView.h</string>
<string>&lt;No Editor&gt;</string>
<key>PBXSplitModuleInNavigatorKey</key>
<dict>
<key>Split0</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>95D1F7FF0AB68C8C00EE6AC8</string>
<key>PBXProjectModuleLabel</key>
<string>VLSheetView.h</string>
<key>_historyCapacity</key>
<integer>0</integer>
<key>bookmark</key>
<string>95D1F8C00AB69F2F00EE6AC8</string>
<key>history</key>
<array>
<string>95D1F80B0AB68D3B00EE6AC8</string>
</array>
</dict>
<key>SplitCount</key>
<string>1</string>
</dict>
<dict/>
<key>StatusBarVisibility</key>
<true/>
</dict>
@ -363,6 +240,50 @@
<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>
@ -389,7 +310,7 @@
<key>Content</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>95D1F8850AB69B6700EE6AC8</string>
<string>95D1F8310AB694EC00EE6AC8</string>
<key>PBXProjectModuleLabel</key>
<string>&lt;No Editor&gt;</string>
<key>PBXSplitModuleInNavigatorKey</key>
@ -404,7 +325,95 @@
<key>PBXModuleWindowStatusBarHidden2</key>
<false/>
<key>RubberWindowFrame</key>
<string>168 116 763 593 0 0 1024 746 </string>
<string>164 91 763 593 0 0 1024 746 </string>
</dict>
</dict>
<dict>
<key>Content</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>95B042FA0ACE431A00236B52</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>95B042F70ACE431A00236B52</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>95B042FB0ACE431A00236B52</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>95B042FC0ACE431A00236B52</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>
</array>
@ -488,13 +497,13 @@
<key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key>
<array>
<array>
<integer>6</integer>
<integer>10</integer>
<integer>1</integer>
<integer>0</integer>
</array>
</array>
<key>PBXSmartGroupTreeModuleOutlineStateVisibleRectKey</key>
<string>{{0, 5}, {186, 338}}</string>
<string>{{0, 0}, {186, 338}}</string>
</dict>
<key>PBXTopSmartGroupGIDs</key>
<array/>
@ -513,7 +522,7 @@
<real>186</real>
</array>
<key>RubberWindowFrame</key>
<string>167 327 690 397 0 0 1024 746 </string>
<string>167 326 690 397 0 0 1024 746 </string>
</dict>
<key>Module</key>
<string>PBXSmartGroupTreeModule</string>
@ -550,7 +559,7 @@
<key>Frame</key>
<string>{{0, 0}, {482, 0}}</string>
<key>RubberWindowFrame</key>
<string>167 327 690 397 0 0 1024 746 </string>
<string>167 326 690 397 0 0 1024 746 </string>
</dict>
<key>Module</key>
<string>PBXNavigatorGroup</string>
@ -570,7 +579,7 @@
<key>Frame</key>
<string>{{0, 5}, {482, 351}}</string>
<key>RubberWindowFrame</key>
<string>167 327 690 397 0 0 1024 746 </string>
<string>167 326 690 397 0 0 1024 746 </string>
</dict>
<key>Module</key>
<string>XCDetailModule</string>
@ -594,9 +603,9 @@
</array>
<key>TableOfContents</key>
<array>
<string>95D1F7F00AB6821400EE6AC8</string>
<string>95B042DA0ACE37CB00236B52</string>
<string>1CE0B1FE06471DED0097A5F4</string>
<string>95D1F7F10AB6821400EE6AC8</string>
<string>95B042DB0ACE37CB00236B52</string>
<string>1CE0B20306471E060097A5F4</string>
<string>1CE0B20506471E060097A5F4</string>
</array>
@ -730,22 +739,27 @@
<integer>5</integer>
<key>WindowOrderList</key>
<array>
<string>95D1F8850AB69B6700EE6AC8</string>
<string>95D1F8660AB6970400EE6AC8</string>
<string>95D1F8240AB6930D00EE6AC8</string>
<string>95D1F8250AB6930D00EE6AC8</string>
<string>95D1F8260AB6930D00EE6AC8</string>
<string>95B043090ACE46F000236B52</string>
<string>95B042FC0ACE431A00236B52</string>
<string>95B042FB0ACE431A00236B52</string>
<string>95B042F70ACE431A00236B52</string>
<string>95B042FA0ACE431A00236B52</string>
<string>95B042E40ACE37CB00236B52</string>
<string>95B042E50ACE37CB00236B52</string>
<string>95B042E60ACE37CB00236B52</string>
<string>95D7BFC80AA6C1A500D5E02C</string>
<string>95D7BFC00AA6C1A500D5E02C</string>
<string>1CD10A99069EF8BA00B06720</string>
<string>95D1F8310AB694EC00EE6AC8</string>
<string>95D1F8660AB6970400EE6AC8</string>
<string>95D1F8850AB69B6700EE6AC8</string>
<string>95D1F8130AB6908400EE6AC8</string>
<string>95D1F7FE0AB68C8C00EE6AC8</string>
<string>95D1F82E0AB694EC00EE6AC8</string>
<string>95D1F8130AB6908400EE6AC8</string>
<string>95D1F8310AB694EC00EE6AC8</string>
<string>/Users/neeri/Development/Vocalese/Vocalese.xcodeproj</string>
<string>95D7BFC00AA6C1A500D5E02C</string>
<string>/Development/Vocalese/Vocalese.xcodeproj</string>
<string>1CD10A99069EF8BA00B06720</string>
</array>
<key>WindowString</key>
<string>167 327 690 397 0 0 1024 746 </string>
<string>167 326 690 397 0 0 1024 746 </string>
<key>WindowToolsV3</key>
<array>
<dict>
@ -761,12 +775,14 @@
<key>Dock</key>
<array>
<dict>
<key>BecomeActive</key>
<true/>
<key>ContentConfiguration</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>1CD0528F0623707200166675</string>
<key>PBXProjectModuleLabel</key>
<string>VLSheetViewChords.mm</string>
<string>new_allocator.h</string>
<key>StatusBarVisibility</key>
<true/>
</dict>
@ -783,8 +799,6 @@
<string>293pt</string>
</dict>
<dict>
<key>BecomeActive</key>
<true/>
<key>ContentConfiguration</key>
<dict>
<key>PBXProjectModuleGUID</key>
@ -824,7 +838,7 @@
<key>TableOfContents</key>
<array>
<string>95D7BFC00AA6C1A500D5E02C</string>
<string>95D1F8220AB6930D00EE6AC8</string>
<string>95B042DC0ACE37CB00236B52</string>
<string>1CD0528F0623707200166675</string>
<string>XCMainBuildResultsModuleGUID</string>
</array>
@ -835,7 +849,7 @@
<key>WindowToolGUID</key>
<string>95D7BFC00AA6C1A500D5E02C</string>
<key>WindowToolIsVisible</key>
<false/>
<true/>
</dict>
<dict>
<key>FirstTimeWindowDisplayed</key>
@ -866,8 +880,8 @@
<string>yes</string>
<key>sizes</key>
<array>
<string>{{0, 0}, {308, 200}}</string>
<string>{{308, 0}, {386, 200}}</string>
<string>{{0, 0}, {308, 203}}</string>
<string>{{308, 0}, {386, 203}}</string>
</array>
</dict>
<key>VerticalSplitView</key>
@ -882,8 +896,8 @@
<string>yes</string>
<key>sizes</key>
<array>
<string>{{0, 0}, {694, 200}}</string>
<string>{{0, 200}, {694, 181}}</string>
<string>{{0, 0}, {694, 203}}</string>
<string>{{0, 203}, {694, 178}}</string>
</array>
</dict>
</dict>
@ -916,7 +930,7 @@
<real>156</real>
</array>
<key>Frame</key>
<string>{{308, 0}, {386, 200}}</string>
<string>{{308, 0}, {386, 203}}</string>
<key>RubberWindowFrame</key>
<string>254 208 694 422 0 0 1024 746 </string>
</dict>
@ -944,13 +958,13 @@
<key>TableOfContents</key>
<array>
<string>1CD10A99069EF8BA00B06720</string>
<string>95D1F7F20AB6821400EE6AC8</string>
<string>95B042DD0ACE37CB00236B52</string>
<string>1C162984064C10D400B95A72</string>
<string>95D1F7F30AB6821400EE6AC8</string>
<string>95D1F7F40AB6821400EE6AC8</string>
<string>95D1F7F50AB6821400EE6AC8</string>
<string>95D1F7F60AB6821400EE6AC8</string>
<string>95D1F7F70AB6821400EE6AC8</string>
<string>95B042DE0ACE37CB00236B52</string>
<string>95B042DF0ACE37CB00236B52</string>
<string>95B042E00ACE37CB00236B52</string>
<string>95B042E10ACE37CB00236B52</string>
<string>95B042E20ACE37CB00236B52</string>
</array>
<key>ToolbarConfiguration</key>
<string>xcode.toolbar.config.debugV3</string>
@ -959,7 +973,7 @@
<key>WindowToolGUID</key>
<string>1CD10A99069EF8BA00B06720</string>
<key>WindowToolIsVisible</key>
<false/>
<true/>
</dict>
<dict>
<key>Identifier</key>
@ -1112,7 +1126,7 @@
<key>TableOfContents</key>
<array>
<string>95D7BFC80AA6C1A500D5E02C</string>
<string>95D1F8230AB6930D00EE6AC8</string>
<string>95B042E30ACE37CB00236B52</string>
<string>1C78EAAC065D492600B07095</string>
</array>
<key>WindowString</key>

View File

@ -62,22 +62,13 @@
PBXFileDataSource_Warnings_ColumnID,
);
};
PBXPerProjectTemplateStateSaveDate = 179733005;
PBXWorkspaceStateSaveDate = 179733005;
PBXPerProjectTemplateStateSaveDate = 181286523;
PBXWorkspaceStateSaveDate = 181286523;
};
perUserProjectItems = {
95D1F80B0AB68D3B00EE6AC8 /* PBXTextBookmark */ = 95D1F80B0AB68D3B00EE6AC8 /* PBXTextBookmark */;
95D1F82B0AB693AE00EE6AC8 /* PBXBookmark */ = 95D1F82B0AB693AE00EE6AC8 /* PBXBookmark */;
95D1F84C0AB6960700EE6AC8 /* PBXTextBookmark */ = 95D1F84C0AB6960700EE6AC8 /* PBXTextBookmark */;
95D1F8530AB6967E00EE6AC8 /* PBXTextBookmark */ = 95D1F8530AB6967E00EE6AC8 /* PBXTextBookmark */;
95D1F8540AB6967E00EE6AC8 /* PBXTextBookmark */ = 95D1F8540AB6967E00EE6AC8 /* PBXTextBookmark */;
95D1F8550AB6967E00EE6AC8 /* PBXTextBookmark */ = 95D1F8550AB6967E00EE6AC8 /* PBXTextBookmark */;
95D1F8560AB6967E00EE6AC8 /* PBXTextBookmark */ = 95D1F8560AB6967E00EE6AC8 /* PBXTextBookmark */;
95D1F86A0AB6970400EE6AC8 /* PBXTextBookmark */ = 95D1F86A0AB6970400EE6AC8 /* PBXTextBookmark */;
95D1F8BD0AB69F2F00EE6AC8 /* PBXTextBookmark */ = 95D1F8BD0AB69F2F00EE6AC8 /* PBXTextBookmark */;
95D1F8BE0AB69F2F00EE6AC8 /* PBXTextBookmark */ = 95D1F8BE0AB69F2F00EE6AC8 /* PBXTextBookmark */;
95D1F8BF0AB69F2F00EE6AC8 /* PBXTextBookmark */ = 95D1F8BF0AB69F2F00EE6AC8 /* PBXTextBookmark */;
95D1F8C00AB69F2F00EE6AC8 /* PBXTextBookmark */ = 95D1F8C00AB69F2F00EE6AC8 /* PBXTextBookmark */;
95B042F40ACE42E800236B52 /* PBXBookmark */ = 95B042F40ACE42E800236B52 /* PBXBookmark */;
95B042F90ACE431A00236B52 /* PBXTextBookmark */ = 95B042F90ACE431A00236B52 /* PBXTextBookmark */;
95B043000ACE435E00236B52 /* PBXTextBookmark */ = 95B043000ACE435E00236B52 /* PBXTextBookmark */;
};
sourceControlManager = 954D7413095406B2007D9571 /* Source Control */;
userBuildSettings = {
@ -169,9 +160,9 @@
};
952DCD77096BBB11001C2316 /* VLSheetViewChords.mm */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {703, 2100}}";
sepNavSelRange = "{4592, 34}";
sepNavVisRect = "{{0, 1837}, {703, 261}}";
sepNavIntBoundsRect = "{{0, 0}, {703, 2268}}";
sepNavSelRange = "{3383, 0}";
sepNavVisRect = "{{0, 1151}, {703, 261}}";
sepNavWindowFrame = "{{15, 92}, {763, 649}}";
};
};
@ -218,17 +209,17 @@
};
955E58E3095658AB0045FDA5 /* VLModel.h */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {704, 3080}}";
sepNavSelRange = "{2773, 0}";
sepNavVisRect = "{{0, 1807}, {704, 497}}";
sepNavIntBoundsRect = "{{0, 0}, {644, 2170}}";
sepNavSelRange = "{4342, 0}";
sepNavVisRect = "{{0, 1726}, {633, 146}}";
sepNavWindowFrame = "{{203, 40}, {763, 649}}";
};
};
955E58E4095658AB0045FDA5 /* VLModel.cpp */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {704, 3976}}";
sepNavSelRange = "{4436, 0}";
sepNavVisRect = "{{0, 2758}, {704, 497}}";
sepNavIntBoundsRect = "{{0, 0}, {806, 6118}}";
sepNavSelRange = "{10226, 0}";
sepNavVisRect = "{{0, 4813}, {704, 497}}";
sepNavWindowFrame = "{{256, 62}, {763, 649}}";
};
};
@ -309,11 +300,35 @@
sepNavWindowFrame = "{{120, 85}, {763, 649}}";
};
};
95B042F40ACE42E800236B52 /* PBXBookmark */ = {
isa = PBXBookmark;
fRef = 95BDA15809540BF1009F9D65 /* VLSheetView.mm */;
};
95B042F90ACE431A00236B52 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 95BDA15809540BF1009F9D65 /* VLSheetView.mm */;
name = "VLSheetView.mm: 244";
rLen = 0;
rLoc = 5713;
rType = 0;
vrLen = 966;
vrLoc = 5150;
};
95B043000ACE435E00236B52 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 95BDA15809540BF1009F9D65 /* VLSheetView.mm */;
name = "VLSheetView.mm: 181";
rLen = 0;
rLoc = 3996;
rType = 0;
vrLen = 1309;
vrLoc = 3259;
};
95B66653096BC6A100FE18C9 /* VLSheetViewInternal.h */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {724, 520}}";
sepNavSelRange = "{792, 0}";
sepNavVisRect = "{{0, 0}, {724, 520}}";
sepNavIntBoundsRect = "{{0, 0}, {704, 497}}";
sepNavSelRange = "{422, 0}";
sepNavVisRect = "{{0, 0}, {704, 497}}";
sepNavWindowFrame = "{{15, 92}, {763, 649}}";
};
};
@ -327,9 +342,9 @@
};
95B66657096BCA1F00FE18C9 /* VLSheetViewNotes.mm */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {704, 3976}}";
sepNavSelRange = "{5055, 0}";
sepNavVisRect = "{{0, 2576}, {704, 497}}";
sepNavIntBoundsRect = "{{0, 0}, {703, 2660}}";
sepNavSelRange = "{8068, 0}";
sepNavVisRect = "{{0, 1965}, {703, 238}}";
sepNavWindowFrame = "{{38, 71}, {763, 649}}";
};
};
@ -346,134 +361,23 @@
hitCount = 0;
ignoreCount = 0;
lineNumber = 21;
modificationTime = 179740227.391068;
modificationTime = 181290725.024457;
state = 2;
};
95BDA15709540BF1009F9D65 /* VLSheetView.h */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {704, 1134}}";
sepNavSelRange = "{1065, 16}";
sepNavVisRect = "{{0, 472}, {704, 520}}";
sepNavIntBoundsRect = "{{0, 0}, {704, 1190}}";
sepNavSelRange = "{848, 0}";
sepNavVisRect = "{{0, 313}, {704, 497}}";
sepNavWindowFrame = "{{242, 97}, {763, 649}}";
};
};
95BDA15809540BF1009F9D65 /* VLSheetView.mm */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {704, 3626}}";
sepNavSelRange = "{7591, 0}";
sepNavVisRect = "{{0, 3106}, {704, 520}}";
sepNavIntBoundsRect = "{{0, 0}, {704, 5208}}";
sepNavSelRange = "{3996, 0}";
sepNavVisRect = "{{0, 2269}, {704, 497}}";
sepNavWindowFrame = "{{164, 35}, {763, 649}}";
};
};
95D1F80B0AB68D3B00EE6AC8 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 95BDA15709540BF1009F9D65 /* VLSheetView.h */;
name = "VLSheetView.h: 57";
rLen = 0;
rLoc = 1134;
rType = 0;
vrLen = 829;
vrLoc = 672;
};
95D1F82B0AB693AE00EE6AC8 /* PBXBookmark */ = {
isa = PBXBookmark;
fRef = 95BDA15809540BF1009F9D65 /* VLSheetView.mm */;
};
95D1F84C0AB6960700EE6AC8 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 952DCD77096BBB11001C2316 /* VLSheetViewChords.mm */;
name = "VLSheetViewChords.mm: 164";
rLen = 0;
rLoc = 4620;
rType = 0;
vrLen = 839;
vrLoc = 3237;
};
95D1F8530AB6967E00EE6AC8 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 952DCD77096BBB11001C2316 /* VLSheetViewChords.mm */;
name = "VLSheetViewChords.mm: 116";
rLen = 0;
rLoc = 3410;
rType = 0;
vrLen = 971;
vrLoc = 2859;
};
95D1F8540AB6967E00EE6AC8 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 95BDA15809540BF1009F9D65 /* VLSheetView.mm */;
rLen = 0;
rLoc = 326;
rType = 1;
};
95D1F8550AB6967E00EE6AC8 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 95BDA15809540BF1009F9D65 /* VLSheetView.mm */;
name = "VLSheetView.mm: 317";
rLen = 0;
rLoc = 7520;
rType = 0;
vrLen = 758;
vrLoc = 7108;
};
95D1F8560AB6967E00EE6AC8 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 952DCD77096BBB11001C2316 /* VLSheetViewChords.mm */;
name = "VLSheetViewChords.mm: 116";
rLen = 0;
rLoc = 3410;
rType = 0;
vrLen = 971;
vrLoc = 2859;
};
95D1F86A0AB6970400EE6AC8 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 952DCD76096BBB11001C2316 /* VLSheetViewChords.h */;
name = "VLSheetViewChords.h: 11";
rLen = 35;
rLoc = 184;
rType = 0;
vrLen = 290;
vrLoc = 0;
};
95D1F8BD0AB69F2F00EE6AC8 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 95BDA15809540BF1009F9D65 /* VLSheetView.mm */;
name = "VLSheetView.mm: 318";
rLen = 0;
rLoc = 7591;
rType = 0;
vrLen = 766;
vrLoc = 7108;
};
95D1F8BE0AB69F2F00EE6AC8 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 952DCD76096BBB11001C2316 /* VLSheetViewChords.h */;
name = "VLSheetViewChords.h: 11";
rLen = 35;
rLoc = 184;
rType = 0;
vrLen = 290;
vrLoc = 0;
};
95D1F8BF0AB69F2F00EE6AC8 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 95BDA15809540BF1009F9D65 /* VLSheetView.mm */;
name = "VLSheetView.mm: 327";
rLen = 0;
rLoc = 7785;
rType = 0;
vrLen = 786;
vrLoc = 7088;
};
95D1F8C00AB69F2F00EE6AC8 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 95BDA15709540BF1009F9D65 /* VLSheetView.h */;
name = "VLSheetView.h: 55";
rLen = 16;
rLoc = 1065;
rType = 0;
vrLen = 925;
vrLoc = 566;
};
}