Add an example demonstrating use of sequencer API.
[calfbox.git] / seq.h
blob47970b1876438122326b41852d3424b78695abca
1 /*
2 Calf Box, an open source musical instrument.
3 Copyright (C) 2010-2011 Krzysztof Foltman
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #ifndef CBOX_SEQ_H
20 #define CBOX_SEQ_H
22 #include <stdint.h>
24 #include "midi.h"
26 struct cbox_midi_pattern;
27 struct cbox_track;
28 struct cbox_song;
30 /////////////////////////////////////////////////////////////////////////////////////////////////////
32 struct cbox_midi_playback_active_notes
34 uint16_t channels_active;
35 uint32_t notes[16][4]; // 0..127
38 extern void cbox_midi_playback_active_notes_init(struct cbox_midi_playback_active_notes *notes);
39 extern int cbox_midi_playback_active_notes_release(struct cbox_midi_playback_active_notes *notes, struct cbox_midi_buffer *buf);
41 /////////////////////////////////////////////////////////////////////////////////////////////////////
43 struct cbox_midi_pattern_playback
45 struct cbox_midi_event *events;
46 int event_count;
49 /////////////////////////////////////////////////////////////////////////////////////////////////////
51 struct cbox_midi_clip_playback
53 struct cbox_midi_pattern_playback *pattern;
54 struct cbox_master *master;
56 int pos;
57 int rel_time_samples;
58 // [start, end) of the pattern slice
59 int start_time_samples, end_time_samples;
60 int item_start_ppqn, min_time_ppqn;
61 int offset_ppqn;
62 struct cbox_midi_playback_active_notes *active_notes;
65 extern void cbox_midi_clip_playback_init(struct cbox_midi_clip_playback *pb, struct cbox_midi_playback_active_notes *active_notes, struct cbox_master *master);
66 extern void cbox_midi_clip_playback_render(struct cbox_midi_clip_playback *pb, struct cbox_midi_buffer *buf, int offset, int nsamples);
67 extern void cbox_midi_clip_playback_seek_ppqn(struct cbox_midi_clip_playback *pb, int time_ppqn, int skip_this_pos);
68 extern void cbox_midi_clip_playback_seek_samples(struct cbox_midi_clip_playback *pb, int time_samples);
69 extern void cbox_midi_clip_playback_set_pattern(struct cbox_midi_clip_playback *pb, struct cbox_midi_pattern_playback *pattern, int start_time_samples, int end_time_samples, int item_start_ppqn, int offset_ppqn);
71 /////////////////////////////////////////////////////////////////////////////////////////////////////
73 // all times in this structure are in PPQN
74 struct cbox_track_playback_item
76 uint32_t time;
77 struct cbox_midi_pattern_playback *pattern;
78 uint32_t offset;
79 uint32_t length;
80 // in future, it should also contain a pre-calculated list of notes to release
83 struct cbox_track_playback
85 struct cbox_track_playback_item *items;
86 struct cbox_master *master;
87 int items_count;
88 int pos;
89 struct cbox_midi_buffer output_buffer;
90 struct cbox_midi_clip_playback playback;
91 struct cbox_midi_playback_active_notes active_notes;
94 extern struct cbox_track_playback *cbox_track_playback_new_from_track(struct cbox_track *track, struct cbox_master *master, struct cbox_song_playback *spb);
95 extern void cbox_track_playback_render(struct cbox_track_playback *pb, int offset, int nsamples);
96 extern void cbox_track_playback_seek_ppqn(struct cbox_track_playback *pb, int time_ppqn, int min_time_ppqn);
97 extern void cbox_track_playback_seek_samples(struct cbox_track_playback *pb, int time_samples);
98 extern void cbox_track_playback_start_item(struct cbox_track_playback *pb, int time, int is_ppqn, int skip_this_pos);
99 extern void cbox_track_playback_destroy(struct cbox_track_playback *pb);
101 /////////////////////////////////////////////////////////////////////////////////////////////////////
103 struct cbox_tempo_map_item
105 uint32_t time_ppqn;
106 uint32_t time_samples;
107 double tempo;
108 int timesig_nom, timesig_denom;
109 // should also have a bar/beat position to make things easier
112 /////////////////////////////////////////////////////////////////////////////////////////////////////
114 struct cbox_song_playback
116 struct cbox_master *master;
117 struct cbox_track_playback **tracks;
118 int track_count;
119 struct cbox_tempo_map_item *tempo_map_items;
120 int tempo_map_item_count;
121 int tempo_map_pos;
122 uint32_t song_pos_samples, song_pos_ppqn, min_time_ppqn;
123 uint32_t loop_start_ppqn, loop_end_ppqn;
124 GHashTable *pattern_map;
127 extern struct cbox_song_playback *cbox_song_playback_new(struct cbox_song *song, struct cbox_master *master);
128 extern void cbox_song_playback_render(struct cbox_song_playback *spb, struct cbox_midi_buffer *output, int nsamples);
129 extern int cbox_song_playback_active_notes_release(struct cbox_song_playback *spb, struct cbox_midi_buffer *buf);
130 extern void cbox_song_playback_seek_ppqn(struct cbox_song_playback *spb, int time_ppqn, int skip_this_pos);
131 extern void cbox_song_playback_seek_samples(struct cbox_song_playback *spb, int time_samples);
132 extern int cbox_song_playback_tmi_from_ppqn(struct cbox_song_playback *spb, int time_ppqn);
133 extern int cbox_song_playback_tmi_from_samples(struct cbox_song_playback *spb, int time_samples);
134 struct cbox_midi_pattern_playback *cbox_song_playback_get_pattern(struct cbox_song_playback *spb, struct cbox_midi_pattern *pattern);
135 extern void cbox_song_playback_destroy(struct cbox_song_playback *spb);
137 #endif