1 /*---------------------------------------------------------------------------*
2   Project:  MIDI Sequencer application for AX synthesizer
3   File:     seq.h
4 
5   Copyright (C)1998-2006 Nintendo  All Rights Reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Log: seq.h,v $
14   Revision 1.2  2006/01/31 06:34:11  aka
15   Changed arguments of SEQAddSequence().
16 
17   Revision 1.1.1.1  2005/05/12 02:41:07  yasuh-to
18   Imported from dolphin tree.
19 
20     4     02/08/21 6:33p Akagi
21     Set #pragma warn_padding off around the SEQTRACK{} definition.
22 
23     3     8/16/01 12:27p Billyjack
24     added zeroBuffer offset to API
25 
26     2     5/11/01 4:17p Billyjack
27     fixed problem with songs ending and set state to SEQ_STATE_RUN
28 
29     1     5/09/01 1:28p Billyjack
30     created
31 
32   $NoKeywords: $
33  *---------------------------------------------------------------------------*/
34 #ifndef __SEQ_H__
35 #define __SEQ_H__
36 
37 #ifdef __cplusplus
38 extern "C" {
39 #endif
40 
41 #include <revolution/syn.h>
42 
43 #define SEQ_MAX_TRACKS 64
44 
45 /*---------------------------------------------------------------------------*
46     callback interface
47  *---------------------------------------------------------------------------*/
48 typedef void    (*SEQCALLBACK)(void *track, u8 controller);
49 
50 #ifdef  __MWERKS__
51 #pragma warn_padding off
52 #endif
53 
54 typedef struct _SEQTRACK
55 {
56     void        *sequence;              // pointer to parent
57     u8          *start;                 // pointer to start of track
58     u8          *end;                   // pointer to end of track
59     u8          *current;               // pointer to current read position
60     u8          status;                 // running status
61     f32         beatsPerSec;            // beats per sec
62     u32         defaultTicksPerFrame;   // ticks per audio frame
63     u32         ticksPerFrame;          // ticks per audio frame
64     u32         delay;                  // ticks to delay for next event
65     u32         state;                  // state of track
66 
67 } SEQTRACK;
68 
69 #ifdef  __MWERKS__
70 #pragma warn_padding reset
71 #endif
72 
73 typedef struct _SEQSEQUENCE
74 {
75     void        *next;                  // next sequence
76     u32         state;                  // stop, run, run looped, pause
77     u16         nTracks;                // number of sequencer tracks
78     s16         timeFormat;             // MIDI file time format
79     u32         tracksRunning;          // number of tracks still running
80     u32         end;                    // flag end of sequence
81     SYNSYNTH    synth;                  // synth used for this sequence
82     SEQCALLBACK callback[128];          // controller event callbacks
83     SEQTRACK    track[SEQ_MAX_TRACKS];  // sequencer tracks
84 
85 } SEQSEQUENCE;
86 
87 #define SEQ_STATE_STOP      0
88 #define SEQ_STATE_RUN       1
89 #define SEQ_STATE_RUNLOOPED 2
90 #define SEQ_STATE_PAUSE     3
91 
92 #define SEQ_ALL_TRACKS      0xFFFFFFFF
93 
94 /*---------------------------------------------------------------------------*
95     function prototypes
96  *---------------------------------------------------------------------------*/
97 void    SEQInit             (void);
98 void    SEQQuit             (void);
99 void    SEQRunAudioFrame    (void);
100 
101 void    SEQAddSequence(
102             SEQSEQUENCE     *sequence,          // user allocated SEQSEQUENCE
103             u8              *midiStream,        // pointer to MIDI stream
104             u8              *wavetable,         // pointer to wave table
105             u8              *samples,           // pointer to samples
106             u8              *zerobuffer,        // pointer to zero buffer
107             u32             priorityVoiceAlloc, // priority for allocating notes
108             u32             priorityNoteOn,     // priority for notes that are on
109             u32             priorityNoteRelease // priority for notes in release stage
110             );
111 
112 void    SEQRemoveSequence   (SEQSEQUENCE *sequence);
113 
114 void    SEQRegisterControllerCallback(
115             SEQSEQUENCE     *sequence,          // user initialized SEQSEQUENCE
116             u8              controller,         // MIDI controller
117             SEQCALLBACK     callback            // callback function
118             );
119 
120 void    SEQSetState         (SEQSEQUENCE *sequence, u32 state);
121 u32     SEQGetState         (SEQSEQUENCE *sequence);
122 void    SEQSetTempo         (SEQSEQUENCE *sequence, u32 track, f32 tempo);
123 f32     SEQGetTempo         (SEQSEQUENCE *sequence, u32 track);
124 void    SEQSetVolume        (SEQSEQUENCE *sequence, s32 dB);
125 s32     SEQGetVolume        (SEQSEQUENCE *sequence);
126 
127 
128 #ifdef __cplusplus
129 }
130 #endif
131 
132 #endif // __SEQ_H__
133