MusicKit  0.0.0
_scorefile.h
00001 /*
00002   $Id$
00003   Defined In: The MusicKit
00004   Description:
00005     Functions for writing and reading text and binary score files.
00006 
00007   Original Author: David A. Jaffe
00008 
00009   Copyright (c) 1988-1992, NeXT Computer, Inc.
00010   Portions Copyright (c) 1994 NeXT Computer, Inc. and reproduced under license from NeXT
00011   Portions Copyright (c) 1994 Stanford University  
00012   Portions Copyright (c) 1999-2005, The MusicKit Project.
00013 */
00014 
00015 #ifndef __MK__scorefile_H___
00016 #define __MK__scorefile_H___
00017 
00018 #import <Foundation/Foundation.h>
00019 
00020 #import "_MKNameTable.h"
00021 
00022 typedef struct __MKScoreInStruct { 
00023     double timeTag;                 /* Time of most recently read note. */
00024     id part;                        /* part to which current note goes.*/
00025     BOOL isInBody;                  /* YES if we've already parsed the header 
00026                                      */
00027     NSMutableData *printStream;          /* Stream used for scorefile print output */
00028     BOOL _freeStream;               /* YES if stream was auto-created to
00029                                        go to stderr */
00030     void *_parsePtr;                /* Private pointer to parse state. */
00031     _MKNameTable *_symbolTable;     /* Private symbol table used for parse. */
00032     NSMutableDictionary *_noteTagTable; /* Private map to unique set of noteTags.*/
00033     int _fileHighTag,_fileLowTag;   /* Private. Tag range. */
00034     int _newLowTag;                 /* Private. Tag base for noteTag map. */
00035     id _aNote;                      /* Private. parser 'owns' note. */
00036     char *_ranState;                /* Private. So each file has its own random
00037                                        sequence. */
00038     id _owner;                      /* Private. Where to put part decls. */
00039     int _errCount;                  /* Error count. */
00040     NSMutableArray *_binaryIndexedObjects; /* List of indexed objects. */
00041     BOOL _binary;
00042     void *_repeatStack;
00043 } _MKScoreInStruct;
00044 
00045 typedef struct __MKScoreOutStruct { 
00046     double timeTag;                  /* Time of most recently written note,
00047                                         including timeShift. */
00048     BOOL isInBody;                   /* YES if first note has been written. */
00049     NSMutableData *_stream;          /* The output file. */
00050     id _owner;                       /* Private */
00051     _MKNameTable *_nameTable;        /* Private */
00052     BOOL _ownerIsNoteRecorder;       /* Private. */
00053     double _timeShift;               /* Added to time tags before writing. */ 
00054     long _tagRangePos;
00055     NSMapTable *_binaryIndecies;     /* For encoding objects in binary files. (mapping from object to index) */
00056     int _highBinaryIndex;            /* Currently highest index. */
00057     BOOL _binary;
00058 } _MKScoreOutStruct;
00059 
00060 /* Functions for writing score files: */
00061 extern _MKScoreOutStruct *
00062 _MKInitScoreOut(NSMutableData *fileStream, id owner, MKNote *anInfoNote,
00063                   double timeShift, BOOL isNoteRecorder, BOOL binary);
00064 extern _MKScoreOutStruct *
00065   _MKWritePartDecl(MKPart *part, _MKScoreOutStruct *p, MKNote *aPartInfo);
00066 extern _MKScoreOutStruct *
00067   _MKWriteNote(MKNote *aNote, MKPart *aPart, _MKScoreOutStruct *scoreWPtr);
00068 extern _MKScoreOutStruct *
00069   _MKFinishScoreOut(_MKScoreOutStruct *scoreWPtr, BOOL writeEnd);
00070 
00071 /* Functions for reading score files: */
00072 extern void _MKParseScoreHeader(_MKScoreInStruct *scorefileRPtr);
00073 extern _MKScoreInStruct *_MKNewScoreInStruct(NSData *aStream,id owner,
00074                     NSMutableData *printStream,
00075                     BOOL mergeParts,NSString *name,unsigned int *pointer);
00076 extern BOOL _MKParseScoreHeaderStmt(_MKScoreInStruct *scorefileRPtr);
00077 extern id _MKParseScoreNote(_MKScoreInStruct * scorefileRPtr);
00078 extern _MKScoreInStruct *_MKFinishScoreIn(_MKScoreInStruct *scorefileRPtr);
00079 
00080 extern const char *_MKTranstab(); /* defined in parseScore.m */
00081 
00082 /* functions for writing binary scorefiles */
00083 extern void _MKWriteIntPar(NSMutableData *aStream,int anInt);
00084 extern void _MKWriteDoublePar(NSMutableData *aStream,double aDouble);
00085 extern void _MKWriteStringPar(NSMutableData *aStream,NSString *aString);
00086 extern void _MKWriteVarPar(NSMutableData *aStream,NSString *aString);
00087 extern void _MKWriteInt(NSMutableData *aStream,int anInt);
00088 extern void _MKWriteShort(NSMutableData *aStream,short anShort);
00089 extern void _MKWriteDouble(NSMutableData *aStream,double aDouble);
00090 extern void _MKWriteChar(NSMutableData *aStream,char aChar);
00091 extern void _MKWriteString(NSMutableData *aStream,char *aString);
00092 extern void _MKWriteNSString(NSMutableData *aStream,NSString *aString);
00093 extern void _MKWriteFloat(NSMutableData *aStream,float aFloat);
00094 
00095 #define _MK_BINARYSCOREFILEEXT @"playscore"
00096 #define _MK_SCOREFILEEXT @"score"
00097 
00098 #endif