#ifndef _POSITION_H_
#define _POSITION_H_
#include "atom.h"
class Part;
class ostream;
class Tuplet;
/**
* The class Position is a very important class. It contains all convenience methods to convert the simple linear time (the ticks, stored as an long int) into
* the three dimensional position presentation (bars, beats and ticks within the beat) an vice versa.
**/
class Position : public Atoma
{
private:
long totalTicks;
int modulo(int m) const { return totalTicks%m; }
int Meter(int,Part*) const;
public:
/**
* Default Constructor
**/
Position();
/**
* Constructs a position with the initial value p
**/
Position(long p);
/**
* Constructs a position with the initial value bar.beat.tick
**/
Position(int bar, int beat, int tick);
/**
* Constructs a position with the format "bar.beat.tick" given as a char*
**/
Position(char * str, int);
/**
* Copy Constructor
**/
Position(const Position&);
/**
* Returns the linear time, measured in ticks
**/
long ticks() const { return totalTicks; }
/**
* depricated
**/
long negative();
/**
* Returns the bar value of the position
**/
int bar() const;
/**
* Returns the beat value of the position
**/
int beat() const;
/**
* Returns the tick value of the position
**/
int tick() const;
/**
* Returns true if this position and other are located within the same bar
**/
bool sameBar(Position & other) const;
/**
* Returns true if this position and other are located within the same bar and the same beat
**/
bool sameBeat(Position & other) const;
/**
* Returns true if this position is located within the same bar or greater than the other
**/
bool sameBarOrGreater(Position & other) const;
/**
* This method presents the position in the bar.beat.tick format.
* It sets the first three parameters bar, beat and tick according to the parameters master (specifying the mastertrack's part),
* meter0 and meter1 (specifying the denominator and the numerator of the global meter).
* Usually this method is not needed, since the position obtains the master and meter information from the global song instance.
* Alternatively try the gBBT method with three parameters.
**/
void gBBT(int & bar, int & beat, int & tick, Part * master, int & meter0, int & meter1, bool returnMeter=false) const;
/**
* This method presents the position in the bar.beat.tick format.
* It sets the first three parameters bar, beat and tick according to the songs mastertrack and global meter values
**/
void gBBT(int & bar, int & beat, int & tick) const;
/**
* This method moves the position to the beginning of the next bar
**/
void nextBar();
/**
* This method moves the position to the beginning of the next beat
**/
void nextBeat();
/**
* This method moves the position to the beginning of the previous bar
**/
void prevBar();
/**
* Rounds off the position to the grid specified by the res parameter (resoloution).
* For Tuplets it is required to provide the Tuplet instance in order to obtain sensible values.
**/
void snap(int res, Tuplet * tuplet = 0);
/**
* Assignment Operator
**/
Position & operator=(const Position&);
/**
* Assignment Operator
**/
Position & operator=(long);
/**
* Sets the position by the format bar.beat.tick, while specifying the mastertrack's part and optionally the global meter.
* The snap parameter rounds off the position to the specified value.
**/
Position & set(int bar, int beat, int tick, Part * master, int m0=0, int m1=0, int snap=0);
/**
* Increases the position by the specified value
**/
Position & operator+=(Position);
/**
* Decreases the position by the specified value
**/
Position & operator-=(Position);
/**
* Multiplies the position by the specified value
**/
double operator*(double);
/**
* Adds two positions
**/
friend Position operator+(Position,Position);
/**
* Subtracts a positions from another position
**/
friend Position operator-(Position,Position);
/**
* Adds two positions
**/
friend long operator+(Position,long);
/**
* Subtracts a positions from another position
**/
friend long operator-(Position,long);
/**
* Returns true if two positions are equal
**/
friend bool operator==(Position,Position);
/**
* Returns true if two positions are equal
**/
friend bool operator==(Position,long);
/**
* Returns true if two positions are not equal
**/
friend bool operator!=(Position,Position);
/**
* Returns true if two positions are not equal
**/
friend bool operator!=(Position,long);
/**
* Compares two positions
**/
friend bool operator<(Position,Position);
/**
* Compares two positions
**/
friend bool operator<=(Position,Position);
/**
* Compares two positions
**/
friend bool operator>(Position,Position);
/**
* Compares two positions
**/
friend bool operator>=(Position,Position);
/**
* Increases the position by one tick
**/
friend Position & operator++(Position&,int);
/**
* Sends the position p (in the bar.beat.tick format) to the stream s
**/
friend ostream & operator<<(ostream & s, const Position & p);
/**
* Implementation of the print method
**/
virtual ostream & print(int,ostream&) const;
/**
* Implementation of the flush method
**/
virtual void flush(const char*) const;
/**
* Implementation of the copy method
**/
virtual Element * copy() const;
/**
* Always returns false, since positions never are events
**/
virtual bool isEvent() const { return false; }
};
#endif
| Generated by: wuerthne on al on Sun Jan 6 22:32:42 2002, using kdoc 2.0a53. |