event.h 3.36 KB
//====================================================================
// event.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 <stdio.h>
#include <stdlib.h>
#include <bstring.h>
#include <string.h>
#include <assert.h>

#include "time.h"
#include "list.h"

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

class Event 
{
  protected:    
    int         classtype;
    Time        eventTime;
    
  public:
    virtual int  Init(FILE *file)=0;
    virtual void Print()=0;
    virtual char GetType()=0;
    virtual char GetSubtype()=0;
    
    void GetTime(Time &time);
    void SetTime(const Time &time);
};

class MetaEvent : public Event
{
  protected:
    unsigned char type;
    unsigned char subtype;
    
    unsigned long len;
    
  public:
    MetaEvent();
    MetaEvent(char subtype);
    
    virtual char GetType();
    virtual char GetSubtype();
    virtual int  Init(FILE *file);
    virtual void Print();
    virtual void SetSubtype(char c);
};

class MSeqNum : public MetaEvent
{
  protected:
    unsigned short seqnum;
};

class MSetTempo : public MetaEvent
{
  protected:
    long tempo;

  public:  
    virtual int  Init(FILE *file);
    virtual void Print();

    long GetTempo();
};

class MSMPTE : public MetaEvent
{
};

class MTimeSig : public MetaEvent
{
  protected:
    char nn;    // numerator
    char dd;    // denominator
    char cc;
    char bb;
  
  public:
    virtual int  Init(FILE *file);
    virtual void Print();
};

class MKeySig : public MetaEvent
{
};

class MTextEvent : public MetaEvent
{
  protected:
    char                *ptr;   // note: this isn't null terminated
    unsigned long       len;

  public:
    MTextEvent();
    ~MTextEvent();
    virtual int  Init(FILE *file);
    virtual void Print();
};

class MEndTrack : public MetaEvent
{
};

class SysexEvent : public Event
{
};

class MIDIEvent : public Event
{
  protected:
    union {
        unsigned char   type    : 4,
                        channel : 4;
        unsigned char   byte;
    } status;

    unsigned char byte1;
    unsigned char byte2;
    
  public:
    MIDIEvent();
    MIDIEvent(char status);
    
    virtual int  Init(FILE *file);
    virtual void Print();
    virtual char GetType();
    virtual char GetSubtype();

    unsigned char GetByte1() {return byte1;}
    unsigned char GetByte2() {return byte2;}
};

class EventList : public List
{
  public:
    Event *GetIteratorValue( ListIter iter ) const
    { return (Event *) List::GetIteratorValue( iter ); }

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