diff --git a/English.lproj/MainMenu.nib/classes.nib b/English.lproj/MainMenu.nib/classes.nib
index 8bb0c8d..dec6a3b 100644
--- a/English.lproj/MainMenu.nib/classes.nib
+++ b/English.lproj/MainMenu.nib/classes.nib
@@ -4,6 +4,8 @@
ACTIONS = {
editRepeat = id;
editRepeatEnding = id;
+ insertJumpToCoda = id;
+ insertStartCoda = id;
zoomIn = id;
zoomOut = id;
zoomToActualSize = id;
diff --git a/English.lproj/MainMenu.nib/info.nib b/English.lproj/MainMenu.nib/info.nib
index 250a48c..f008202 100644
--- a/English.lproj/MainMenu.nib/info.nib
+++ b/English.lproj/MainMenu.nib/info.nib
@@ -10,13 +10,13 @@
320 324 349 44 0 0 1280 778
IBFramework Version
- 454.0
+ 455.0
IBOpenObjects
- 217
29
+ 217
IBSystem Version
- 9A321
+ 9A343
diff --git a/English.lproj/MainMenu.nib/keyedobjects.nib b/English.lproj/MainMenu.nib/keyedobjects.nib
index 9cf7ecb..256ee2a 100644
Binary files a/English.lproj/MainMenu.nib/keyedobjects.nib and b/English.lproj/MainMenu.nib/keyedobjects.nib differ
diff --git a/Resources/Music/coda.eps b/Resources/Music/coda.eps
new file mode 100644
index 0000000..d846daa
--- /dev/null
+++ b/Resources/Music/coda.eps
@@ -0,0 +1,168 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: -267.25 -351 267.25 351.081
+%%Pages: 0
+%%Title: scripts.coda from feta26
+%%Creator: FontForge
+%%Author: Matthias Neeracher
+%%CreationDate: 21:46 20-1-2007
+%%EndComments
+%%BeginPreview: 56 74 4 74
+%00000000000000000000000000011000000000000000000000000000
+%000000000000000000000000002EE200000000000000000000000000
+%000000000000000000000000005FF500000000000000000000000000
+%000000000000000000000000005FF500000000000000000000000000
+%000000000000000000000000005FF500000000000000000000000000
+%000000000000000000000000005FF500000000000000000000000000
+%000000000000000000000000005FF500000000000000000000000000
+%000000000000000000000000005FF500000000000000000000000000
+%000000000000000000000000005FF500000000000000000000000000
+%000000000000000000000000005FF500000000000000000000000000
+%000000000000000000000000005FF500000000000000000000000000
+%00000000000000000000000158BFFB84000000000000000000000000
+%00000000000000000000029EFFFFFFFFE92000000000000000000000
+%000000000000000000008FFFFFFFFFFFFFF700000000000000000000
+%0000000000000000001CFFFFA47FF64AFFFFB1000000000000000000
+%000000000000000001DFFFE4006FF5004EFFFD100000000000000000
+%00000000000000001CFFFE30005FF50003EFFFC10000000000000000
+%0000000000000000AFFFF600005FF500006FFFFA0000000000000000
+%0000000000000005FFFFD000005FF500000CFFFF5000000000000000
+%000000000000001EFFFF6000005FF5000006FFFFE100000000000000
+%000000000000008FFFFF1000005FF5000001EFFFF800000000000000
+%00000000000001EFFFFB0000005FF5000000BFFFFE10000000000000
+%00000000000007FFFFF70000005FF50000007FFFFF70000000000000
+%0000000000000DFFFFF40000005FF50000004FFFFFD0000000000000
+%0000000000003FFFFFF20000005FF50000001FFFFFF3000000000000
+%0000000000008FFFFFF00000005FF50000000EFFFFF8000000000000
+%000000000000CFFFFFD00000005FF50000000CFFFFFC000000000000
+%000000000001FFFFFFB00000005FF50000000BFFFFFF100000000000
+%000000000005FFFFFFA00000005FF50000000AFFFFFF500000000000
+%000000000008FFFFFF900000005FF500000009FFFFFF800000000000
+%00000000000AFFFFFF800000005FF500000008FFFFFFA00000000000
+%00000000000CFFFFFF700000005FF500000007FFFFFFC00000000000
+%00000000000EFFFFFF700000005FF500000007FFFFFFE00000000000
+%00000000001FFFFFFF600000005FF500000006FFFFFFF10000000000
+%00000000002FFFFFFF600000005FF500000006FFFFFFF20000000000
+%03555555558FFFFFFF955555559FF955555559FFFFFFF75555555530
+%6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6
+%6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6
+%03555555558FFFFFFF955555559FF955555559FFFFFFF85555555530
+%00000000002FFFFFFF600000005FF500000006FFFFFFF20000000000
+%00000000001FFFFFFF600000005FF500000006FFFFFFF00000000000
+%00000000000EFFFFFF600000005FF500000007FFFFFFE00000000000
+%00000000000CFFFFFF700000005FF500000007FFFFFFC00000000000
+%00000000000AFFFFFF800000005FF500000008FFFFFFA00000000000
+%000000000008FFFFFF800000005FF500000009FFFFFF700000000000
+%000000000005FFFFFF900000005FF50000000AFFFFFF400000000000
+%000000000001FFFFFFB00000005FF50000000BFFFFFF100000000000
+%000000000000CFFFFFC00000005FF50000000CFFFFFC000000000000
+%0000000000008FFFFFE00000005FF50000000EFFFFF8000000000000
+%0000000000003FFFFFF10000005FF50000001FFFFFF3000000000000
+%0000000000000DFFFFF40000005FF50000004FFFFFD0000000000000
+%00000000000007FFFFF70000005FF50000007FFFFF70000000000000
+%00000000000001EFFFFB0000005FF5000000BFFFFE10000000000000
+%000000000000008FFFFE1000005FF5000001EFFFF800000000000000
+%000000000000001EFFFF6000005FF5000006FFFFE100000000000000
+%0000000000000005FFFFC000005FF500000CFFFF5000000000000000
+%0000000000000000AFFFF600005FF500006FFFFA0000000000000000
+%00000000000000001CFFFE30005FF50003EFFFC10000000000000000
+%000000000000000001DFFFE4005FF5004EFFFD100000000000000000
+%0000000000000000001CFFFF936FF64AFFFFC1000000000000000000
+%000000000000000000008FFFFFFFFFFFFFF800000000000000000000
+%00000000000000000000029EFFFFFFFFE92000000000000000000000
+%00000000000000000000000048BFFB85100000000000000000000000
+%000000000000000000000000005FF500000000000000000000000000
+%000000000000000000000000005FF500000000000000000000000000
+%000000000000000000000000005FF500000000000000000000000000
+%000000000000000000000000005FF500000000000000000000000000
+%000000000000000000000000005FF500000000000000000000000000
+%000000000000000000000000005FF500000000000000000000000000
+%000000000000000000000000005FF500000000000000000000000000
+%000000000000000000000000005FF500000000000000000000000000
+%000000000000000000000000005FF500000000000000000000000000
+%000000000000000000000000002EE200000000000000000000000000
+%00000000000000000000000000011000000000000000000000000000
+%%EndPreview
+%%EndProlog
+%%Page "scripts.coda" 1
+gsave newpath
+ -7 349 moveto
+ -1 353 7 351 11 345 curveto
+ 13 342 13 339 13 295 curveto
+ 13 249 lineto
+ 19 249 lineto
+ 32 247 51 241 65 233 curveto
+ 121 202 159 125 166 29 curveto
+ 167 21 167 14 167 14 curveto
+ 167 13 187 13 212 13 curveto
+ 262 13 261 13 265 7 curveto
+ 268 3 268 -3 265 -7 curveto
+ 261 -13 262 -13 212 -13 curveto
+ 187 -13 167 -13 167 -14 curveto
+ 167 -14 167 -21 166 -28 curveto
+ 158 -133 115 -214 51 -240 curveto
+ 42 -244 27 -248 19 -249 curveto
+ 13 -249 lineto
+ 13 -295 lineto
+ 13 -339 13 -342 11 -345 curveto
+ 6 -353 -6 -353 -11 -345 curveto
+ -13 -342 -13 -339 -13 -295 curveto
+ -13 -249 lineto
+ -19 -249 lineto
+ -32 -247 -51 -241 -65 -233 curveto
+ -121 -202 -159 -125 -166 -28 curveto
+ -167 -21 -167 -14 -167 -14 curveto
+ -167 -13 -187 -13 -212 -13 curveto
+ -262 -13 -261 -13 -265 -7 curveto
+ -268 -3 -268 3 -265 7 curveto
+ -261 13 -262 13 -212 13 curveto
+ -187 13 -167 13 -167 14 curveto
+ -167 14 -167 21 -166 29 curveto
+ -158 133 -115 214 -51 240 curveto
+ -42 244 -27 248 -19 249 curveto
+ -13 249 lineto
+ -13 295 lineto
+ -13 346 -13 345 -7 349 curveto
+ closepath
+ -13 118 moveto
+ -13 217 -13 223 -15 223 curveto
+ -18 223 -32 218 -37 216 curveto
+ -66 199 -83 162 -89 99 curveto
+ -91 81 -93 46 -93 27 curveto
+ -93 13 lineto
+ -53 13 lineto
+ -13 13 lineto
+ -13 118 lineto
+ closepath
+ 26 220 moveto
+ 23 221 19 222 17 223 curveto
+ 13 223 lineto
+ 13 118 lineto
+ 13 13 lineto
+ 53 13 lineto
+ 93 13 lineto
+ 93 40 lineto
+ 91 120 82 163 62 193 curveto
+ 53 206 40 216 26 220 curveto
+ closepath
+ -13 -118 moveto
+ -13 -13 lineto
+ -53 -13 lineto
+ -93 -13 lineto
+ -93 -40 lineto
+ -92 -72 -91 -89 -88 -111 curveto
+ -80 -179 -56 -215 -17 -223 curveto
+ -13 -223 lineto
+ -13 -118 lineto
+ closepath
+ 93 -40 moveto
+ 93 -13 lineto
+ 53 -13 lineto
+ 13 -13 lineto
+ 13 -118 lineto
+ 13 -223 lineto
+ 17 -223 lineto
+ 56 -215 80 -179 88 -111 curveto
+ 91 -89 92 -72 93 -40 curveto
+ closepath
+fill grestore
+%%EOF
diff --git a/Sources/VLSheetView.h b/Sources/VLSheetView.h
index c6ae350..75d34e8 100644
--- a/Sources/VLSheetView.h
+++ b/Sources/VLSheetView.h
@@ -36,6 +36,7 @@ enum VLMusicElement {
kMusicNaturalCursor,
kMusicRestCursor,
kMusicKillCursor,
+ kMusicCoda,
kMusicElements
};
diff --git a/Sources/VLSheetView.mm b/Sources/VLSheetView.mm
index 522aff4..75e016a 100644
--- a/Sources/VLSheetView.mm
+++ b/Sources/VLSheetView.mm
@@ -42,7 +42,8 @@ static NSString * sElementNames[kMusicElements] = {
@"sharpcursor",
@"naturalcursor",
@"restcursor",
- @"killcursor"
+ @"killcursor",
+ @"coda"
};
static float sSharpPos[] = {
@@ -407,6 +408,10 @@ VLMusicElement sSemi2Accidental[12][12] = {
[bz removeAllPoints];
[bz setLineWidth:2.0];
}
+ if (song->fGoToCoda == m || song->fCoda == m)
+ [[self musicElement:kMusicCoda]
+ compositeToPoint: NSMakePoint(x+kCodaX, yy+kCodaY)
+ operation: NSCompositeSourceOver];
}
}
@@ -518,15 +523,19 @@ VLMusicElement sSemi2Accidental[12][12] = {
- (IBAction) setKey:(id)sender
{
- [[NSAlert alertWithMessageText:@"Transpose Song?"
- defaultButton:@"Transpose"
- alternateButton:@"Cancel"
- otherButton:@"Change Key"
- informativeTextWithFormat:
- @"Do you want to transpose the song into the new key?"]
- beginSheetModalForWindow:[self window]
- modalDelegate:self didEndSelector:@selector(setKey:returnCode:contextInfo:)
- contextInfo:sender];
+ if ([self song]->IsNonEmpty())
+ [[NSAlert alertWithMessageText:@"Transpose Song?"
+ defaultButton:@"Transpose"
+ alternateButton:@"Cancel"
+ otherButton:@"Change Key"
+ informativeTextWithFormat:
+ @"Do you want to transpose the song into the new key?"]
+ beginSheetModalForWindow:[self window]
+ modalDelegate:self
+ didEndSelector:@selector(setKey:returnCode:contextInfo:)
+ contextInfo:sender];
+ else
+ [self setKey:nil returnCode:NSAlertOtherReturn contextInfo:sender];
}
- (void)setKey:(NSAlert *)alert returnCode:(int)returnCode contextInfo:(id)sender
diff --git a/Sources/VLSheetViewInternal.h b/Sources/VLSheetViewInternal.h
index da5bc62..4a51d29 100644
--- a/Sources/VLSheetViewInternal.h
+++ b/Sources/VLSheetViewInternal.h
@@ -39,4 +39,6 @@ const float kStemH = 30.0f;
const float kWholeRestY = 20.0f;
const float kHalfRestY = 15.0f;
const float kTieDepth = 10.0f;
+const float kCodaX =-10.0f;
+const float kCodaY = 5.0f;
const int kMaxLedgers = 3;
diff --git a/Sources/VLSheetViewSelection.mm b/Sources/VLSheetViewSelection.mm
index 65b035c..843df58 100644
--- a/Sources/VLSheetViewSelection.mm
+++ b/Sources/VLSheetViewSelection.mm
@@ -59,6 +59,27 @@ static VLSong sPasteboard;
fCursorRegion = kRegionMeasure;
}
+- (BOOL)validateMenuItem:(id) item
+{
+ SEL action = [item action];
+ if (action == @selector(insertJumpToCoda:))
+ if (fSelStart == fSelEnd) {
+ [item setState:[self song]->fGoToCoda==fSelStart];
+
+ return YES;
+ } else
+ return NO;
+ else if (action == @selector(insertStartCoda:))
+ if (fSelStart == fSelEnd) {
+ [item setState:[self song]->fCoda==fSelStart];
+
+ return YES;
+ } else
+ return NO;
+ else
+ return [self validateUserInterfaceItem:item];
+}
+
- (BOOL)validateUserInterfaceItem:(id) item
{
SEL action = [item action];
@@ -215,4 +236,28 @@ static VLSong sPasteboard;
fVolta &= ~mask;
}
+- (IBAction)insertJumpToCoda:(id)sender
+{
+ [[self document] willChangeSong];
+ VLSong * song = [self song];
+ if (song->fGoToCoda == fSelStart)
+ song->fGoToCoda = -1;
+ else
+ song->fGoToCoda = fSelStart;
+ [self setNeedsDisplay:YES];
+ [[self document] didChangeSong];
+}
+
+- (IBAction)insertStartCoda:(id)sender
+{
+ [[self document] willChangeSong];
+ VLSong * song = [self song];
+ if (song->fCoda == fSelStart)
+ song->fCoda = -1;
+ else
+ song->fCoda = fSelStart;
+ [self setNeedsDisplay:YES];
+ [[self document] didChangeSong];
+}
+
@end
diff --git a/Vocalese.xcodeproj/project.pbxproj b/Vocalese.xcodeproj/project.pbxproj
index 00c7293..76d0110 100644
--- a/Vocalese.xcodeproj/project.pbxproj
+++ b/Vocalese.xcodeproj/project.pbxproj
@@ -13,15 +13,9 @@
8D15AC320486D014006FF6A4 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A37F4B0FDCFA73011CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; };
8D15AC340486D014006FF6A4 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A7FEA54F5311CA2CBB /* Cocoa.framework */; };
95009B280B0ECF9000EB33A4 /* AUOutputBL.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 95009B220B0ECF9000EB33A4 /* AUOutputBL.cpp */; };
- 95009B290B0ECF9000EB33A4 /* AUOutputBL.h in Copy MMA Library */ = {isa = PBXBuildFile; fileRef = 95009B230B0ECF9000EB33A4 /* AUOutputBL.h */; };
95009B2A0B0ECF9000EB33A4 /* CAAudioFileFormats.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 95009B240B0ECF9000EB33A4 /* CAAudioFileFormats.cpp */; };
- 95009B2B0B0ECF9000EB33A4 /* CAAudioFileFormats.h in Copy MMA Library */ = {isa = PBXBuildFile; fileRef = 95009B250B0ECF9000EB33A4 /* CAAudioFileFormats.h */; };
95009B2C0B0ECF9000EB33A4 /* CAStreamBasicDescription.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 95009B260B0ECF9000EB33A4 /* CAStreamBasicDescription.cpp */; };
- 95009B2D0B0ECF9000EB33A4 /* CAStreamBasicDescription.h in Copy MMA Library */ = {isa = PBXBuildFile; fileRef = 95009B270B0ECF9000EB33A4 /* CAStreamBasicDescription.h */; };
95009B500B0ED0BB00EB33A4 /* CADebugMacros.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 95009B4E0B0ED0BB00EB33A4 /* CADebugMacros.cpp */; };
- 95009B510B0ED0BB00EB33A4 /* CADebugMacros.h in Copy MMA Library */ = {isa = PBXBuildFile; fileRef = 95009B4F0B0ED0BB00EB33A4 /* CADebugMacros.h */; };
- 95009B640B0ED18700EB33A4 /* CAConditionalMacros.h in Copy MMA Library */ = {isa = PBXBuildFile; fileRef = 95009B620B0ED18700EB33A4 /* CAConditionalMacros.h */; };
- 95009B650B0ED18700EB33A4 /* CAMath.h in Copy MMA Library */ = {isa = PBXBuildFile; fileRef = 95009B630B0ED18700EB33A4 /* CAMath.h */; };
95009B7E0B0EDC7400EB33A4 /* AUOutputBL.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 95009B220B0ECF9000EB33A4 /* AUOutputBL.cpp */; };
95009B7F0B0EDC7900EB33A4 /* CAAudioFileFormats.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 95009B240B0ECF9000EB33A4 /* CAAudioFileFormats.cpp */; };
95009B800B0EDC7B00EB33A4 /* CADebugMacros.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 95009B4E0B0ED0BB00EB33A4 /* CADebugMacros.cpp */; };
@@ -39,9 +33,7 @@
95498DBD0AE3812F006B5F81 /* VLSoundSched.mm in Sources */ = {isa = PBXBuildFile; fileRef = 95498DBC0AE3812F006B5F81 /* VLSoundSched.mm */; };
954BBD860AEDDE5300BBFD5F /* VLAppController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 954BBD850AEDDE5300BBFD5F /* VLAppController.mm */; };
954BBD9A0AEDE81500BBFD5F /* VLPitchTransformer.mm in Sources */ = {isa = PBXBuildFile; fileRef = 954BBD990AEDE81500BBFD5F /* VLPitchTransformer.mm */; };
- 954DD4B90B444B220056C504 /* VLSheetViewSelection.h in Copy MMA Library */ = {isa = PBXBuildFile; fileRef = 954DD4B70B444B220056C504 /* VLSheetViewSelection.h */; };
954DD4E60B44E67F0056C504 /* VLSheetViewSelection.mm in Sources */ = {isa = PBXBuildFile; fileRef = 954DD4E50B44E67F0056C504 /* VLSheetViewSelection.mm */; };
- 955CBA4E0B2366DD001CF4A1 /* VLKeyValueUndo.h in Copy MMA Library */ = {isa = PBXBuildFile; fileRef = 955CBA4C0B2366DD001CF4A1 /* VLKeyValueUndo.h */; };
955CBA4F0B2366DD001CF4A1 /* VLKeyValueUndo.mm in Sources */ = {isa = PBXBuildFile; fileRef = 955CBA4D0B2366DD001CF4A1 /* VLKeyValueUndo.mm */; };
955E58E5095658AB0045FDA5 /* VLModel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 955E58E4095658AB0045FDA5 /* VLModel.cpp */; };
955E59610957C1400045FDA5 /* TVLChord.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 955E59600957C1400045FDA5 /* TVLChord.cpp */; };
@@ -72,9 +64,7 @@
95E04DAB0AEB4886006F30A0 /* VLXMLDocument.mm in Sources */ = {isa = PBXBuildFile; fileRef = 95F5F50E0ADCC433003980B2 /* VLXMLDocument.mm */; };
95E04DC70AEB4B57006F30A0 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A7FEA54F5311CA2CBB /* Cocoa.framework */; };
95E04DCE0AEB4D9B006F30A0 /* Templates in Resources */ = {isa = PBXBuildFile; fileRef = 95E04DCA0AEB4D9B006F30A0 /* Templates */; };
- 95E299BF0B2006F5001977D2 /* VLSheetViewLyrics.h in Copy MMA Library */ = {isa = PBXBuildFile; fileRef = 95E299BD0B2006F5001977D2 /* VLSheetViewLyrics.h */; };
95E299C00B2006F5001977D2 /* VLSheetViewLyrics.mm in Sources */ = {isa = PBXBuildFile; fileRef = 95E299BE0B2006F5001977D2 /* VLSheetViewLyrics.mm */; };
- 95EDA5AA0B06DE46004D8D6E /* VLMIDIDocument.h in Copy MMA Library */ = {isa = PBXBuildFile; fileRef = 95EDA5A80B06DE46004D8D6E /* VLMIDIDocument.h */; };
95EDA5AB0B06DE47004D8D6E /* VLMIDIDocument.mm in Sources */ = {isa = PBXBuildFile; fileRef = 95EDA5A90B06DE46004D8D6E /* VLMIDIDocument.mm */; };
95F5F50F0ADCC433003980B2 /* VLXMLDocument.mm in Sources */ = {isa = PBXBuildFile; fileRef = 95F5F50E0ADCC433003980B2 /* VLXMLDocument.mm */; };
95F5F5340ADCCFBB003980B2 /* DTD in Resources */ = {isa = PBXBuildFile; fileRef = 95F5F51E0ADCCFBB003980B2 /* DTD */; };
@@ -103,16 +93,6 @@
95C461FE0B04432700649F92 /* MMA in Copy MMA Library */,
95C461C40B043E8900649F92 /* includes in Copy MMA Library */,
95C461C50B043E8900649F92 /* lib in Copy MMA Library */,
- 95EDA5AA0B06DE46004D8D6E /* VLMIDIDocument.h in Copy MMA Library */,
- 95009B290B0ECF9000EB33A4 /* AUOutputBL.h in Copy MMA Library */,
- 95009B2B0B0ECF9000EB33A4 /* CAAudioFileFormats.h in Copy MMA Library */,
- 95009B2D0B0ECF9000EB33A4 /* CAStreamBasicDescription.h in Copy MMA Library */,
- 95009B510B0ED0BB00EB33A4 /* CADebugMacros.h in Copy MMA Library */,
- 95009B640B0ED18700EB33A4 /* CAConditionalMacros.h in Copy MMA Library */,
- 95009B650B0ED18700EB33A4 /* CAMath.h in Copy MMA Library */,
- 95E299BF0B2006F5001977D2 /* VLSheetViewLyrics.h in Copy MMA Library */,
- 955CBA4E0B2366DD001CF4A1 /* VLKeyValueUndo.h in Copy MMA Library */,
- 954DD4B90B444B220056C504 /* VLSheetViewSelection.h in Copy MMA Library */,
);
name = "Copy MMA Library";
runOnlyForDeploymentPostprocessing = 0;