From a5f43d16d126d9b8e14bc1bdda62b1a209bdf000 Mon Sep 17 00:00:00 2001 From: Matthias Neeracher Date: Sun, 15 Apr 2007 05:22:30 +0000 Subject: [PATCH] Implemented groove selection sheet --- English.lproj/VLDocument.nib/classes.nib | 2 + English.lproj/VLDocument.nib/info.nib | 8 +- English.lproj/VLDocument.nib/keyedobjects.nib | Bin 39076 -> 39350 bytes English.lproj/VLGroove.nib/classes.nib | 13 ++ English.lproj/VLGroove.nib/info.nib | 16 +++ English.lproj/VLGroove.nib/keyedobjects.nib | Bin 0 -> 5400 bytes Sources/VLGrooveController.h | 32 +++++ Sources/VLGrooveController.mm | 111 ++++++++++++++++++ Sources/VLSheetView.h | 4 + Sources/VLSheetView.mm | 48 ++++++-- Sources/VLXMLDocument.mm | 14 +++ Tools/rebuildGrooves | 83 +++++++++++++ Vocalese.xcodeproj/project.pbxproj | 26 +++- 13 files changed, 342 insertions(+), 15 deletions(-) create mode 100644 English.lproj/VLGroove.nib/classes.nib create mode 100644 English.lproj/VLGroove.nib/info.nib create mode 100644 English.lproj/VLGroove.nib/keyedobjects.nib create mode 100644 Sources/VLGrooveController.h create mode 100644 Sources/VLGrooveController.mm create mode 100755 Tools/rebuildGrooves diff --git a/English.lproj/VLDocument.nib/classes.nib b/English.lproj/VLDocument.nib/classes.nib index 9be966e..63e5f46 100644 --- a/English.lproj/VLDocument.nib/classes.nib +++ b/English.lproj/VLDocument.nib/classes.nib @@ -31,6 +31,7 @@ ACTIONS = { endRepeatSheet = id; hideFieldEditor = id; + selectGroove = id; setDivisions = id; setKey = id; setTime = id; @@ -41,6 +42,7 @@ fEndingMsg = id; fEndingSheet = id; fFieldEditor = id; + fGrooveMenu = id; fRepeatMsg = id; fRepeatSheet = id; }; diff --git a/English.lproj/VLDocument.nib/info.nib b/English.lproj/VLDocument.nib/info.nib index 5be6fa2..b5503af 100644 --- a/English.lproj/VLDocument.nib/info.nib +++ b/English.lproj/VLDocument.nib/info.nib @@ -1,17 +1,19 @@ - + IBDocumentLocation 427 29 356 240 0 0 1280 778 IBFramework Version - 454.0 + 460.0 IBOpenObjects 5 144 + 196 + 216 IBSystem Version - 9A321 + 9A412 diff --git a/English.lproj/VLDocument.nib/keyedobjects.nib b/English.lproj/VLDocument.nib/keyedobjects.nib index 1f58fe1cea0308db2ea758a41a36cd692b1ae0fa..3318d61207d2d980728bebfc3e0fcb2c102135c1 100644 GIT binary patch literal 39350 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 literal 39076 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 + + + + IBDocumentLocation + 59 9 356 240 0 0 1280 778 + IBFramework Version + 460.0 + IBOpenObjects + + 13 + + IBSystem Version + 9A412 + + diff --git a/English.lproj/VLGroove.nib/keyedobjects.nib b/English.lproj/VLGroove.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..2fd578f37125671e9fed56a099d6dbc71a53679f GIT binary patch literal 5400 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 Y_ONH!D{P-N>`PMW+hcuqf3l + +@class VLSheetView; + +@interface VLGrooveController : NSWindowController { + NSDictionary * fGrooves; + IBOutlet NSBrowser * fBrowser; + IBOutlet NSTextField * fDescription; + IBOutlet NSButton * fOKButton; + NSString * fStyle; + NSDictionary * fSubStyles; + NSArray * fSubStyleList; + NSPredicate * fSubStyleFilter; +} + +- (id) initWithSheetView:(VLSheetView *)view; +- (IBAction)endSheet:(id)sender; +- (IBAction)updateDescription:(id)sender; + +@end + +// Local Variables: +// mode:ObjC +// End: diff --git a/Sources/VLGrooveController.mm b/Sources/VLGrooveController.mm new file mode 100644 index 0000000..de3be91 --- /dev/null +++ b/Sources/VLGrooveController.mm @@ -0,0 +1,111 @@ +// +// VLGrooveController.mm +// Vocalese +// +// Created by Matthias Neeracher on 2/1/07. +// Copyright 2007 __MyCompanyName__. All rights reserved. +// + +#import "VLGrooveController.h" +#import "VLSheetView.h" + +@implementation VLGrooveController + +- (id) initWithSheetView:(VLSheetView *)view; +{ + self = [super initWithWindowNibName:@"VLGroove"]; + fGrooves = [[NSDictionary alloc] initWithContentsOfFile: + [[NSBundle mainBundle] pathForResource:@"Grooves" ofType:@"plist"]]; + fSubStyleFilter = + [[NSPredicate predicateWithFormat: + @"!(SELF like[c] '.DESC') AND !(SELF matches[c] '.*(Intro|End)\\\\d*$')"] + retain]; + + [NSApp beginSheet: [self window] + modalForWindow: [view window] + modalDelegate: self + didEndSelector: @selector(didEndSheet:returnCode:contextInfo:) + contextInfo: view]; + + return self; +} + +- (void) dealloc +{ + [fGrooves release]; + [super dealloc]; +} + +- (IBAction)endSheet:(id)sender +{ + [NSApp endSheet:[self window] returnCode:[sender tag]]; +} + +- (void)didEndSheet:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo +{ + if (returnCode == NSAlertFirstButtonReturn) + [(VLSheetView *)contextInfo setGroove:[[fBrowser selectedCellInColumn:1] stringValue]]; + + [[self window] orderOut:self]; +} + +- (NSString *)browser:(NSBrowser *)sender titleOfColumn:(NSInteger)column +{ + if (!column) + return @"Style"; + else + return @"Substyle"; +} + +- (void)updateStyle +{ + [fStyle autorelease]; + [fSubStyleList release]; + fStyle = [[[fBrowser selectedCellInColumn:0] stringValue] retain]; + fSubStyles = [fGrooves objectForKey:fStyle]; + fSubStyleList = [[[fSubStyles allKeys] + filteredArrayUsingPredicate:fSubStyleFilter] + retain]; +} + +- (NSInteger)browser:(NSBrowser *)sender numberOfRowsInColumn:(NSInteger)column +{ + [fBrowser setTakesTitleFromPreviousColumn:NO]; + [fBrowser setDoubleAction:@selector(endSheet:)]; + + if (!column) { + return [fGrooves count]; + } else { + [self updateStyle]; + return [fSubStyleList count]; + } +} + +- (void)browser:(NSBrowser *)sender willDisplayCell:(id)cell atRow:(NSInteger)row column:(NSInteger)column +{ + if (!column) { + [cell setStringValue: + [[[fGrooves allKeys] + sortedArrayUsingSelector:@selector(compare:)] + objectAtIndex:row]]; + } else { + [cell setStringValue:[fSubStyleList objectAtIndex:row]]; + [cell setLeaf:YES]; + } +} + +- (IBAction)updateDescription:(id)sender +{ + BOOL validStyle = [fBrowser selectedColumn]; + [fOKButton setEnabled:validStyle]; + if (validStyle) + [fDescription setStringValue: + [NSString stringWithFormat:@"%@\n\n%@", + [fSubStyles objectForKey:@".DESC"], + [fSubStyles objectForKey: + [[fBrowser selectedCellInColumn:1] stringValue]]]]; + else + [fDescription setStringValue:[fSubStyles objectForKey:@".DESC"]]; +} + +@end diff --git a/Sources/VLSheetView.h b/Sources/VLSheetView.h index 75d34e8..b256187 100644 --- a/Sources/VLSheetView.h +++ b/Sources/VLSheetView.h @@ -87,6 +87,7 @@ enum VLRecalc { IBOutlet id fEndingSheet; IBOutlet id fRepeatMsg; IBOutlet id fEndingMsg; + IBOutlet id fGrooveMenu; } - (IBAction) setKey:(id)sender; @@ -94,6 +95,7 @@ enum VLRecalc { - (IBAction) setDivisions:(id)sender; - (IBAction) hideFieldEditor:(id)sender; - (IBAction) endRepeatSheet:(id)sender; +- (IBAction) selectGroove:(id)sender; - (VLDocument *) document; - (VLSong *) song; @@ -118,6 +120,8 @@ enum VLRecalc { - (void) setEditTarget:(VLEditable *)editable; - (VLRegion) findRegionForEvent:(NSEvent *) event; +- (void) setGroove:(NSString *)groove; + @end // Local Variables: diff --git a/Sources/VLSheetView.mm b/Sources/VLSheetView.mm index 75e016a..8d1f0a5 100644 --- a/Sources/VLSheetView.mm +++ b/Sources/VLSheetView.mm @@ -13,6 +13,7 @@ #import "VLSheetViewLyrics.h" #import "VLSheetViewSelection.h" #import "VLSoundOut.h" +#import "VLGrooveController.h" #import "VLDocument.h" @@ -521,6 +522,17 @@ VLMusicElement sSemi2Accidental[12][12] = { [[self editTarget] highlightCursor]; } +- (void)setKey:(NSAlert *)alert returnCode:(int)returnCode contextInfo:(id)sender +{ + if (returnCode == NSAlertAlternateReturn) + return; + + int key = [[sender selectedItem] tag]; + [[self document] setKey:key transpose:returnCode==NSAlertDefaultReturn]; + fNeedsRecalc = kRecalc; + [self setNeedsDisplay: YES]; +} + - (IBAction) setKey:(id)sender { if ([self song]->IsNonEmpty()) @@ -538,17 +550,6 @@ VLMusicElement sSemi2Accidental[12][12] = { [self setKey:nil returnCode:NSAlertOtherReturn contextInfo:sender]; } -- (void)setKey:(NSAlert *)alert returnCode:(int)returnCode contextInfo:(id)sender -{ - if (returnCode == NSAlertAlternateReturn) - return; - - int key = [[sender selectedItem] tag]; - [[self document] setKey:key transpose:returnCode==NSAlertDefaultReturn]; - fNeedsRecalc = kRecalc; - [self setNeedsDisplay: YES]; -} - - (IBAction) setTime:(id)sender { int time = [[sender selectedItem] tag]; @@ -892,6 +893,7 @@ static int8_t sSharpAcc[] = { { [[self document] addObserver:self forKeyPath:@"song" options:0 context:nil]; [[self document] addObserver:self forKeyPath:@"songKey" options:0 context:nil]; + [self setGroove:[[self document] valueForKey:@"songGroove"]]; } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)o change:(NSDictionary *)c context:(id)ctx @@ -906,4 +908,28 @@ static int8_t sSharpAcc[] = { [NSApp endSheet:[sender window] returnCode:[sender tag]]; } +- (IBAction)selectGroove:(id)sender +{ + if ([sender tag]) + [[VLGrooveController alloc] initWithSheetView:self]; + else + [self setGroove:[sender title]]; +} + +- (void)setGroove:(NSString *)groove +{ + [[self document] setValue:groove forKey:@"songGroove"]; + int removeIndex = [fGrooveMenu indexOfItemWithTitle:groove]; + if (removeIndex < 0 && [fGrooveMenu numberOfItems] > 11) + removeIndex = 11; + if (removeIndex >= 0) + [fGrooveMenu removeItemAtIndex:removeIndex]; + [[[fGrooveMenu menu] insertItemWithTitle:groove action:@selector(selectGroove:) + keyEquivalent:@"" atIndex:2] setTarget:self]; + [fGrooveMenu selectItemAtIndex:2]; + NSArray * grooves = [fGrooveMenu itemTitles]; + grooves = [grooves subarrayWithRange:NSMakeRange(2, [grooves count]-2)]; + [[NSUserDefaults standardUserDefaults] setObject:grooves forKey:@"VLGrooves"]; +} + @end diff --git a/Sources/VLXMLDocument.mm b/Sources/VLXMLDocument.mm index d67999d..6865230 100644 --- a/Sources/VLXMLDocument.mm +++ b/Sources/VLXMLDocument.mm @@ -260,6 +260,14 @@ const char * sSteps = "C DbD EbE F GbG AbA BbB "; objectForInfoDictionaryKey:@"CFBundleVersion"]]]]; [identification addChild:encoding]; + NSXMLElement * misc = [NSXMLNode elementWithName:@"miscellaneous"]; + NSXMLElement * groove = [NSXMLNode elementWithName:@"miscellaneous-field" + stringValue:songGroove]; + [groove addAttribute: [NSXMLNode attributeWithName:@"name" + stringValue:@"VocalEasel-groove"]]; + [misc addChild: groove]; + [identification addChild: misc]; + return identification; } @@ -674,6 +682,12 @@ int8_t sStepToPitch[] = { error: outError] retain]; songLyricist= [[doc stringForXPath:@".//creator[@type=\"poet\"]" error: outError] retain]; + id groove = [doc stringForXPath:@".//miscellaneous-field[@name=\"VocalEasel-groove\"]" + error: outError]; + if (groove) { + [songGroove autorelease]; + songGroove = [groove retain]; + } NSXMLElement * chords = [doc nodeForXPath:@".//part[@id=\"HARM\"]" error:outError]; diff --git a/Tools/rebuildGrooves b/Tools/rebuildGrooves new file mode 100755 index 0000000..904f2ae --- /dev/null +++ b/Tools/rebuildGrooves @@ -0,0 +1,83 @@ +#!/usr/bin/ruby +# +# rebuildGrooves +# Vocalese +# +# Created by Matthias Neeracher on 2/5/07. +# Copyright (c) 2007 __MyCompanyName__. All rights reserved. +# + +require 'find' + +grooves = {} +Find.find(ARGV[0]) do |f| + if File.directory?(f) + Find.prune if File.exist?("f/MMAIGNORE") + elsif f =~ %r|.*/(\S+?).mma$| + style = $1 + g = {} + doc = "" + groove= "" + File.open(f) do |file| + inDoc = false + inCont= false + file.each do |line| + if line =~ /^\s*Begin\s+Doc\s*$/ + inDoc = true + elsif inDoc + if line =~ /^\s*End\s*$/ + inDoc = false + else + doc = doc+" "+line.strip + end + elsif line =~ /^\s*DefGroove\s+(\S+)\s+(.+?)\s*$/ + groove = $1 + gdoc = $2 + if gdoc =~ /(.*?)\s+\\\s*$/ + gdoc = $1 + inCont = true + end + g[groove] = gdoc + elsif inCont + if line =~ /^\s*(.*?)\s*(\\)?\s*$/ + g[groove] = g[groove] + " " + $1 + inCont = $2 != nil + else + inCont = false + end + end + end + end + unless g.empty? + g[".DESC"] = doc.lstrip + grooves[style] = g + end + end +end + +OUT = File.new(ARGV[1], "w") + +OUT.print <<'END_HEADER' + + + + +END_HEADER + +def xmlesc(s) + s.gsub('&', '&').gsub('<', '<').gsub('>', '&rt;') +end + +grooves.each do |style,grooves| + OUT.puts "\t#{xmlesc(style)}" + OUT.puts "\t" + grooves.each do |name,desc| + OUT.puts "\t\t#{xmlesc(name)}" + OUT.puts "\t\t#{xmlesc(desc)}" + end + OUT.puts "\t" +end + +OUT.puts "" +OUT.puts "" + diff --git a/Vocalese.xcodeproj/project.pbxproj b/Vocalese.xcodeproj/project.pbxproj index 76d0110..32cc674 100644 --- a/Vocalese.xcodeproj/project.pbxproj +++ b/Vocalese.xcodeproj/project.pbxproj @@ -46,6 +46,9 @@ 959408AE096922F7007CCCF8 /* VLModel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 955E58E4095658AB0045FDA5 /* VLModel.cpp */; }; 959420EB0B44E769006BC62C /* MainMenu.nib in Resources */ = {isa = PBXBuildFile; fileRef = 954DD4DA0B44E6000056C504 /* MainMenu.nib */; }; 959420EC0B44E77A006BC62C /* VLDocument.nib in Resources */ = {isa = PBXBuildFile; fileRef = 954DD4DF0B44E61E0056C504 /* VLDocument.nib */; }; + 9599ED960B73185800A6A2F7 /* VLGroove.nib in Resources */ = {isa = PBXBuildFile; fileRef = 9599ED940B73185800A6A2F7 /* VLGroove.nib */; }; + 9599ED9C0B731CC500A6A2F7 /* VLGrooveController.h in Copy MMA Library */ = {isa = PBXBuildFile; fileRef = 9599ED9A0B731CC500A6A2F7 /* VLGrooveController.h */; }; + 9599ED9D0B731CC500A6A2F7 /* VLGrooveController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9599ED9B0B731CC500A6A2F7 /* VLGrooveController.mm */; }; 95A1C37C0AF1D4370076597D /* Quartz.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 95A1C37B0AF1D4370076597D /* Quartz.framework */; }; 95A1C3860AF2ACE20076597D /* VLSheetWindow.mm in Sources */ = {isa = PBXBuildFile; fileRef = 95A1C3850AF2ACE20076597D /* VLSheetWindow.mm */; }; 95B3E1A70960E58B000E9C0D /* Music in Resources */ = {isa = PBXBuildFile; fileRef = 95B3E1980960E58B000E9C0D /* Music */; }; @@ -57,6 +60,7 @@ 95C461FE0B04432700649F92 /* MMA in Copy MMA Library */ = {isa = PBXBuildFile; fileRef = 95C461DD0B04430F00649F92 /* MMA */; }; 95C462000B04472E00649F92 /* mmaWrapper in Copy Tools */ = {isa = PBXBuildFile; fileRef = 95C461FF0B04472900649F92 /* mmaWrapper */; }; 95C462830B045CB700649F92 /* lilyWrapper in Copy Tools */ = {isa = PBXBuildFile; fileRef = 95C4627A0B045C8E00649F92 /* lilyWrapper */; }; + 95D0C2FC0B785D020061080E /* rebuildGrooves in Copy Tools */ = {isa = PBXBuildFile; fileRef = 95D0C2FB0B785D020061080E /* rebuildGrooves */; }; 95E04DA70AEB486E006F30A0 /* TVLLilypond.mm in Sources */ = {isa = PBXBuildFile; fileRef = 95E04DA60AEB486E006F30A0 /* TVLLilypond.mm */; }; 95E04DA80AEB4878006F30A0 /* VLDocument.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2A37F4ACFDCFA73011CA2CEA /* VLDocument.mm */; }; 95E04DA90AEB487A006F30A0 /* VLLilypondDocument.mm in Sources */ = {isa = PBXBuildFile; fileRef = 953722660AE9F0E100B6E483 /* VLLilypondDocument.mm */; }; @@ -93,6 +97,7 @@ 95C461FE0B04432700649F92 /* MMA in Copy MMA Library */, 95C461C40B043E8900649F92 /* includes in Copy MMA Library */, 95C461C50B043E8900649F92 /* lib in Copy MMA Library */, + 9599ED9C0B731CC500A6A2F7 /* VLGrooveController.h in Copy MMA Library */, ); name = "Copy MMA Library"; runOnlyForDeploymentPostprocessing = 0; @@ -103,6 +108,7 @@ dstPath = bin; dstSubfolderSpec = 7; files = ( + 95D0C2FC0B785D020061080E /* rebuildGrooves in Copy Tools */, 95C462830B045CB700649F92 /* lilyWrapper in Copy Tools */, 95C462000B04472E00649F92 /* mmaWrapper in Copy Tools */, 95C461D80B0440A300649F92 /* mma.py in Copy Tools */, @@ -167,6 +173,9 @@ 9593E4E70AE0ED1F00035816 /* vocalese.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = vocalese.icns; path = Resources/vocalese.icns; sourceTree = ""; }; 959408A0096922CA007CCCF8 /* TVLEdit */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = TVLEdit; sourceTree = BUILT_PRODUCTS_DIR; }; 959408AC096922EA007CCCF8 /* TVLEdit.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = TVLEdit.cpp; path = Tests/TVLEdit.cpp; sourceTree = ""; }; + 9599ED950B73185800A6A2F7 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/VLGroove.nib; sourceTree = ""; }; + 9599ED9A0B731CC500A6A2F7 /* VLGrooveController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLGrooveController.h; path = Sources/VLGrooveController.h; sourceTree = ""; }; + 9599ED9B0B731CC500A6A2F7 /* VLGrooveController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = VLGrooveController.mm; path = Sources/VLGrooveController.mm; sourceTree = ""; }; 95A1C37B0AF1D4370076597D /* Quartz.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quartz.framework; path = /System/Library/Frameworks/Quartz.framework; sourceTree = ""; }; 95A1C3840AF2ACE20076597D /* VLSheetWindow.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = VLSheetWindow.h; path = Sources/VLSheetWindow.h; sourceTree = ""; }; 95A1C3850AF2ACE20076597D /* VLSheetWindow.mm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.objcpp; name = VLSheetWindow.mm; path = Sources/VLSheetWindow.mm; sourceTree = ""; }; @@ -182,6 +191,7 @@ 95C461DD0B04430F00649F92 /* MMA */ = {isa = PBXFileReference; lastKnownFileType = folder; name = MMA; path = mma/MMA; sourceTree = ""; }; 95C461FF0B04472900649F92 /* mmaWrapper */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.script.sh; name = mmaWrapper; path = Tools/mmaWrapper; sourceTree = ""; }; 95C4627A0B045C8E00649F92 /* lilyWrapper */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.script.sh; name = lilyWrapper; path = Tools/lilyWrapper; sourceTree = ""; }; + 95D0C2FB0B785D020061080E /* rebuildGrooves */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; fileEncoding = 4; name = rebuildGrooves; path = Tools/rebuildGrooves; sourceTree = ""; }; 95E04DA00AEB4837006F30A0 /* TVLLilypond */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = TVLLilypond; sourceTree = BUILT_PRODUCTS_DIR; }; 95E04DA60AEB486E006F30A0 /* TVLLilypond.mm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.objcpp; name = TVLLilypond.mm; path = Tests/TVLLilypond.mm; sourceTree = ""; }; 95E04DCA0AEB4D9B006F30A0 /* Templates */ = {isa = PBXFileReference; lastKnownFileType = folder; name = Templates; path = Resources/Templates; sourceTree = ""; }; @@ -352,6 +362,8 @@ 955CBA4D0B2366DD001CF4A1 /* VLKeyValueUndo.mm */, 954DD4B70B444B220056C504 /* VLSheetViewSelection.h */, 954DD4E50B44E67F0056C504 /* VLSheetViewSelection.mm */, + 9599ED9A0B731CC500A6A2F7 /* VLGrooveController.h */, + 9599ED9B0B731CC500A6A2F7 /* VLGrooveController.mm */, ); name = Classes; sourceTree = ""; @@ -388,6 +400,7 @@ 2A37F4B9FDCFA73011CA2CEA /* Credits.rtf */, 8D15AC360486D014006FF6A4 /* Info.plist */, 089C165FFE840EACC02AAC07 /* InfoPlist.strings */, + 9599ED940B73185800A6A2F7 /* VLGroove.nib */, ); name = Resources; sourceTree = ""; @@ -435,6 +448,7 @@ 95C4627A0B045C8E00649F92 /* lilyWrapper */, 95C461FF0B04472900649F92 /* mmaWrapper */, 95C461D50B04406300649F92 /* mma.py */, + 95D0C2FB0B785D020061080E /* rebuildGrooves */, ); name = Tools; sourceTree = ""; @@ -583,6 +597,7 @@ 959420EB0B44E769006BC62C /* MainMenu.nib in Resources */, 959420EC0B44E77A006BC62C /* VLDocument.nib in Resources */, 950795E10B4A34D9008911A6 /* stop.tiff in Resources */, + 9599ED960B73185800A6A2F7 /* VLGroove.nib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -600,7 +615,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "$BUILT_PRODUCTS_DIR/VocalEasel.app/Contents/Resources/bin/mmaWrapper -g\n"; + shellScript = "$BUILT_PRODUCTS_DIR/VocalEasel.app/Contents/Resources/bin/mmaWrapper -g\n$SRCROOT/Tools/rebuildGrooves $BUILT_PRODUCTS_DIR/VocalEasel.app/Contents/Resources/share/mma/lib $BUILT_PRODUCTS_DIR/VocalEasel.app/Contents/Resources/Grooves.plist\n"; }; /* End PBXShellScriptBuildPhase section */ @@ -634,6 +649,7 @@ 95E299C00B2006F5001977D2 /* VLSheetViewLyrics.mm in Sources */, 955CBA4F0B2366DD001CF4A1 /* VLKeyValueUndo.mm in Sources */, 954DD4E60B44E67F0056C504 /* VLSheetViewSelection.mm in Sources */, + 9599ED9D0B731CC500A6A2F7 /* VLGrooveController.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -700,6 +716,14 @@ name = Credits.rtf; sourceTree = ""; }; + 9599ED940B73185800A6A2F7 /* VLGroove.nib */ = { + isa = PBXVariantGroup; + children = ( + 9599ED950B73185800A6A2F7 /* English */, + ); + name = VLGroove.nib; + sourceTree = ""; + }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */