// **********************************************
// File: OBJECTS.H
// Musical objects header file

#include "muzika.h"

// --- Object class codes
const O_NOTE = 5;
const O_PAUSE = 6;
const O_KEY = 7;
const O_BEAT = 8;
const O_BAR = 9;
const O_LOUDNESS = 10;
const O_CRESCENDO = 11;
const O_TEXT = 12;

// **********************************************
// Definitions of the various musical classes

class Note : virtual public PointObject {
  protected:
    int _Y;
    int _duration;

  public:
    Note(int X, int Y, int duration);
    Note(istream &);
    Note(void far *&);
    virtual void Draw(HDC);
    virtual void Format(int &);
    virtual void MIDIPlay(ostream &, int);
    virtual int Duration() {return _duration;}
    virtual void printOn(ostream &) const;
    virtual void clipOn(void far *&) const;
};

class Pause : virtual public PointObject {
  protected:
    int _duration;

  public:
    Pause(int X, int duration);
    Pause(istream &);
    Pause(void far *&);
    virtual void Draw(HDC);
    virtual void Format(int &);
    virtual void MIDIPlay(ostream &, int);
    virtual int Duration() {return _duration;}
    virtual void printOn(ostream &) const;
    virtual void clipOn(void far *&) const;
};

class Key : virtual public PointObject {
  protected:
    enum {LOCATION = 15};
    int _type;

  public:
    Key(int X, int type);
    Key(istream &);
    Key(void far *&);
    virtual void Draw(HDC);
    virtual void Format(int &);
    virtual int Width() {return WidthRound(2*pixelsPerObject+LOCATION);}
    virtual void printOn(ostream &) const;
    virtual void clipOn(void far *&) const;
};

class Beat : virtual public PointObject {
  protected:
    int _type;

  public:
    Beat(int X, int type);
    Beat(istream &);
    Beat(void far *&);
    virtual void Draw(HDC);
    virtual void Format(int &);
    virtual void printOn(ostream &) const;
    virtual void clipOn(void far *&) const;
};

class Bar : virtual public PointObject {
  protected:
    int _type;

  public:
    Bar(int X, int type);
    Bar(istream &);
    Bar(void far *&);
    virtual void Draw(HDC);
    virtual void Format(int &);
    virtual int Width()
      {return _type != STARTBAR && _type != ENDBAR ? pixelsPerObject : 0;}
    virtual void printOn(ostream &) const;
    virtual void clipOn(void far *&) const;
};

class Loudness : virtual public PointObject {
  protected:
    int _loudness;

  public:
    Loudness(int X, int loudness);
    Loudness(istream &);
    Loudness(void far *&);
    virtual void Draw(HDC);
    virtual void Format(int &);
    virtual void printOn(ostream &) const;
    virtual void clipOn(void far *&) const;
};

class Crescendo : virtual public ContinuousObject {
  protected:
    int _direction;

  public:
    Crescendo(int Xleft, int Xright, int direction);
    Crescendo(istream &);
    Crescendo(void far *&);
    virtual void Draw(HDC);
    virtual void printOn(ostream &) const;
    virtual void clipOn(void far *&) const;
};

class Text : virtual public PointObject {
  protected:
    int _Y;
    char _text[MAXTEXT];

  public:
    Text(int X, int Y, char *);
    Text(istream &);
    Text(void far *&);
    virtual void Draw(HDC);
    virtual void Format(int &);
    virtual void printOn(ostream &) const;
    virtual void clipOn(void far *&) const;
};
