uMIDI
The swiss army knife for quick and easy developement of MIDI applications.
Data Structures | Macros | Enumerations | Functions
sequencer.h File Reference

Sequencer module API. More...

#include <stdbool.h>
#include <stdint.h>
#include "gpio.h"
#include "math.h"
#include "midi.h"
#include "wave.h"
Include dependency graph for sequencer.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  sequencer_step
 A sequencer step. More...
 
struct  sequencer_pattern
 A sequencer pattern. More...
 
struct  sequencer_channel
 State and configuration of a sequencer channel. More...
 

Macros

#define SEQUENCER_STEPS_PER_PATTERN   16
 Number of steps in a sequencer pattern. More...
 

Enumerations

enum  sequencer_pattern_number {
  SEQUENCER_PATTERN_01, SEQUENCER_PATTERN_02, SEQUENCER_PATTERN_03, SEQUENCER_PATTERN_04,
  SEQUENCER_PATTERN_05, SEQUENCER_PATTERN_06, SEQUENCER_PATTERN_07, SEQUENCER_PATTERN_08,
  SEQUENCER_PATTERN_09, SEQUENCER_PATTERN_10, SEQUENCER_PATTERN_11, SEQUENCER_PATTERN_12,
  SEQUENCER_PATTERN_13, SEQUENCER_PATTERN_14, SEQUENCER_PATTERN_15, SEQUENCER_PATTERN_16,
  SEQUENCER_PATTERN_17, SEQUENCER_PATTERN_18, SEQUENCER_PATTERN_19, SEQUENCER_PATTERN_20,
  SEQUENCER_PATTERNS
}
 Enumeration of available sequencer patterns. More...
 
enum  sequencer_channel_number {
  SEQUENCER_CHANNEL_1, SEQUENCER_CHANNEL_2, SEQUENCER_CHANNEL_3, SEQUENCER_CHANNEL_4,
  SEQUENCER_CHANNELS
}
 Enumeration of available sequencer channels. More...
 
enum  sequencer_channel_mode { SEQUENCER_CHANNEL_MODE_ONE_SHOT, SEQUENCER_CHANNEL_MODE_CONTINUOUS }
 Type. More...
 

Functions

enum sequencer_pattern_number adjust_sequencer_pattern (struct sequencer_channel *channel, int8_t difference)
 Increments or decrements a sequencer channel's pattern index. More...
 
midi_value_t adjust_sequencer_speed (struct sequencer_channel *channel, int8_t difference)
 Increments or decrements a sequencer channel's speed. More...
 
void configure_sequencer_channel (enum sequencer_channel_number number, struct sequencer_channel *channel)
 Configures a sequencer channel. More...
 
void copy_pattern (enum sequencer_pattern_number source, enum sequencer_pattern_number destination)
 Copies a sequencer pattern. More...
 
char * export_pattern (enum sequencer_pattern_number number)
 Dumps a sequencer pattern. More...
 
uint8_t get_pattern_length (enum sequencer_pattern_number pattern)
 Reads a sequencer pattern's length. More...
 
struct sequencer_step get_pattern_step (enum sequencer_pattern_number pattern, uint8_t index)
 Reads step from a sequencer pattern. More...
 
void import_pattern (enum sequencer_pattern_number number, const char *data)
 Stores a pattern given as a hex-string at the specified location. More...
 
void init_sequencer_patterns (const struct sequencer_pattern *factory_patterns, uint8_t number_of_patterns)
 Initializes / Restores "factory-default" patterns. More...
 
void overwrite_pattern (enum sequencer_pattern_number number, const struct sequencer_pattern *pattern)
 Stores a given pattern at the specified location. More...
 
void set_pattern_length (enum sequencer_pattern_number pattern, uint8_t length)
 Sets a sequencer pattern's length. More...
 
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. More...
 
void set_sequencer_pattern (struct sequencer_channel *channel, enum sequencer_pattern_number pattern)
 Selects a sequencer channel's pattern. More...
 
void set_sequencer_speed (struct sequencer_channel *channel, midi_value_t speed)
 Sets a sequencer channel's speed. More...
 
void start_sequencer (struct sequencer_channel *channel)
 Starts a sequencer channel. More...
 
void stop_sequencer (struct sequencer_channel *channel)
 Stops a sequencer channel. More...
 
bool toggle_sequencer (struct sequencer_channel *channel)
 Starts or stops a sequencer channel. More...
 
void update_sequencer (void)
 Main background task for the sequencer module. More...
 
void wipe_pattern (enum sequencer_pattern_number number)
 Wipes a sequencer pattern. More...
 

Detailed Description

Sequencer module API.

Macro Definition Documentation

◆ SEQUENCER_STEPS_PER_PATTERN

#define SEQUENCER_STEPS_PER_PATTERN   16

Number of steps in a sequencer pattern.

Enumeration Type Documentation

◆ sequencer_channel_mode

Type.

Enumerator
SEQUENCER_CHANNEL_MODE_ONE_SHOT 

The pattern is played only once on start of the sequencer channel.

SEQUENCER_CHANNEL_MODE_CONTINUOUS 

The pattern is looped as long as the sequencer channel is active.

◆ sequencer_channel_number

Enumeration of available sequencer channels.

Enumerator
SEQUENCER_CHANNEL_1 

Sequencer channel 1.

SEQUENCER_CHANNEL_2 

Sequencer channel 2.

SEQUENCER_CHANNEL_3 

Sequencer channel 3.

SEQUENCER_CHANNEL_4 

Sequencer channel 4.

SEQUENCER_CHANNELS 

Number of available sequencer channels.

◆ sequencer_pattern_number

Enumeration of available sequencer patterns.

Enumerator
SEQUENCER_PATTERN_01 

Sequencer pattern 01.

SEQUENCER_PATTERN_02 

Sequencer pattern 02.

SEQUENCER_PATTERN_03 

Sequencer pattern 03.

SEQUENCER_PATTERN_04 

Sequencer pattern 04.

SEQUENCER_PATTERN_05 

Sequencer pattern 05.

SEQUENCER_PATTERN_06 

Sequencer pattern 06.

SEQUENCER_PATTERN_07 

Sequencer pattern 07.

SEQUENCER_PATTERN_08 

Sequencer pattern 08.

SEQUENCER_PATTERN_09 

Sequencer pattern 09.

SEQUENCER_PATTERN_10 

Sequencer pattern 10.

SEQUENCER_PATTERN_11 

Sequencer pattern 11.

SEQUENCER_PATTERN_12 

Sequencer pattern 12.

SEQUENCER_PATTERN_13 

Sequencer pattern 13.

SEQUENCER_PATTERN_14 

Sequencer pattern 14.

SEQUENCER_PATTERN_15 

Sequencer pattern 15.

SEQUENCER_PATTERN_16 

Sequencer pattern 16.

SEQUENCER_PATTERN_17 

Sequencer pattern 17.

SEQUENCER_PATTERN_18 

Sequencer pattern 18.

SEQUENCER_PATTERN_19 

Sequencer pattern 19.

SEQUENCER_PATTERN_20 

Sequencer pattern 20.

SEQUENCER_PATTERNS 

Number of available sequencer patterns.

Function Documentation

◆ adjust_sequencer_pattern()

enum sequencer_pattern_number adjust_sequencer_pattern ( struct sequencer_channel channel,
int8_t  difference 
)

Increments or decrements a sequencer channel's pattern index.

Rotates the pattern index, for example: If the resulting pattern index is greater than the number of patterns, counting restarts at the first pattern.

Parameters
channelthe sequencer channel to adjust
differencean offset from the currently stored pattern
Returns
the set pattern

◆ adjust_sequencer_speed()

midi_value_t adjust_sequencer_speed ( struct sequencer_channel channel,
int8_t  difference 
)

Increments or decrements a sequencer channel's speed.

Cyclically rotates the speed in the range of a MIDI value [0 .. 127].

Parameters
channelthe sequencer channel to adjust
differencean offset from the current speed
Returns
the newly set speed

◆ configure_sequencer_channel()

void configure_sequencer_channel ( enum sequencer_channel_number  number,
struct sequencer_channel channel 
)

Configures a sequencer channel.

This function also registers the channel's wave with the tap tempo function.

Parameters
numberthe sequencer channel slot to use
channelthe sequencer channel
See also
sequencer_channel
register_tap

◆ copy_pattern()

void copy_pattern ( enum sequencer_pattern_number  source,
enum sequencer_pattern_number  destination 
)

Copies a sequencer pattern.

Duplicates the pattern at the source index and overwrites the pattern at the destination index with it.

Parameters
sourcenumber of the pattern to copy
destinationnumber of the pattern to overwrite

◆ export_pattern()

char* export_pattern ( enum sequencer_pattern_number  number)

Dumps a sequencer pattern.

Reads the data from EEPROM and converts it to a string of hexadecimal digits.

Parameters
numbernumber of the pattern to export
Returns
the pattern stored in EEPROM as a hex-string

◆ get_pattern_length()

uint8_t get_pattern_length ( enum sequencer_pattern_number  pattern)

Reads a sequencer pattern's length.

Parameters
patternnumber of the pattern
Returns
the selected pattern's length

◆ get_pattern_step()

struct sequencer_step get_pattern_step ( enum sequencer_pattern_number  pattern,
uint8_t  index 
)

Reads step from a sequencer pattern.

Parameters
patternnumber of the sequencer pattern containing the step to read
indexthe index of the step within the pattern
Returns
the requested sequencer step

◆ import_pattern()

void import_pattern ( enum sequencer_pattern_number  number,
const char *  data 
)

Stores a pattern given as a hex-string at the specified location.

Overwrites stored data!

Parameters
numbernumber of the pattern to overwrite
datathe new pattern to store as a string of hexadecimal digits

◆ init_sequencer_patterns()

void init_sequencer_patterns ( const struct sequencer_pattern factory_patterns,
uint8_t  number_of_patterns 
)

Initializes / Restores "factory-default" patterns.

Copies a list of patterns to the start of the EEPROM pattern storage.

Parameters
factory_patternsa pointer to a list of "factory"-default patterns
number_of_patternsnumber of "factory" patterns

◆ overwrite_pattern()

void overwrite_pattern ( enum sequencer_pattern_number  number,
const struct sequencer_pattern pattern 
)

Stores a given pattern at the specified location.

Overwrites stored data! Checks if the data actually changed before writing to save EEPROM write cycles.

Parameters
numbernumber of the pattern to overwrite
patternthe new pattern to store

◆ set_pattern_length()

void set_pattern_length ( enum sequencer_pattern_number  pattern,
uint8_t  length 
)

Sets a sequencer pattern's length.

Overwrites stored data!

Parameters
patternnumber of the sequencer pattern to modify
lengththe new pattern length

◆ set_pattern_step()

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.

Overwrites stored data!

Parameters
patternnumber of the sequencer pattern containing the step to modify
indexthe index of the step in the pattern to update
stepthe new sequencer step

◆ set_sequencer_pattern()

void set_sequencer_pattern ( struct sequencer_channel channel,
enum sequencer_pattern_number  pattern 
)

Selects a sequencer channel's pattern.

Parameters
channelthe sequencer channel to adjust
patternthe index of the new sequencer pattern

◆ set_sequencer_speed()

void set_sequencer_speed ( struct sequencer_channel channel,
midi_value_t  speed 
)

Sets a sequencer channel's speed.

Parameters
channelthe sequencer channel to adjust
speedthe new speed

◆ start_sequencer()

void start_sequencer ( struct sequencer_channel channel)

Starts a sequencer channel.

If the channel is already running, it is restarted.

Parameters
channelthe sequencer channel to (re-)start

◆ stop_sequencer()

void stop_sequencer ( struct sequencer_channel channel)

Stops a sequencer channel.

Parameters
channelthe sequencer channel to stop

◆ toggle_sequencer()

bool toggle_sequencer ( struct sequencer_channel channel)

Starts or stops a sequencer channel.

Parameters
channelthe sequencer channel to toggle
Returns
true if the channel was activated; false if it was deactivated

◆ update_sequencer()

void update_sequencer ( void  )

Main background task for the sequencer module.

This task plays active (-> started) sequencer channels. It uses the wave module as an internal clock source, so it must be registered as a fast background task.

See also
update_wave

◆ wipe_pattern()

void wipe_pattern ( enum sequencer_pattern_number  number)

Wipes a sequencer pattern.

Zeroes out memory at the given sequencer pattern index.

Parameters
numbernumber of the pattern to wipe