diff options
Diffstat (limited to 'modules/chibi/cp_pattern.cpp')
| -rw-r--r-- | modules/chibi/cp_pattern.cpp | 539 |
1 files changed, 244 insertions, 295 deletions
diff --git a/modules/chibi/cp_pattern.cpp b/modules/chibi/cp_pattern.cpp index 8671b6247..699c769e3 100644 --- a/modules/chibi/cp_pattern.cpp +++ b/modules/chibi/cp_pattern.cpp @@ -30,68 +30,60 @@ void CPPattern::clear() { - if (event_count>0) { - - + if (event_count > 0) { + CP_FREE(events); - events=NULL; - event_count=0; + events = NULL; + event_count = 0; } - length=DEFAULT_LEN; - + length = DEFAULT_LEN; } - bool CPPattern::resize_event_list_to(uint32_t p_events) { - //Module is slow in some cpus, so this should be fast enough - uint32_t new_size=((p_events-1)&(~((1<<RESIZE_EVERY_BITS)-1)))+(1<<RESIZE_EVERY_BITS); - - CP_ERR_COND_V(new_size<p_events,true); //bugARM_INFO - - if (event_count==0 && new_size==0) + uint32_t new_size = ((p_events - 1) & (~((1 << RESIZE_EVERY_BITS) - 1))) + (1 << RESIZE_EVERY_BITS); + + CP_ERR_COND_V(new_size < p_events, true); //bugARM_INFO + + if (event_count == 0 && new_size == 0) return false; //nothing to do - - if (event_count==0) { - - events=(Event*)CP_ALLOC( new_size*sizeof(Event) ); - } else if (new_size==0) { - + if (event_count == 0) { + + events = (Event *)CP_ALLOC(new_size * sizeof(Event)); + + } else if (new_size == 0) { + CP_FREE(events); - events=NULL; + events = NULL; } else { - - CP_ERR_COND_V(events==NULL,true); - events=(Event*)CP_REALLOC(events, new_size*sizeof(Event)); + CP_ERR_COND_V(events == NULL, true); + events = (Event *)CP_REALLOC(events, new_size * sizeof(Event)); } - - event_count=p_events; - + + event_count = p_events; + return false; } - int32_t CPPattern::get_event_pos(uint16_t p_target_pos) { - - - if (event_count==0) + + if (event_count == 0) return -1; - + int low = 0; - int high = event_count -1; + int high = event_count - 1; int middle; - - while( low <= high ) - { - middle = ( low + high ) / 2; - if( p_target_pos == events[middle].pos ) { //match + while (low <= high) { + middle = (low + high) / 2; + + if (p_target_pos == events[middle].pos) { //match break; - } else if( p_target_pos < events[middle].pos ) + } else if (p_target_pos < events[middle].pos) high = middle - 1; //search low end of array else low = middle + 1; //search high end of array @@ -99,10 +91,10 @@ int32_t CPPattern::get_event_pos(uint16_t p_target_pos) { /* adapt so we are behind 2 */ - if (events[middle].pos<p_target_pos) + if (events[middle].pos < p_target_pos) middle++; return middle; - + /* Linear search for now */ /* @@ -114,386 +106,346 @@ int32_t CPPattern::get_event_pos(uint16_t p_target_pos) { break; } */ - + //return pos_idx; } bool CPPattern::erase_event_at_pos(uint16_t p_pos) { - - if (event_count==0) + + if (event_count == 0) return false; - - - Event *event_list=events; + Event *event_list = events; int32_t pos_idx = get_event_pos(p_pos); - if (pos_idx==-1) { - CP_ERR_COND_V(pos_idx==-1,true); + if (pos_idx == -1) { + CP_ERR_COND_V(pos_idx == -1, true); } - - if (pos_idx==event_count || event_list[pos_idx].pos!=p_pos) { + + if (pos_idx == event_count || event_list[pos_idx].pos != p_pos) { /* Nothing to Erase */ return false; } - - for (int32_t i=pos_idx;i<(event_count-1);i++) { - - event_list[i]=event_list[i+1]; + + for (int32_t i = pos_idx; i < (event_count - 1); i++) { + + event_list[i] = event_list[i + 1]; } - - resize_event_list_to(event_count-1); - + resize_event_list_to(event_count - 1); + return false; } -bool CPPattern::set_note(uint8_t p_column, uint16_t p_row,const CPNote& p_note) { +bool CPPattern::set_note(uint8_t p_column, uint16_t p_row, const CPNote &p_note) { + + CP_ERR_COND_V(p_column >= WIDTH, true); + CP_ERR_COND_V(p_row >= length, true); - CP_ERR_COND_V(p_column>=WIDTH,true); - CP_ERR_COND_V(p_row>=length,true); - int32_t new_pos; - uint16_t target_pos=p_row*WIDTH+p_column; - + uint16_t target_pos = p_row * WIDTH + p_column; - if (p_note.is_empty()) { - bool res=erase_event_at_pos(target_pos); + bool res = erase_event_at_pos(target_pos); - return res;; + return res; + ; } - - Event *event_list=0; - - if (event_count==0) { + + Event *event_list = 0; + + if (event_count == 0) { /* If no events, create the first */ - + if (resize_event_list_to(1)) { CP_PRINTERR("Can't resize event list to 1"); return true; } - event_list=events; - if (event_list==0) { - + event_list = events; + if (event_list == 0) { CP_PRINTERR("Can't get event list"); return true; } - - new_pos=0; - + + new_pos = 0; + } else { /* Prepare to add */ - - event_list=events; - if (event_list==0) { - + + event_list = events; + if (event_list == 0) { CP_PRINTERR("Can't get event list"); return true; } - + int32_t pos_idx = get_event_pos(target_pos); - - if (pos_idx==-1) { + if (pos_idx == -1) { CP_PRINTERR("Can't find add position"); return true; } - - - if (pos_idx==event_count || event_list[pos_idx].pos!=target_pos) { + + if (pos_idx == event_count || event_list[pos_idx].pos != target_pos) { /* If the note being modified didnt exist, then we add it */ //resize, and return if out of mem - if (resize_event_list_to( event_count+1)) { - + if (resize_event_list_to(event_count + 1)) { CP_PRINTERR("Can't resize event list"); return true; } - event_list=events; - if (event_list==0) { - + event_list = events; + if (event_list == 0) { CP_PRINTERR("Can't get event list"); return true; } - + //make room for new pos, this wont do a thing if pos_idx was ==event_count - for(int32_t i=(event_count-1);i>pos_idx;i--) { - event_list[i]=event_list[i-1]; - + for (int32_t i = (event_count - 1); i > pos_idx; i--) { + event_list[i] = event_list[i - 1]; } - + } /* Else it means that position is taken, so we just modify it! */ - - - new_pos=pos_idx; + + new_pos = pos_idx; } - - event_list[new_pos].pos=target_pos; - event_list[new_pos].note=p_note.note; - event_list[new_pos].instrument=p_note.instrument; - event_list[new_pos].volume=p_note.volume; - event_list[new_pos].command=p_note.command; - event_list[new_pos].parameter=p_note.parameter; - event_list[new_pos].script_source_sign=p_note.script_source_sign; - event_list[new_pos].cloned=p_note.cloned; - - + event_list[new_pos].pos = target_pos; + event_list[new_pos].note = p_note.note; + event_list[new_pos].instrument = p_note.instrument; + event_list[new_pos].volume = p_note.volume; + event_list[new_pos].command = p_note.command; + event_list[new_pos].parameter = p_note.parameter; + event_list[new_pos].script_source_sign = p_note.script_source_sign; + event_list[new_pos].cloned = p_note.cloned; return false; - } -CPNote CPPattern::get_note(uint8_t p_column,uint16_t p_row) { +CPNote CPPattern::get_note(uint8_t p_column, uint16_t p_row) { + + if (p_column == CPNote::EMPTY) return CPNote(); - if (p_column==CPNote::EMPTY) return CPNote(); - - CP_ERR_COND_V(p_column>=WIDTH,CPNote()); - CP_ERR_COND_V(p_row>=length,CPNote()); + CP_ERR_COND_V(p_column >= WIDTH, CPNote()); + CP_ERR_COND_V(p_row >= length, CPNote()); - if (event_count==0) + if (event_count == 0) return CPNote(); - - Event *event_list=events; - - CP_ERR_COND_V(event_list==0,CPNote()); - - uint16_t target_pos=p_row*WIDTH+p_column; + Event *event_list = events; + + CP_ERR_COND_V(event_list == 0, CPNote()); + + uint16_t target_pos = p_row * WIDTH + p_column; int32_t pos_idx = get_event_pos(target_pos); - if (pos_idx==-1) { + if (pos_idx == -1) { CP_PRINTERR("Can't find event pos"); return CPNote(); } - - if (pos_idx>=event_count || event_list[pos_idx].pos!=target_pos) { + + if (pos_idx >= event_count || event_list[pos_idx].pos != target_pos) { /* no note found */ return CPNote(); } - + CPNote n; - n.note=event_list[pos_idx].note; - n.instrument=event_list[pos_idx].instrument; - n.volume=event_list[pos_idx].volume; - n.command=event_list[pos_idx].command; - n.parameter=event_list[pos_idx].parameter; - n.script_source_sign=event_list[pos_idx].script_source_sign; - n.cloned=event_list[pos_idx].cloned; - + n.note = event_list[pos_idx].note; + n.instrument = event_list[pos_idx].instrument; + n.volume = event_list[pos_idx].volume; + n.command = event_list[pos_idx].command; + n.parameter = event_list[pos_idx].parameter; + n.script_source_sign = event_list[pos_idx].script_source_sign; + n.cloned = event_list[pos_idx].cloned; return n; - } -CPNote CPPattern::get_transformed_script_note(uint8_t p_column,uint16_t p_row ) { - - CPNote n = get_note( p_column, p_row ); - +CPNote CPPattern::get_transformed_script_note(uint8_t p_column, uint16_t p_row) { + + CPNote n = get_note(p_column, p_row); + // get source channel and note - - int channel = get_scripted_note_target_channel( p_column, p_row ); - CPNote src_n = get_note( channel, 0 ); - - if ( src_n.note == CPNote::SCRIPT ) return CPNote(); - - script_transform_note( src_n, n ); - + + int channel = get_scripted_note_target_channel(p_column, p_row); + CPNote src_n = get_note(channel, 0); + + if (src_n.note == CPNote::SCRIPT) return CPNote(); + + script_transform_note(src_n, n); + return src_n; - } int CPPattern::get_scripted_note_target_channel(uint8_t p_column, uint16_t p_row) { - - CPNote n = get_note( p_column, p_row ); - - if ( n.note != CPNote::SCRIPT ) return CPNote::EMPTY; - + + CPNote n = get_note(p_column, p_row); + + if (n.note != CPNote::SCRIPT) return CPNote::EMPTY; + int channel = n.instrument; - - if ( n.script_source_sign == '\0' ) { - - if ( channel < 0 || channel >= CPPattern::WIDTH ) return CPNote::EMPTY; - + + if (n.script_source_sign == '\0') { + + if (channel < 0 || channel >= CPPattern::WIDTH) return CPNote::EMPTY; + } else { - - channel = p_column + ( ( n.script_source_sign=='+') ? 1 : -1 ) * (channel+1); - if ( channel < 0 || channel >= CPPattern::WIDTH ) return CPNote::EMPTY; - + + channel = p_column + ((n.script_source_sign == '+') ? 1 : -1) * (channel + 1); + if (channel < 0 || channel >= CPPattern::WIDTH) return CPNote::EMPTY; } - + return channel; } void CPPattern::scripted_clone(uint8_t p_column, uint16_t p_row) { - - int channel = get_scripted_note_target_channel( p_column, p_row ); + + int channel = get_scripted_note_target_channel(p_column, p_row); int src_row = 1; - CPNote script_n = get_note( p_column, p_row ); - - for ( int row = p_row+1; row < length; ++row ) { - - CPNote src_n = get_note( channel, src_row ); - CPNote target_n = get_note( p_column, row ); - - if ( target_n.note != CPNote::SCRIPT ) { - if ( src_n.note == CPNote::SCRIPT ) { - src_n = CPNote(); - channel = CPNote::EMPTY; + CPNote script_n = get_note(p_column, p_row); + + for (int row = p_row + 1; row < length; ++row) { + + CPNote src_n = get_note(channel, src_row); + CPNote target_n = get_note(p_column, row); + + if (target_n.note != CPNote::SCRIPT) { + if (src_n.note == CPNote::SCRIPT) { + src_n = CPNote(); + channel = CPNote::EMPTY; + } + + script_transform_note(src_n, script_n); + + src_n.cloned = true; + set_note(p_column, row, src_n); + + } else { + + return; } - - script_transform_note( src_n, script_n ); - - src_n.cloned = true; - set_note( p_column, row, src_n ); - - } else { - - return; - - } - - src_row++; + + src_row++; } - } void CPPattern::scripted_clone_remove(uint8_t p_column, uint16_t p_row) { - - if ( get_note( p_column, p_row ).cloned ) - set_note( p_column, p_row, CPNote() ); - - for ( int row = p_row+1; row < length; ++row ) { - - CPNote target_n = get_note( p_column, row ); - - if ( target_n.note != CPNote::SCRIPT ) { - - set_note( p_column, row, CPNote() ); - - } else { - - return; - - } - + + if (get_note(p_column, p_row).cloned) + set_note(p_column, p_row, CPNote()); + + for (int row = p_row + 1; row < length; ++row) { + + CPNote target_n = get_note(p_column, row); + + if (target_n.note != CPNote::SCRIPT) { + + set_note(p_column, row, CPNote()); + + } else { + + return; + } } - } -void CPPattern::script_transform_note(CPNote& n, const CPNote& p_note) { - +void CPPattern::script_transform_note(CPNote &n, const CPNote &p_note) { + // set instrument - - if ( n.note < CPNote::NOTES && p_note.volume != CPNote::EMPTY ) { - - n.instrument = p_note.volume; - + + if (n.note < CPNote::NOTES && p_note.volume != CPNote::EMPTY) { + + n.instrument = p_note.volume; } - + // transpose - - if ( n.note < CPNote::NOTES && p_note.command != CPNote::EMPTY ) { - - int transpose = ( p_note.parameter & 0xF ) + ( p_note.parameter / 0x10 ) * 12; - - if ( p_note.command == '^' ) { - - if ( n.note >= CPNote::NOTES-transpose ) - n.note = CPNote::NOTES-1; - else - n.note += transpose; - - } else if ( p_note.command == 'v' ) { - - if ( n.note <= transpose ) - n.note = 0; - else - n.note -= transpose; - - } + + if (n.note < CPNote::NOTES && p_note.command != CPNote::EMPTY) { + + int transpose = (p_note.parameter & 0xF) + (p_note.parameter / 0x10) * 12; + + if (p_note.command == '^') { + + if (n.note >= CPNote::NOTES - transpose) + n.note = CPNote::NOTES - 1; + else + n.note += transpose; + + } else if (p_note.command == 'v') { + + if (n.note <= transpose) + n.note = 0; + else + n.note -= transpose; + } } - } -bool CPPattern::update_scripted_clones_sourcing_channel( int channel ) { - - bool updated = false; - - for ( int x = 0; x < WIDTH; ++x ) { - - for (int y = 0; y < length; ++y ) { - - if ( channel == get_scripted_note_target_channel( x, y ) ) { - - scripted_clone( x, y ); - updated = true; - } - +bool CPPattern::update_scripted_clones_sourcing_channel(int channel) { + + bool updated = false; + + for (int x = 0; x < WIDTH; ++x) { + + for (int y = 0; y < length; ++y) { + + if (channel == get_scripted_note_target_channel(x, y)) { + + scripted_clone(x, y); + updated = true; + } + } } - - } - - return updated; + + return updated; } void CPPattern::set_length(uint16_t p_rows) { - - - if (event_count==0) { - - if (p_rows>=MIN_ROWS) - length=p_rows; + if (event_count == 0) { - - return; - + if (p_rows >= MIN_ROWS) + length = p_rows; + + return; } - - if (p_rows<MIN_ROWS) { + + if (p_rows < MIN_ROWS) { return; } - - if (p_rows<length) { - - Event* event_list=events; - if (event_list==0) { + + if (p_rows < length) { + + Event *event_list = events; + if (event_list == 0) { CP_PRINTERR("get_event_list() Failed"); return; } - - uint16_t target_pos=p_rows*WIDTH; + uint16_t target_pos = p_rows * WIDTH; int32_t pos_idx = get_event_pos(target_pos); - - if (pos_idx==-1) { + if (pos_idx == -1) { - CP_ERR_COND(pos_idx==-1); + CP_ERR_COND(pos_idx == -1); } - + if (resize_event_list_to(pos_idx)) { CP_PRINTERR("resize_event_list_to(pos_idx) Failed"); return; } - } - - length=p_rows; - + length = p_rows; } #if 0 void CPPattern::copy_to(CPPattern *p_pattern) const { @@ -551,24 +503,21 @@ void CPPattern::copy_to(CPPattern *p_pattern) const { } #endif uint16_t CPPattern::get_length() { - - + return length; } CPPattern::CPPattern() { - - - length=DEFAULT_LEN; - event_count=0; + + length = DEFAULT_LEN; + event_count = 0; clear(); - } bool CPPattern::is_empty() { - - return events==NULL; + + return events == NULL; } CPPattern::~CPPattern() { - + clear(); } |
