summaryrefslogtreecommitdiff
path: root/muse2/muse/midiedit
diff options
context:
space:
mode:
Diffstat (limited to 'muse2/muse/midiedit')
-rw-r--r--muse2/muse/midiedit/scoreedit.cpp101
-rw-r--r--muse2/muse/midiedit/scoreedit.h69
2 files changed, 48 insertions, 122 deletions
diff --git a/muse2/muse/midiedit/scoreedit.cpp b/muse2/muse/midiedit/scoreedit.cpp
index 18c3bc71..3c4543b3 100644
--- a/muse2/muse/midiedit/scoreedit.cpp
+++ b/muse2/muse/midiedit/scoreedit.cpp
@@ -85,7 +85,6 @@ string IntToStr(int i);
//FLO_QUANT = how many ticks has a single quantisation area?
-//FINDMICH MARKER
//TODO: quant_max richtig setzen!
@@ -117,37 +116,6 @@ string create_random_string(int len=8)
-KeyList keymap;
-
-
-KeyList::KeyList()
-{
- clear();
-}
-
-void KeyList::clear()
-{
- _KeyList::clear(); //DEBUG -- remove these lines and use the commented out below
- insert(std::pair<const unsigned, KeyEvent> (1536, KeyEvent(A, 0)));
- insert(std::pair<const unsigned, KeyEvent> (MAX_TICK, KeyEvent(ES, 1536)));
-
- //insert(std::pair<const unsigned, KeyEvent> (MAX_TICK, KeyEvent(A, 0)));
-}
-
-tonart_t KeyList::key_at_tick(unsigned tick)
-{
- ciKeyEvent it = upper_bound(tick);
- if (it == end())
- {
- cout << "THIS SHOULD NEVER HAPPEN: key at "<<tick<<" not found!" << endl;
- return C;
- }
-
- return it->second.key;
-}
-
-
-
@@ -328,7 +296,7 @@ ScoreCanvas::ScoreCanvas(MidiEditor* pr, QWidget* parent,
mouse_erases_notes=false;
mouse_inserts_notes=true;
- curr_part=editor->parts()->begin()->second; //TODO FINDMICH
+ curr_part=editor->parts()->begin()->second; //TODO FINDMICHJETZT
last_len=384;
new_len=-1;
@@ -758,28 +726,28 @@ void staff_t::create_appropriate_eventlist(const set<Part*>& parts)
}
-bool is_sharp_key(tonart_t t)
+bool is_sharp_key(key_enum t)
{
- return ((t>=SHARP_BEGIN) && (t<=SHARP_END));
+ return ((t>=KEY_SHARP_BEGIN) && (t<=KEY_SHARP_END));
}
-bool is_b_key(tonart_t t)
+bool is_b_key(key_enum t)
{
- return ((t>=B_BEGIN) && (t<=B_END));
+ return ((t>=KEY_B_BEGIN) && (t<=KEY_B_END));
}
-int n_accidentials(tonart_t t)
+int n_accidentials(key_enum t)
{
if (is_sharp_key(t))
- return t-SHARP_BEGIN-1;
+ return t-KEY_SHARP_BEGIN-1;
else
- return t-B_BEGIN-1;
+ return t-KEY_B_BEGIN-1;
}
//note needs to be 0..11
//always assumes violin clef
//only for internal use
-note_pos_t note_pos_(int note, tonart_t key)
+note_pos_t note_pos_(int note, key_enum key)
{
note_pos_t result;
//C CIS D DIS E F FIS G GIS A AIS H
@@ -808,7 +776,7 @@ note_pos_t note_pos_(int note, tonart_t key)
}
// Special cases for GES / FIS keys
- if (key==GES)
+ if (key==KEY_GES)
{
// convert a H to a Ces
if (note==11)
@@ -817,7 +785,7 @@ note_pos_t note_pos_(int note, tonart_t key)
result.vorzeichen=B;
}
}
- else if (key==FIS)
+ else if (key==KEY_FIS)
{
// convert a F to an Eis
if (note==5)
@@ -846,7 +814,7 @@ note_pos_t note_pos_(int note, tonart_t key)
// in violin clef, line 2 is E4
// in bass clef, line 2 is G2
-note_pos_t note_pos (unsigned note, tonart_t key, clef_t clef)
+note_pos_t note_pos (unsigned note, key_enum key, clef_t clef)
{
int octave=(note/12)-1; //integer division. note is unsigned
note=note%12;
@@ -942,7 +910,7 @@ vector<int> create_emphasize_list(const list<int>& nums, int denom)
return result;
}
-vector<int> create_emphasize_list(int num, int denom) //TODO FINDMICH
+vector<int> create_emphasize_list(int num, int denom)
{
list<int> nums;
@@ -1075,7 +1043,6 @@ list<note_len_t> parse_note_len(int len_ticks, int begin_tick, vector<int>& foo,
// if total_width is greater than px_per_notepos, there will be collisions!
#define NOTE_MOVE_X (PIXELS_PER_NOTEPOS/2)
-//TODO richtige werte finden!
#define REST_AUSWEICH_X 10
#define DOT_XDIST 6
#define DOT_XBEGIN 10
@@ -1158,7 +1125,7 @@ void ScoreCanvas::draw_accidentials(QPainter& p, int x, int y_offset, const list
void staff_t::create_itemlist()
{
- tonart_t tmp_key=C;
+ key_enum tmp_key=KEY_C;
int lastevent=0;
int next_measure=-1;
int last_measure=-1;
@@ -1178,7 +1145,7 @@ void staff_t::create_itemlist()
actual_tick=it->second.tick;
if (actual_tick==-1) actual_tick=t;
- note_pos_t notepos=note_pos(pitch,tmp_key,clef); //TODO einstellmöglichkeiten
+ note_pos_t notepos=note_pos(pitch,tmp_key,clef);
printf("FLO: t=%i\ttype=%i\tpitch=%i\tvel=%i\tlen=%i\n",it->first, it->second.type, it->second.pitch, it->second.vel, it->second.len);
cout << "\tline="<<notepos.height<<"\tvorzeichen="<<notepos.vorzeichen << endl;
@@ -1306,9 +1273,9 @@ void staff_t::create_itemlist()
}
else if (type==FloEvent::KEY_CHANGE)
{
- cout << "inserting KEY CHANGE ("<<it->second.tonart<<") at "<<t<<endl;
- itemlist[t].insert( FloItem(FloItem::KEY_CHANGE, it->second.tonart) );
- tmp_key=it->second.tonart; // TODO FINDMICH MARKER das muss schöner werden
+ cout << "inserting KEY CHANGE ("<<it->second.key<<") at "<<t<<endl;
+ itemlist[t].insert( FloItem(FloItem::KEY_CHANGE, it->second.key) );
+ tmp_key=it->second.key;
}
}
}
@@ -1328,7 +1295,7 @@ void staff_t::process_itemlist()
// phase 0: keep track of active notes, rests -------------------
// (and occupied lines) and the last measure
- // and the current time signature (TODO FINDMICH)
+ // and the current time signature
for (set<FloItem, floComp>::iterator it=curr_items.begin(); it!=curr_items.end(); it++)
{
if ((it->type==FloItem::NOTE) || (it->type==FloItem::REST))
@@ -1781,7 +1748,9 @@ void ScoreCanvas::draw_note_lines(QPainter& p, int y)
void staff_t::calc_item_pos()
{
- tonart_t curr_key=C;
+ key_enum curr_key=KEY_C; //this has to be KEY_C or KEY_C_B and nothing else,
+ //because only with these two keys the next (initial)
+ //key signature is properly drawn.
int pos_add=0;
for (ScoreItemList::iterator it2=itemlist.begin(); it2!=itemlist.end(); it2++)
@@ -1854,7 +1823,7 @@ void staff_t::calc_item_pos()
}
else if (it->type==FloItem::KEY_CHANGE)
{
- tonart_t new_key=it->tonart;
+ key_enum new_key=it->key;
list<int> aufloes_list=calc_accidentials(curr_key, clef, new_key);
list<int> new_acc_list=calc_accidentials(new_key, clef);
@@ -1882,10 +1851,12 @@ void ScoreCanvas::calc_pos_add_list()
//process key changes
- tonart_t curr_key=C;
+ key_enum curr_key=KEY_C; //this has to be KEY_C or KEY_C_B and nothing else,
+ //because only with these two keys the next (initial)
+ //key signature is properly calculated.
for (iKeyEvent it=keymap.begin(); it!=keymap.end(); it++)
{
- tonart_t new_key=it->second.key;
+ key_enum new_key=it->second.key;
list<int> aufloes_list=calc_accidentials(curr_key, VIOLIN, new_key); //clef argument is unneccessary
list<int> new_acc_list=calc_accidentials(new_key, VIOLIN); //in this case
int n_acc_drawn=aufloes_list.size() + new_acc_list.size();
@@ -1937,7 +1908,7 @@ void ScoreCanvas::draw_items(QPainter& p, int y_offset, staff_t& staff, ScoreIte
// init accidentials properly
vorzeichen_t curr_accidential[7];
vorzeichen_t default_accidential[7];
- tonart_t curr_key;
+ key_enum curr_key;
curr_key=key_at_tick(from_it->first);
list<int> new_acc_list=calc_accidentials(curr_key, staff.clef);
@@ -2127,7 +2098,7 @@ void ScoreCanvas::draw_items(QPainter& p, int y_offset, staff_t& staff, ScoreIte
}
else if (it->type==FloItem::KEY_CHANGE)
{
- tonart_t new_key=it->tonart;
+ key_enum new_key=it->key;
cout << "\tKEY CHANGE: from "<<curr_key<<" to "<<new_key<<endl;
list<int> aufloes_list=calc_accidentials(curr_key, staff.clef, new_key);
@@ -2259,7 +2230,7 @@ void ScoreCanvas::draw_preamble(QPainter& p, int y_offset, clef_t clef)
// draw accidentials ------------------------------------------------
- tonart_t key=key_at_tick(tick);
+ key_enum key=key_at_tick(tick);
QPixmap* pix_acc=is_sharp_key(key) ? &pix_sharp[BLACK_PIXMAP] : &pix_b[BLACK_PIXMAP];
list<int> acclist=calc_accidentials(key,clef);
@@ -2343,7 +2314,7 @@ void ScoreCanvas::draw(QPainter& p, const QRect&)
}
-list<int> calc_accidentials(tonart_t key, clef_t clef, tonart_t next_key)
+list<int> calc_accidentials(key_enum key, clef_t clef, key_enum next_key)
{
list<int> result;
@@ -2419,11 +2390,11 @@ int ScoreCanvas::x_to_tick(int x)
return t > min_t ? t : min_t;
}
-tonart_t ScoreCanvas::key_at_tick(int t_)
+key_enum ScoreCanvas::key_at_tick(int t_)
{
unsigned int t= (t_>=0) ? t_ : 0;
- return keymap.key_at_tick(t);
+ return keymap.keyAtTick(t);
}
timesig_t ScoreCanvas::timesig_at_tick(int t_)
@@ -2450,7 +2421,7 @@ int ScoreCanvas::height_to_pitch(int h, clef_t clef)
}
}
-int ScoreCanvas::height_to_pitch(int h, clef_t clef, tonart_t key)
+int ScoreCanvas::height_to_pitch(int h, clef_t clef, key_enum key)
{
int add=0;
@@ -2928,6 +2899,8 @@ list<staff_t>::iterator ScoreCanvas::staff_at_y(int y)
/* BUGS and potential bugs
+ * o updating the keymap doesn't emit a songChanged() signal!
+ * o when the keymap is not used, this will probably lead to a bug
* o when adding a note, it's added to the first stave
* the problem is: there's always the first part selected
* o when changing color of a displayed part, note heads aren't redrawn
@@ -2988,8 +2961,6 @@ list<staff_t>::iterator ScoreCanvas::staff_at_y(int y)
* o rename staffs to staves
*
* stuff for the other muse developers
- * o OFFER A WAY TO EDIT THE KEYMAP (and integrate the keymap properly)
- *
* o check if dragging notes is done correctly
* o after doing the undo stuff right, the "pianoroll isn't informed
* about score-editor's changes"-bug has vanished. did it vanish
diff --git a/muse2/muse/midiedit/scoreedit.h b/muse2/muse/midiedit/scoreedit.h
index a296d8a8..cc1a06ec 100644
--- a/muse2/muse/midiedit/scoreedit.h
+++ b/muse2/muse/midiedit/scoreedit.h
@@ -26,6 +26,7 @@
#include "view.h"
#include "gconfig.h"
#include "part.h"
+#include "keyevent.h"
#include <set>
#include <map>
@@ -91,26 +92,6 @@ class ScoreEdit : public MidiEditor
-enum tonart_t
-{
- SHARP_BEGIN,
- C, // C or am, uses # for "black keys"
- G,
- D,
- A,
- E,
- H,
- FIS, //produces a #E (sounds like a F)
- SHARP_END,
- B_BEGIN,
- C_B, // the same as C, but uses b for "black keys"
- F,
- ES,
- AS,
- DES,
- GES, //sounds like FIS, but uses b instead of #
- B_END
-};
enum stem_t
{
@@ -140,33 +121,7 @@ bool operator< (const note_pos_t& a, const note_pos_t& b);
-// FINDMICH put that keymap-stuff to its appropriate place
-struct KeyEvent
-{
- tonart_t key;
- unsigned tick;
-
- KeyEvent(tonart_t k, unsigned t)
- {
- key=k;
- tick=t;
- }
-};
-
-typedef std::map<unsigned, KeyEvent, std::less<unsigned> > _KeyList;
-typedef _KeyList::iterator iKeyEvent;
-typedef _KeyList::const_iterator ciKeyEvent;
-typedef _KeyList::reverse_iterator riKeyEvent;
-typedef _KeyList::const_reverse_iterator criKeyEvent;
-class KeyList : public _KeyList
-{
- public:
- KeyList();
- void clear();
- tonart_t key_at_tick(unsigned tick);
- //TODO FINDMICH: more functions, like add(), remove() have to be implemented
-};
@@ -186,7 +141,7 @@ class FloEvent
int num;
int denom;
- tonart_t tonart;
+ key_enum key;
FloEvent(unsigned ti, int p,int v,int l,typeEnum t, Part* part=NULL, Event* event=NULL)
@@ -208,10 +163,10 @@ class FloEvent
source_event=NULL;
source_part=NULL;
}
- FloEvent(unsigned ti, typeEnum t, tonart_t k)
+ FloEvent(unsigned ti, typeEnum t, key_enum k)
{
type=t;
- tonart=k;
+ key=k;
tick=ti;
source_event=NULL;
source_part=NULL;
@@ -235,7 +190,7 @@ class FloItem
int num;
int denom;
- tonart_t tonart;
+ key_enum key;
mutable stem_t stem;
mutable int shift;
@@ -280,10 +235,10 @@ class FloItem
source_part=NULL;
}
- FloItem(typeEnum t, tonart_t k)
+ FloItem(typeEnum t, key_enum k)
{
type=t;
- tonart=k;
+ key=k;
begin_tick=-1;
source_event=NULL;
source_part=NULL;
@@ -486,9 +441,9 @@ struct staff_t
}
};
-list<int> calc_accidentials(tonart_t key, clef_t clef, tonart_t next_key=C);
-note_pos_t note_pos_(int note, tonart_t key);
-note_pos_t note_pos (unsigned note, tonart_t key, clef_t clef);
+list<int> calc_accidentials(key_enum key, clef_t clef, key_enum next_key=KEY_C);
+note_pos_t note_pos_(int note, key_enum key);
+note_pos_t note_pos (unsigned note, key_enum key, clef_t clef);
int calc_len(int l, int d);
list<note_len_t> parse_note_len(int len_ticks, int begin_tick, vector<int>& foo, bool allow_dots=true, bool allow_normal=true);
@@ -518,7 +473,7 @@ class ScoreCanvas : public View
- static int height_to_pitch(int h, clef_t clef, tonart_t key);
+ static int height_to_pitch(int h, clef_t clef, key_enum key);
static int height_to_pitch(int h, clef_t clef);
static int y_to_height(int y);
int y_to_pitch(int y, int t, clef_t clef);
@@ -539,7 +494,7 @@ class ScoreCanvas : public View
timesig_t timesig_at_tick(int t);
- tonart_t key_at_tick(int t);
+ key_enum key_at_tick(int t);
int tick_to_x(int t);
int x_to_tick(int x);
int calc_posadd(int t);