uMIDI
The swiss army knife for quick and easy developement of MIDI applications.
sequencer.h
Go to the documentation of this file.
1 
4 /*
5  * Copyright 2015 Sebastian Neuser
6  *
7  * This file is part of the uMIDI firmware.
8  *
9  * The MIDI volume controller firmware is free software: you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation, either version 3 of the License, or
12  * (at your option) any later version.
13  *
14  * The uMIDI firmware is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with the uMIDI firmware. If not, see <http://www.gnu.org/licenses/>.
21  */
22 
23 #ifndef _SEQUENCER_H
24 #define _SEQUENCER_H
25 
26 
27 //---------------- includes ----------------//
28 #include <stdbool.h>
29 #include <stdint.h>
30 
31 #include "gpio.h"
32 #include "math.h"
33 #include "midi.h"
34 #include "wave.h"
35 
36 
37 //---------------- constants ----------------//
38 
40 #define SEQUENCER_STEPS_PER_PATTERN 16
41 
42 
43 //---------------- data types ----------------//
44 
47 {
69 };
70 
73 {
79 };
80 
83 {
86 };
87 
92 {
97 };
98 
102 {
103  uint8_t length;
105 };
106 
114 {
116  uint8_t speed;
118  bool running;
119  uint8_t step_index;
120  struct wave wave;
121  bool clock_state;
122  void (*tick_callback)(void);
123 };
124 
125 
126 //---------------- functions and procedures ----------------//
136 
145 
155 
163 void copy_pattern(enum sequencer_pattern_number source, enum sequencer_pattern_number destination);
164 
170 char* export_pattern(enum sequencer_pattern_number number);
171 
176 uint8_t get_pattern_length(enum sequencer_pattern_number pattern);
177 
184 struct sequencer_step get_pattern_step(enum sequencer_pattern_number pattern, uint8_t index);
185 
192 void import_pattern(enum sequencer_pattern_number number, const char* data);
193 
200 void init_sequencer_patterns(const struct sequencer_pattern* factory_patterns, uint8_t number_of_patterns);
201 
208 void overwrite_pattern(enum sequencer_pattern_number number, const struct sequencer_pattern* pattern);
209 
216 void set_pattern_length(enum sequencer_pattern_number pattern, uint8_t length);
217 
226 void set_pattern_step(enum sequencer_pattern_number pattern, uint8_t index, const struct sequencer_step* step);
227 
234 
241 
247 
252 
258 
263 void update_sequencer(void);
264 
269 void wipe_pattern(enum sequencer_pattern_number number);
270 
271 //---------------- EOF ----------------//
272 #endif // _SEQUENCER_H
273 
Sequencer pattern 03.
Definition: sequencer.h:50
API for a small collection of mathematical functions.
uint8_t get_pattern_length(enum sequencer_pattern_number pattern)
Reads a sequencer pattern&#39;s length.
Definition: sequencer.c:127
Sequencer pattern 05.
Definition: sequencer.h:52
Number of available sequencer channels.
Definition: sequencer.h:78
Sequencer pattern 14.
Definition: sequencer.h:61
midi_value_t adjust_sequencer_speed(struct sequencer_channel *channel, int8_t difference)
Increments or decrements a sequencer channel&#39;s speed.
Definition: sequencer.c:72
Sequencer pattern 04.
Definition: sequencer.h:51
midi_message_type
MIDI status byte values (first nibble)
Definition: midi.h:80
void wipe_pattern(enum sequencer_pattern_number number)
Wipes a sequencer pattern.
Definition: sequencer.c:288
char * export_pattern(enum sequencer_pattern_number number)
Dumps a sequencer pattern.
Definition: sequencer.c:104
Sequencer pattern 19.
Definition: sequencer.h:66
void set_sequencer_pattern(struct sequencer_channel *channel, enum sequencer_pattern_number pattern)
Selects a sequencer channel&#39;s pattern.
Definition: sequencer.c:211
Sequencer pattern 07.
Definition: sequencer.h:54
uint8_t step_index
This counter points to the next sequencer step in the channel&#39;s pattern.
Definition: sequencer.h:119
uint8_t midi_value_t
Type for valid MIDI values [0..127].
Definition: midi.h:56
Number of available sequencer patterns.
Definition: sequencer.h:68
The settings and internal state of a wave.
Definition: wave.h:101
Waveform function generator.
struct sequencer_step get_pattern_step(enum sequencer_pattern_number pattern, uint8_t index)
Reads step from a sequencer pattern.
Definition: sequencer.c:132
GPIO configuration and service functions.
sequencer_channel_number
Enumeration of available sequencer channels.
Definition: sequencer.h:72
Sequencer pattern 13.
Definition: sequencer.h:60
#define SEQUENCER_STEPS_PER_PATTERN
Number of steps in a sequencer pattern.
Definition: sequencer.h:40
void set_pattern_length(enum sequencer_pattern_number pattern, uint8_t length)
Sets a sequencer pattern&#39;s length.
Definition: sequencer.c:197
midi_value_t data1
Data byte 1 (optional, depending on the message type)
Definition: sequencer.h:96
void init_sequencer_patterns(const struct sequencer_pattern *factory_patterns, uint8_t number_of_patterns)
Initializes / Restores "factory-default" patterns.
Definition: sequencer.c:169
Sequencer pattern 18.
Definition: sequencer.h:65
void overwrite_pattern(enum sequencer_pattern_number number, const struct sequencer_pattern *pattern)
Stores a given pattern at the specified location.
Definition: sequencer.c:176
A sequencer pattern.
Definition: sequencer.h:101
Sequencer pattern 02.
Definition: sequencer.h:49
MIDI message transceiver.
enum midi_message_type type
MIDI message type.
Definition: sequencer.h:94
void start_sequencer(struct sequencer_channel *channel)
Starts a sequencer channel.
Definition: sequencer.c:221
void update_sequencer(void)
Main background task for the sequencer module.
Definition: sequencer.c:245
Sequencer pattern 16.
Definition: sequencer.h:63
sequencer_pattern_number
Enumeration of available sequencer patterns.
Definition: sequencer.h:46
uint8_t length
Number of sequencer steps.
Definition: sequencer.h:103
void copy_pattern(enum sequencer_pattern_number source, enum sequencer_pattern_number destination)
Copies a sequencer pattern.
Definition: sequencer.c:92
Sequencer pattern 06.
Definition: sequencer.h:53
Sequencer channel 2.
Definition: sequencer.h:75
Sequencer pattern 17.
Definition: sequencer.h:64
bool clock_state
Last known state of the channel&#39;s clock.
Definition: sequencer.h:121
void import_pattern(enum sequencer_pattern_number number, const char *data)
Stores a pattern given as a hex-string at the specified location.
Definition: sequencer.c:142
void set_sequencer_speed(struct sequencer_channel *channel, midi_value_t speed)
Sets a sequencer channel&#39;s speed.
Definition: sequencer.c:216
State and configuration of a sequencer channel.
Definition: sequencer.h:113
Sequencer pattern 12.
Definition: sequencer.h:59
Sequencer channel 1.
Definition: sequencer.h:74
void stop_sequencer(struct sequencer_channel *channel)
Stops a sequencer channel.
Definition: sequencer.c:228
const struct sequencer_pattern factory_patterns[]
Definition: whammy.c:59
enum midi_channel channel
MIDI channel.
Definition: sequencer.h:93
sequencer_channel_mode
Type.
Definition: sequencer.h:82
void set_pattern_step(enum sequencer_pattern_number pattern, uint8_t index, const struct sequencer_step *step)
Modifies a single step in a sequencer pattern.
Definition: sequencer.c:202
Sequencer pattern 10.
Definition: sequencer.h:57
Sequencer pattern 09.
Definition: sequencer.h:56
Sequencer pattern 08.
Definition: sequencer.h:55
uint8_t speed
Stores the sequencer channel&#39;s speed.
Definition: sequencer.h:116
The pattern is looped as long as the sequencer channel is active.
Definition: sequencer.h:85
void configure_sequencer_channel(enum sequencer_channel_number number, struct sequencer_channel *channel)
Configures a sequencer channel.
Definition: sequencer.c:81
The pattern is played only once on start of the sequencer channel.
Definition: sequencer.h:84
bool toggle_sequencer(struct sequencer_channel *channel)
Starts or stops a sequencer channel.
Definition: sequencer.c:233
midi_channel
MIDI status byte values (second nibble)
Definition: midi.h:59
Sequencer pattern 11.
Definition: sequencer.h:58
Sequencer pattern 01.
Definition: sequencer.h:48
midi_value_t data0
Data byte 0.
Definition: sequencer.h:95
enum sequencer_pattern_number adjust_sequencer_pattern(struct sequencer_channel *channel, int8_t difference)
Increments or decrements a sequencer channel&#39;s pattern index.
Definition: sequencer.c:64
A sequencer step.
Definition: sequencer.h:91
Sequencer channel 3.
Definition: sequencer.h:76
Sequencer pattern 15.
Definition: sequencer.h:62
bool running
This flag indicates if the sequencer channel is currently running.
Definition: sequencer.h:118
Sequencer channel 4.
Definition: sequencer.h:77
Sequencer pattern 20.
Definition: sequencer.h:67