midifile.h 2.08 KB
//====================================================================
// midifile.h
//
// Synopsis:
//
// Author(s)
//  Steve Shepard
//
// Copyright 1993, Silicon Graphics, Inc.
// All Rights Reserved.
//
// This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
// the contents of this file may not be disclosed to third parties, copied or
// duplicated in any form, in whole or in part, without the prior written
// permission of Silicon Graphics, Inc.
//
// RESTRICTED RIGHTS LEGEND:
// Use, duplication or disclosure by the Government is subject to restrictions
// as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
// and Computer Software clause at DFARS 252.227-7013, and/or in similar or
// successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
// rights reserved under the Copyright Laws of the United States.
//====================================================================

#pragma once

#include "event.h"
#include "track.h"

#define IFF_ID_MTHD     'MThd'
#define IFF_ID_MTRK     'MTrk'

typedef struct {
    unsigned long       ckID;
    long                ckSize;
} ChunkHdr;

typedef struct {
    unsigned short      format;
    unsigned short      ntrks;
    unsigned short      division;
} TrackHdr;

int parseVarLen(unsigned long *rval, FILE *file);

class TrackList : public List
{
  public:
    Track *GetIteratorValue( ListIter iter ) const
    { return (Track *) List::GetIteratorValue( iter ); }

    void AppendData( ListIter where, Track *data )
    { List::AppendData( where, (void *) data ); }
};

class MIDIFile
{
  protected:
    FILE        *file;
    int         tracks;
    int         division;
    TrackList   trackList;
    
    int         parseFile();
    int         parseTrack(Track *track);
    int         parseEvent(Event **event);
    
  public:
    MIDIFile();
    ~MIDIFile();
    
    int         Open(const char *name, const char *rw);
    int         Close();

    int         GetTrackCount();
    Event       *GetNextEvent(int track);
    int         GetDivision() {return division;}
    
    void        Print();
};