1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
/*
ZynAddSubFX - a software synthesizer
Sequencer.h - The Sequencer
Copyright (C) 2003-2005 Nasca Octavian Paul
Author: Nasca Octavian Paul
This program is free software; you can redistribute it and/or modify
it under the terms of version 2 of the GNU General Public License
as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License (version 2) for more details.
You should have received a copy of the GNU General Public License (version 2)
along with this program; if not, write to the Free Software Foundation,
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef SEQUENCER_H
#define SEQUENCER_H
#include "../globals.h"
#include "MIDIEvents.h"
#include "MIDIFile.h"
class Sequencer:public MIDIEvents{
public:
Sequencer();
~Sequencer();
//theese functions are called by the master and are ignored if the recorder/player are stopped
void recordnote(char chan, char note, char vel);
void recordcontroller(char chan,unsigned int type,int par);
//this is only for player
//it returns 1 if this must be called at least once more
//it returns 0 if there are no more notes for the current time
//or -1 if there is no note
int getevent(char ntrack, int *midich,int *type,int *par1, int *par2);
//returns 0 if ok or -1 if there is a error loading file
int importmidifile(char *filename);
void startplay();
void stopplay();
int play;
int playspeed;//viteza de rulare (0.1x-10x), 0=1.0x, 128=10x
void setplayspeed(int speed);
private:
MIDIFile midifile;
/* Timer */
struct timestruct{
double abs;//the time from the begining of the track
double rel;//the time difference between the last and the current event
double last;//the time of the last event (absolute, since 1 Jan 1970)
//theese must be double, because the float's precision is too low
//and all theese represents the time in seconds
} playtime[NUM_MIDI_TRACKS];
void resettime(timestruct *t);
void updatecounter(timestruct *t);//this updates the timer values
/* Player only*/
struct {
event ev;
double time;
} nextevent[NUM_MIDI_TRACKS];
double realplayspeed;
};
#endif
|