1
Fork 0
jacker/model.hpp

303 lines
7.1 KiB
C++
Raw Permalink Normal View History

2010-01-30 02:02:21 +02:00
#pragma once
2010-01-28 18:41:38 +02:00
#include <map>
2010-01-30 02:02:21 +02:00
#include <string>
#include <list>
2010-01-30 18:51:04 +02:00
#include <vector>
2010-01-28 18:41:38 +02:00
2010-01-29 00:27:09 +02:00
namespace Jacker {
2010-01-30 02:02:21 +02:00
2010-02-04 11:14:46 +02:00
class Model;
2010-01-30 02:02:21 +02:00
//=============================================================================
2010-01-28 18:41:38 +02:00
2010-02-08 14:17:25 +02:00
#if defined(WIN32)
2010-02-07 11:29:11 +02:00
template<typename Key_T, typename T>
inline typename std::map<Key_T,T>::iterator extract_iterator(
2010-02-08 14:17:25 +02:00
std::pair< typename std::map<Key_T,T>::iterator, bool> result) {
2010-02-07 11:29:11 +02:00
return result.first;
}
2010-02-08 14:17:25 +02:00
#else
2010-02-08 10:56:11 +02:00
template<typename Key_T, typename T>
inline typename std::map<Key_T,T>::iterator extract_iterator(
2010-02-08 14:17:25 +02:00
std::pair< typename std::map<const Key_T,T>::iterator, bool> result) {
2010-02-08 10:56:11 +02:00
return result.first;
}
2010-02-08 14:17:25 +02:00
#endif
2010-02-08 10:56:11 +02:00
2010-02-07 11:29:11 +02:00
template<typename Key_T, typename T>
inline typename std::multimap<Key_T,T>::iterator extract_iterator(
typename std::multimap<Key_T,T>::iterator result) {
return result;
}
2010-02-04 11:14:46 +02:00
template<typename Map_T>
class EventCollection
: public Map_T {
2010-01-30 18:51:04 +02:00
public:
2010-02-04 11:14:46 +02:00
typedef Map_T map;
2010-02-07 19:43:01 +02:00
typedef typename map::key_type Key;
2010-02-04 11:14:46 +02:00
typedef typename map::mapped_type Event;
typedef EventCollection<Map_T> BaseClass;
2010-02-09 22:41:00 +02:00
typedef std::list<Event> EventList;
typedef std::list<typename Map_T::iterator> IterList;
2010-01-28 18:41:38 +02:00
2010-02-07 11:29:11 +02:00
typename map::iterator add_event(const Event &event) {
return extract_iterator<typename map::key_type, Event>(
insert(typename map::value_type(event.key(),event)));
2010-01-30 18:51:04 +02:00
}
2010-01-28 18:41:38 +02:00
};
2010-01-30 02:02:21 +02:00
//=============================================================================
2010-01-30 18:51:04 +02:00
#define NOTE(N,OCTAVE) ((12*(OCTAVE))+(Note ## N))
enum {
NoteC = 0,
NoteCs = 1,
NoteD = 2,
NoteDs = 3,
NoteE = 4,
NoteF = 5,
NoteFs = 6,
NoteG = 7,
NoteGs = 8,
NoteA = 9,
NoteAs = 10,
NoteB = 11,
};
enum {
ValueNone = -1,
2010-02-02 23:54:43 +02:00
NoteOff = 255,
2010-01-30 18:51:04 +02:00
};
enum {
ParamNote = 0,
ParamVolume,
2010-02-06 11:26:25 +02:00
ParamCommand,
ParamValue,
ParamCCIndex,
ParamCCValue,
2010-01-28 18:41:38 +02:00
2010-01-30 18:51:04 +02:00
ParamCount,
};
2010-02-05 09:02:38 +02:00
enum {
2010-02-10 00:44:06 +02:00
MaxTracks = 32,
2010-02-05 09:02:38 +02:00
MaxChannels = 256,
2010-09-18 18:38:03 +03:00
MaxPorts = 16,
2010-02-05 09:02:38 +02:00
};
2010-01-30 18:51:04 +02:00
//=============================================================================
2010-02-15 18:58:07 +02:00
int sprint_note(char *buffer, int value);
//=============================================================================
2010-02-03 19:05:08 +02:00
// describes a parameter
struct Param {
int min_value;
int max_value;
int def_value;
int no_value;
Param();
Param(int min_value, int max_value, int default_value, int no_value);
};
//=============================================================================
2010-01-30 18:51:04 +02:00
struct PatternEvent {
// time index
2010-01-30 02:02:21 +02:00
int frame;
2010-01-30 18:51:04 +02:00
// index of channel
2010-01-30 02:02:21 +02:00
int channel;
2010-01-30 18:51:04 +02:00
// index of parameter
int param;
// value of parameter
int value;
2010-01-30 02:02:21 +02:00
PatternEvent();
2010-01-30 18:51:04 +02:00
PatternEvent(int frame, int channel, int param, int value);
bool is_valid() const;
int key() const;
2010-02-03 19:05:08 +02:00
void sanitize_value();
2010-01-30 02:02:21 +02:00
};
//=============================================================================
2010-02-04 11:14:46 +02:00
class Pattern : public EventCollection< std::multimap<int,PatternEvent> > {
friend class Model;
public:
2010-01-30 18:51:04 +02:00
struct Row : std::vector<Event *> {
typedef std::vector<Event *> vector;
void resize(int channel_count);
2010-02-06 01:06:39 +02:00
Event *get_event(int channel, int param) const;
2010-01-30 18:51:04 +02:00
void set_event(Event &event);
2010-02-06 01:06:39 +02:00
int get_value(int channel, int param) const;
2010-01-30 18:51:04 +02:00
};
2010-01-28 18:41:38 +02:00
// name of pattern (non-unique)
std::string name;
2010-02-14 14:04:22 +02:00
// usage count of pattern
int refcount;
2010-01-28 18:41:38 +02:00
2010-02-07 19:43:01 +02:00
iterator add_event(const Event &event);
iterator add_event(int frame, int channel, int param, int value);
2010-01-30 18:51:04 +02:00
void set_length(int length);
int get_length() const;
void set_channel_count(int count);
int get_channel_count() const;
void collect_events(int frame, iterator &iter, Row &row);
2010-02-03 10:51:13 +02:00
iterator get_event(int frame, int channel, int param);
2010-02-07 19:43:01 +02:00
void update_keys();
2010-02-10 19:06:33 +02:00
void copy_from(const Pattern &pattern);
2010-02-04 11:14:46 +02:00
2010-09-23 05:23:01 +03:00
void move_frames(int row, int step, int channel);
2010-02-13 23:06:22 +02:00
Pattern();
protected:
2010-01-30 02:02:21 +02:00
// length in frames
int length;
2010-01-30 18:51:04 +02:00
// number of channels
int channel_count;
2010-01-28 18:41:38 +02:00
};
2010-01-30 02:02:21 +02:00
//=============================================================================
2010-02-09 20:52:34 +02:00
struct SongEvent {
2010-01-30 02:02:21 +02:00
int frame;
2010-02-09 20:52:34 +02:00
int track;
2010-09-22 22:40:35 +03:00
bool mute;
2010-01-30 02:02:21 +02:00
Pattern *pattern;
2010-01-30 18:51:04 +02:00
2010-02-09 20:52:34 +02:00
SongEvent();
SongEvent(int frame, int track, Pattern &pattern);
2010-02-04 11:14:46 +02:00
2010-01-30 18:51:04 +02:00
int key() const;
2010-02-05 00:28:22 +02:00
int get_last_frame() const;
2010-02-11 23:56:09 +02:00
int get_end() const;
2010-01-30 02:02:21 +02:00
};
2010-02-11 23:56:09 +02:00
//=============================================================================
2010-02-09 20:52:34 +02:00
class Song : public EventCollection< std::multimap<int,SongEvent> > {
2010-02-04 11:14:46 +02:00
friend class Model;
public:
2010-02-07 11:29:11 +02:00
iterator add_event(const Event &event);
2010-02-09 22:41:00 +02:00
iterator add_event(int frame, int track, Pattern &pattern);
2010-02-04 11:14:46 +02:00
2010-02-04 19:05:09 +02:00
iterator get_event(int frame);
2010-02-14 14:04:22 +02:00
void erase(iterator iter);
2010-02-06 16:41:59 +02:00
2010-02-09 22:41:00 +02:00
void find_events(int frame, IterList &events);
void update_keys();
2010-02-04 11:14:46 +02:00
protected:
2010-02-09 20:52:34 +02:00
Song();
2010-01-28 18:41:38 +02:00
};
2010-01-30 02:02:21 +02:00
//=============================================================================
2010-02-06 21:32:20 +02:00
struct Measure {
int bar;
int beat;
int subframe;
Measure();
void set_frame(Model &model, int frame);
int get_frame(Model &model) const;
std::string get_string() const;
};
//=============================================================================
2010-02-10 08:52:28 +02:00
class Loop {
public:
Loop();
void set(int begin, int end);
void set_begin(int begin);
void set_end(int end);
void get(int &begin, int &end) const;
int get_begin() const;
int get_end() const;
protected:
int begin;
int end;
};
2010-02-12 09:02:08 +02:00
//=============================================================================
class Track {
public:
2010-09-06 21:29:56 +03:00
std::string name;
2010-02-12 09:02:08 +02:00
int midi_port;
int midi_channel;
2010-09-06 20:52:56 +03:00
bool mute;
2010-02-12 09:02:08 +02:00
Track();
};
2010-02-10 08:52:28 +02:00
//=============================================================================
2010-02-11 23:56:09 +02:00
typedef std::list<Pattern*> PatternList;
typedef std::vector<Track> TrackArray;
2010-02-11 23:56:09 +02:00
2010-02-05 11:28:16 +02:00
class Model {
public:
2010-01-28 18:41:38 +02:00
// list of all patterns
2010-02-04 19:05:09 +02:00
PatternList patterns;
2010-02-09 20:52:34 +02:00
// contains all song events
Song song;
2010-02-10 08:52:28 +02:00
2010-02-12 09:02:08 +02:00
// track infos
TrackArray tracks;
2010-02-10 08:52:28 +02:00
// describes the loop
Loop loop;
// tells if the loop is enabled
bool enable_loop;
2010-01-28 18:41:38 +02:00
// end cue in frames
int end_cue;
2010-02-05 21:49:45 +02:00
// how many frames are in one beat
int frames_per_beat;
// how many beats are in one bar
int beats_per_bar;
// how many beats are in one minute
int beats_per_minute;
// what port to use for the midi control
int midi_control_port;
// what channel to use for the midi control
int midi_control_channel;
2010-02-06 20:27:17 +02:00
void reset();
2010-01-30 02:02:21 +02:00
Model();
2010-02-10 19:06:33 +02:00
Pattern &new_pattern(const Pattern *template_pattern=NULL);
2010-02-04 19:05:09 +02:00
int get_track_count() const;
2010-02-09 20:52:34 +02:00
2010-02-07 14:27:55 +02:00
int get_frames_per_bar() const;
2010-02-14 14:04:22 +02:00
void update_pattern_refcount();
void delete_unused_patterns();
2010-02-15 18:58:07 +02:00
std::string get_param_name(int param) const;
std::string format_param_value(int param, int value) const;
2010-01-28 18:41:38 +02:00
};
2010-01-30 02:02:21 +02:00
//=============================================================================
2010-01-29 00:27:09 +02:00
} // namespace Jacker