//
// File: VLMMADocument.mm - Export document in MMA format
//
// Author(s):
//
//      (MN)    Matthias Neeracher
//
// Copyright © 2006-2007 Matthias Neeracher
//

#import "VLMMADocument.h"
#import "VLMMAWriter.h"

@implementation VLDocument (MMA)

- (NSData *)mmaDataWithError:(NSError **)outError
{
	char		buf[32];
	NSBundle *	bndl = [NSBundle mainBundle];
	VLMMAWriter	writer(playElements & kVLPlayGroovePreview, 
					   previewRange.location, 
					   previewRange.location+previewRange.length);

	writer.Visit(*song);
	std::string	mmaFile = std::string("// Generated by VocalEasel ")
		+ (const char *)[[bndl objectForInfoDictionaryKey:@"CFBundleVersion"]
							UTF8String]
		+ "\n\n";
	sprintf(buf, "Tempo %ld\n", lround(songTempo));
	mmaFile	+= buf;
	if (playElements & kVLPlayGroovePreview) {
		//
		// Override all other flags
		//
		mmaFile += "Groove ";
		mmaFile += [songGroove UTF8String];
		mmaFile += "\nSolo Off\n";
	} else {
		if (playElements & kVLPlayCountIn)
			switch ([[self songTime] intValue]) {
			case 0x404:
				mmaFile	+= "Groove Metronome2-4\nz\nz\n";
				break;
			case 0x304:
			case 0x608:
				mmaFile	+= "Groove Metronome3\nz\nz\n";
				break;
			default:
				// Can't handle these yet
				break;
			}
        mmaFile += "Solo Voice AltoSax\nSolo Volume fff\n";
	}
	mmaFile += '\n'+writer.Measures();	

	return [[NSString stringWithUTF8String:mmaFile.c_str()] 
			   dataUsingEncoding:NSUTF8StringEncoding];
}

- (NSFileWrapper *)mmaFileWrapperWithError:(NSError **)outError
{
	NSData * data = [self mmaDataWithError:outError];
	
	if (!data)
		return nil;
	else
		return [[[NSFileWrapper alloc] 
					initRegularFileWithContents:data]
				   autorelease];
}

@end