Develop and Download Open Source Software

Browse Subversion Repository

Contents of /trunk/MD_package/MDSequence.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 183 - (show annotations) (download) (as text)
Wed Mar 4 13:15:43 2020 UTC (4 years, 2 months ago) by toshinagata1964
File MIME type: text/x-chdr
File size: 11174 byte(s)
Internal errors during SMF saving are reported to the user
1 /*
2 * MDSequence.h
3 *
4 * Created by Toshi Nagata on Sun Jun 17 2001.
5
6 Copyright (c) 2000-2016 Toshi Nagata. All rights reserved.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation version 2 of the License.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16 */
17
18 #ifndef __MDSequence__
19 #define __MDSequence__
20
21 /* シーケンスをあらわす構造体。シーケンスは、コンダクタートラックと MIDI トラック
22 (複数可)から成る。 */
23 typedef struct MDSequence MDSequence;
24
25 /* シーケンス中の全トラック中の全イベントをティック順に取り出すための仕掛け。 */
26 /* typedef struct MDMerger MDMerger; */
27
28 /* コピー/ペースト実装のための内部データ */
29 typedef struct MDCatalogTrack {
30 int originalTrackNo;
31 char name[64];
32 int numEvents;
33 int numMIDIEvents;
34 } MDCatalogTrack;
35
36 typedef struct MDCatalog {
37 int num; /* Number of tracks */
38 MDTickType startTick, endTick; /* Editing range */
39 MDCatalogTrack catTrack[1];
40 } MDCatalog;
41
42 #ifndef __MDTrack__
43 #include "MDTrack.h"
44 #endif
45
46 #ifndef __MDCalibrator__
47 #include "MDCalibrator.h"
48 #endif
49
50 #ifdef __cplusplus
51 extern "C" {
52 #endif
53
54 /* -------------------------------------------------------------------
55 MDSequence functions
56 ------------------------------------------------------------------- */
57
58 /* 新しい MDSequenceRecord をアロケートする。メモリ不足の場合は NULL を返す。
59 MDTrackNew() に対応する dispose や delete 関数は無い。代わりに MDTrackRelease()
60 を使用すること。 */
61 MDSequence * MDSequenceNew(void);
62
63 /* MDSequence の retain/release。 */
64 void MDSequenceRetain(MDSequence *inSequence);
65 void MDSequenceRelease(MDSequence *inSequence);
66
67 /* MDTrack に含まれているトラックをすべてクリアする。 */
68 void MDSequenceClear(MDSequence *inSequence);
69
70 /* タイムベースを変更する。(イベントの内部データは変更されない) */
71 void MDSequenceSetTimebase(MDSequence *inSequence, int32_t inTimebase);
72
73 /* タイムベースを得る。 */
74 int32_t MDSequenceGetTimebase(const MDSequence *inSequence);
75
76 /* 含まれているトラックの数を返す(コンダクタートラックを含む)。 */
77 int32_t MDSequenceGetNumberOfTracks(const MDSequence *inSequence);
78
79 /* シーケンスの長さ(tick 単位)を返す。 */
80 MDTickType MDSequenceGetDuration(const MDSequence *inSequence);
81
82 /* index 番目のトラック(先頭=コンダクタートラックが0)を返す */
83 MDTrack * MDSequenceGetTrack(const MDSequence *inSequence, int32_t index);
84
85 /* トラックが MDSequence に含まれているかどうかを調べる。含まれていればトラック番号、なければ -1 を返す */
86 int32_t MDSequenceFindTrack(const MDSequence *inSequence, const MDTrack *inTrack);
87
88 /* index 番目にトラックを挿入する。index が大きすぎるかまたは -1 の場合にはトラック
89 リストの末尾に挿入する。実際に挿入した位置を返す。 */
90 int32_t MDSequenceInsertTrack(MDSequence *inSequence, int32_t index, MDTrack *inTrack);
91
92 /* index 番目のトラックを削除する。削除されたトラックは MDTrackRelease() される。
93 実際に挿入したトラックの番号を返す。 */
94 int32_t MDSequenceDeleteTrack(MDSequence *inSequence, int32_t index);
95
96 /* index 番目のトラックを新しいトラックで置き換える。置き換えられたトラックは
97 MDTrackRelease() される。index が大きすぎる場合には何もせず -1 を返す。 */
98 int32_t MDSequenceReplaceTrack(MDSequence *inSequence, int32_t index, MDTrack *inTrack);
99
100 /* index 番目のトラックの Record フラグをセットする。flag = 0: OFF, 1: ON, -1: toggle。Record フラグが変更された場合は non-zero, 変更されなかった場合は 0 を返す。
101 トラックの Record フラグが新たにセットされた場合は、他のトラックの Record フラグは自動的にリセットされる。 */
102 int MDSequenceSetRecordFlagOnTrack(MDSequence *inSequence, int32_t index, int flag);
103
104 /* index 番目のトラックの Solo フラグをセットする。flag = 0: OFF, 1: ON, -1: toggle
105 この他のトラックの MuteBySolo フラグも更新される。 */
106 int MDSequenceSetSoloFlagOnTrack(MDSequence *inSequence, int32_t index, int flag);
107
108 /* index 番目のトラックの Mute フラグをセットする。flag = 0: OFF, 1: ON, -1: toggle */
109 int MDSequenceSetMuteFlagOnTrack(MDSequence *inSequence, int32_t index, int flag);
110
111 /* MuteBySolo フラグを更新する。Solo フラグを変更したあと呼び出す。 */
112 void MDSequenceUpdateMuteBySoloFlag(MDSequence *inSequence);
113
114 /* Record フラグが立っているトラックの番号を得る。なければ -1 を返す。 */
115 int32_t MDSequenceGetIndexOfRecordingTrack(MDSequence *inSequence);
116
117 /* Single channel mode に移行する。Single channel mode では、すべての MIDI イベントのチャンネルは0になり、実際に MIDI チャンネルが必要な時(MIDI入出力時、およびSMFのインポート/エキスポート時)にはトラックチャンネルの値が使われる。 */
118 /* separate が non-zero ならば、すべてのトラックの内容がチェックされ、複数のチャンネルにまたがっているトラックはチャンネルごとに分割される。各トラックごとのMIDIチャンネルが一つになったあと、その値がトラックチャンネルがセットされ、MIDIイベントのチャンネルの値は0になる。 */
119 MDStatus MDSequenceSingleChannelMode(MDSequence *inSequence, int separate);
120
121 /* Multi channel mode に移行する。MIDIイベントのchannelフィールドにトラックチャンネルの値をセットする。デフォルトは multi channel mode。 */
122 MDStatus MDSequenceMultiChannelMode(MDSequence *inSequence);
123
124 /* Single channel mode なら non-zero, multi channel mode なら 0 を返す。 */
125 int MDSequenceIsSingleChannelMode(const MDSequence *inSequence);
126
127 /* MDSequenceReadSMF(), MDSequenceWriteSMF() で使うコールバック。処理の進行度 (0.0-1.0) と任意のポインタを渡し、
128 通常は 1, ユーザーがキャンセルを要求したら 0 を返す。 */
129 typedef int (*MDSequenceCallback)(float, void *);
130
131 /* ファイル(ストリーム)から SMF を読み込む。読み込みに失敗したらエラーコードを返す。
132 この時 MDSequence の内容は空になる。 */
133 MDStatus MDSequenceReadSMF(MDSequence *inSequence, STREAM stream, MDSequenceCallback callback, void *cbdata);
134
135 /* ファイル(ストリーム)に SMF を書き出す。途中で失敗したら中断してエラーコードを返す。 */
136 MDStatus MDSequenceWriteSMF(MDSequence *inSequence, STREAM stream, MDSequenceCallback callback, void *cbdata, STREAM err_stream);
137
138 /* ファイル(ストリーム)に選択されたイベントを SMF として書き出す。i 番目のトラックの選択は psetArray[i] で指示され、これが NULL ならそのトラックはスキップ、有効な IntGroup ならそれが指定するイベントを書き出し、(IntGroup *)(-1) ならそのトラック中のすべてのイベントを書き出す。IntGroup を指定したときは、end-of-track を選択しているかどうかを eotSelectFlags[i] で指示することができる。 */
139 MDStatus MDSequenceWriteSMFWithSelection(MDSequence *inSequence, IntGroup **psetArray, char *eotSelectFlags, STREAM stream, MDSequenceCallback callback, void *cbdata, STREAM err_stream);
140
141 /* ストリームに MDCatalog を書き出す。 */
142 MDStatus MDSequenceWriteCatalog(MDCatalog *inCatalog, STREAM stream);
143
144 /* ストリームから MDCatalog の内容を読み出し、新たに malloc した MDCatalog に格納して返す。 */
145 MDCatalog *MDSequenceReadCatalog(STREAM stream);
146
147 /* MDCalibrator をアタッチ・デタッチする */
148 void MDSequenceAttachCalibrator(MDSequence *inSequence, MDCalibrator *inCalib);
149 void MDSequenceDetachCalibrator(MDSequence *inSequence, MDCalibrator *inCalib);
150
151 /* MDCalibrator をすべてリセットする。 */
152 void MDSequenceResetCalibrators(MDSequence *inSequence);
153
154 /* Lock/Unlock MDSequence (for multithread application) */
155 MDStatus MDSequenceCreateMutex(MDSequence *inSequence);
156 MDStatus MDSequenceDisposeMutex(MDSequence *inSequence);
157 void MDSequenceLock(MDSequence *inSequence);
158 void MDSequenceUnlock(MDSequence *inSequence);
159 int MDSequenceTryLock(MDSequence *inSequence);
160
161 #if 0
162 /* -------------------------------------------------------------------
163 MDMerger functions
164 ------------------------------------------------------------------- */
165
166 /* 新しい MDMerger をアロケートする。メモリ不足の場合は NULL を返す。 */
167 MDMerger * MDMergerNew(MDSequence *inSequence);
168
169 /* Retain/release */
170 void MDMergerRetain(MDMerger *inMerger);
171 void MDMergerRelease(MDMerger *inMerger);
172
173 /* 新しい MDMerger をアロケートし、その内容を inSrc と同じにする */
174 MDMerger * MDMergerDuplicate(const MDMerger *inSrc);
175
176 /* MDSequence との関係付けを変更する。 */
177 MDStatus MDMergerSetSequence(MDMerger *inMerger, MDSequence *inSequence);
178
179 /* 関係付けられた MDSequence を返す。 */
180 MDSequence * MDMergerGetSequence(MDMerger *inMerger);
181
182 /* 内部情報を完全に更新する。 */
183 void MDMergerReset(MDMerger *inMerger);
184
185 /* inTick より小さくない tick 値を持つ最初のイベントの位置に移動する。そのような
186 イベントが存在しなければ末尾以降に移動し、0 (false) を返す。 */
187 int MDMergerJumpToTick(MDMerger *inMerger, MDTickType inTick);
188
189 /* 現在のイベントへのポインタを得る。存在しないイベントを指している場合は NULL を返す。 */
190 MDEvent * MDMergerCurrent(const MDMerger *inMerger);
191
192 /* 1つ先の位置に進み、そのイベントへのポインタを得る。最後のイベントを越えた場合は
193 NULL を返す。 */
194 MDEvent * MDMergerForward(MDMerger *inMerger);
195
196 /* 1つ前の位置に戻り、そのイベントへのポインタを得る。先頭のイベントを越えた場合は
197 NULL を返す。 */
198 MDEvent * MDMergerBackward(MDMerger *inMerger);
199
200 /* 現在のイベントが属するトラック番号を得る。 */
201 int32_t MDMergerGetCurrentTrack(MDMerger *inMerger);
202
203 /* 現在のイベントのトラック内での位置(番号)を得る。 */
204 int32_t MDMergerGetCurrentPositionInTrack(MDMerger *inMerger);
205
206 /* 現在のイベントのティックを得る。 */
207 MDTickType MDMergerGetTick(MDMerger *inMerger);
208
209 #endif
210
211 #ifdef __cplusplus
212 }
213 #endif
214
215 #endif /* __MDSequence__ */

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26