2 /*******************************************************************************/
3 /* Copyright (C) 2007-2008 Jonathan Moore Liles */
5 /* This program is free software; you can redistribute it and/or modify it */
6 /* under the terms of the GNU General Public License as published by the */
7 /* Free Software Foundation; either version 2 of the License, or (at your */
8 /* option) any later version. */
10 /* This program is distributed in the hope that it will be useful, but WITHOUT */
11 /* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
12 /* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
15 /* You should have received a copy of the GNU General Public License along */
16 /* with This program; see the file COPYING. If not,write to the Free Software */
17 /* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
18 /*******************************************************************************/
26 #include "transport.H"
29 int pattern::note_shape = SQUARE;
31 event_list pattern::_recorded_events;
32 vector <pattern*> pattern::_patterns;
34 int pattern::_pattern_recording;
36 signal <void> pattern::signal_create_destroy;
38 pattern::pattern ( void )
43 viewport.y = 64 - ( viewport.h + ( viewport.h / 2 ) );
55 // we need to reinitalize this.
56 data *d = const_cast< data * >( _rd );
58 d->length = x_to_ts( _bpb * _ppqn * _bars );
60 // mapping.open( Mapping::INSTRUMENT, "Default" );
61 mapping.open( Mapping::SCALE, "Major" );
66 asprintf( &s, "Pattern %d", number() );
72 pattern::_add ( void )
74 // keep track of all the patterns
75 pattern::_patterns.push_back( this );
78 signal_create_destroy();
81 pattern::~pattern ( void )
83 DMESSAGE( "deleting pattern %d", number() );
84 signal_create_destroy();
87 /* copy constructor */
88 pattern::pattern ( const pattern &rhs ) : Grid( rhs )
92 _channel = rhs._channel;
93 _queued = rhs._queued;
95 mapping = rhs.mapping;
101 pattern::clone ( void )
103 return new pattern( *this );
111 pattern::solo ( void )
113 return pattern::_solo;
117 pattern::patterns ( void )
119 return pattern::_patterns.size();
122 // this is the static one
124 pattern::pattern_by_number ( int n )
126 if ( n <= patterns() && n > 0 )
128 return pattern::_patterns[ n - 1 ];
133 /** delete all patterns in preparation for a reload */
135 pattern::reset ( void )
137 for ( int n = pattern::patterns(); n-- ; )
139 delete pattern::_patterns.back();
140 pattern::_patterns.pop_back();
144 /* records a MIDI event into a temporary buffer. It'll only be
145 * permanently added to pattern after recording stops or the pattern
148 pattern::record_event ( const midievent *me )
150 /* set the events aside in a dedicated list--the recording pattern
151 * will decide what to do with them the next time around the
154 /* FIXME: how does the pattern decide when to loop? It seems
155 reasonable that /merge/ and /replace/ modes should be bound to
156 the previous pattern length, but what about "NEW" mode? Should it
157 just use this entire list as a new pattern (of whatever length)
158 when recording is halted? */
160 event *e = new event;
164 pattern::_recorded_events.append( e );
166 record_mode_e mode = config.record_mode;
168 if ( mode == OVERWRITE || mode == LAYER )
170 pattern *p = pattern::recording();
192 /* let's fill in the pattern 'live' in merge mode. looks a little
193 complicated because we have to wait for a note-off before it's
195 if ( mode == MERGE || mode == NEW )
198 pattern *p = pattern::recording();
202 event_list *el = &pattern::_recorded_events;
204 if ( e->is_note_off() )
208 for ( event *on = el->last(); on; on = on->prev() )
210 if ( on->is_note_on() &&
211 on->is_same_note( off ) )
218 tick_t duration = off->timestamp() - on->timestamp();
220 /* place within loop */
222 fmod( on->timestamp() - p->_start, p->_rw->length ) );
225 on->note_duration( duration );
227 p->_rw->events.mix( on );
234 if ( ! e->is_note_on() )
239 e->timestamp( fmod( e->timestamp(), p->_rw->length ) );
242 p->_rw->events.insert( e );
245 p->_suspend_update = true;
247 p->_suspend_update = false;
252 pattern::recording ( void )
254 return pattern::pattern_by_number( pattern::_pattern_recording );
259 /*******************/
260 /* Virtual Methods */
261 /*******************/
263 /* allows us to create a new pattern/phrase from a base class pointer */
265 pattern::create ( void )
267 if ( pattern::patterns() < 128 )
276 pattern::by_number ( int n ) const
278 return pattern::pattern_by_number( n );
282 pattern::put ( int x, int y, tick_t l )
284 l = l ? l : PPQN * 4 / _note;
286 Grid::put( x, y, l );
288 if ( ! transport.rolling )
293 e.status( event::NOTE_ON );
294 e.channel( _channel );
296 e.note( y_to_note( y ) );
297 e.note_velocity( 64 );
299 midi_output_immediate_event ( _port, &e );
304 pattern::row_name ( int r ) const
306 return mapping.note_name( y_to_note( r ) );
310 pattern::draw_row_names ( Canvas *c ) const
312 for ( int y = 128; y-- ; )
313 c->draw_row_name( y, mapping.note_name( y_to_note( y ) ), mapping.velocity( y_to_note( y ) ) );
317 pattern::trigger ( tick_t start, tick_t end )
319 /* ASSERT( end != -1 && start <= end, "programming error: invalid loop trigger! (%lu-%lu)", start, end ); */
325 /* trigger forever */
327 pattern::trigger ( void )
329 trigger( transport.frame / transport.frames_per_tick, INFINITY );
333 pattern::stop ( void ) const
344 pattern::mode ( int n )
346 if ( QUEUE == song.play_mode )
354 if ( pattern::_solo )
355 ((Grid*)pattern::pattern_by_number( pattern::_solo ))->mode( PLAY );
356 pattern::_solo = _number;
361 if ( pattern::_solo == _number )
369 pattern::mode ( void ) const
371 if ( pattern::_solo )
373 if ( pattern::_solo == _number )
382 /* queue a mode change for the next loop */
384 pattern::queue ( int m )
390 pattern::queue ( void ) const
395 /* WARNING: runs in the RT thread! */
396 // output notes from /start/ to /end/ (absolute)
398 pattern::play ( tick_t start, tick_t end ) const
400 /* get our own copy of this pointer so UI thread can change it. */
401 const data *d = const_cast< const data * >(_rd);
406 // WARNING( "attempt to play a loop (pattern %d) that has ended (%lu, %lu)", number(), start, _end );
414 if ( start < _start )
420 // where we are in the absolute time
421 tick_t tick = start - _start;
422 int num_played = tick / d->length;
423 tick_t offset = _start + (d->length * num_played);
427 _index = fmod( tick, d->length );
429 bool reset_queued = false;
431 if ( _index < end - start )
433 /* period covers the beginning of the loop */
434 DMESSAGE( "%s pattern %d at tick %f (ls: %f, le: %f, o: %f)", _playing ? "Looped" : "Triggered", number(), start, _start, _end, offset );
438 if ( PLAY == _queued || SOLO == _queued )
440 /* set the start point to loop boundary */
441 start = start - _index;
446 if ( pattern::_solo )
447 ((Grid*)pattern::pattern_by_number( pattern::_solo ))->mode( PLAY );
449 pattern::_solo = _number;
453 if ( pattern::_solo == _number )
460 else if ( _index >= d->length - ( end - start ) )
462 if ( MUTE == _queued )
464 /* set the end point to loop boundary */
473 if ( mode() == MUTE )
479 if ( d->events.empty() )
482 for ( e = d->events.first(); e; e = e->next() )
484 // MESSAGE( "s[%ld] -> t[%ld] : %ld, len %ld", start, end, e->timestamp(), _length ); // (*e).print();
486 tick_t ts = e->timestamp() + offset;
496 // MESSAGE( "timestamp %d, tick %d, ts - start == %lu", e->timestamp(), start,
497 // e->timestamp() - start);
499 /* set the channel */
500 me.channel( _channel );
502 /* set the in-cycle timestamp */
503 me.timestamp ( ts - start );
505 if ( me.is_note_on() )
507 if ( mapping.translate( &me ) )
508 midi_output_event( _port, &me, 1 + e->note_duration() );
511 if ( me.is_note_off() )
513 if ( mapping.translate( &me ) )
514 midi_output_event( _port, &me, 0 );
517 /* any other event type */
518 midi_output_event( _port, &me );
522 // ran out of events, but there's still some loop left to play.
526 DMESSAGE( "out of events, resetting to satisfy loop" );
530 if ( _queued >= 0 && reset_queued )
538 /* we're done playing this trigger */
539 DMESSAGE( "Pattern %d ended at tick %f (ls: %f, le: %f, o: %f)", number(), end, _start, _end, offset );
546 /* Import /track/ of /f/ as new pattern */
548 pattern::import ( smf *f, int track )
550 if ( ! f->seek_track( track ) )
553 pattern *p = new pattern;
559 /* file could have any notes in it... Use Chromatic scale to
560 ensure all are visible */
561 p->mapping.open( Mapping::SCALE, "Chromatic" );
570 /** fill pattern from current track of /f/ */
572 pattern::load ( smf *f )
576 f->read_pattern_info( this );
580 list <midievent> *e = f->read_track_events( &len );
582 /* set channel to channel of first event... */
584 _channel = e->front().channel();
586 /* copy events into pattern */
598 /** save (export) pattern to file /name/ */
600 pattern::save ( const char *name ) const
604 /* open for writing */
605 f.open( name, smf::WRITE );
607 /* writing SMF 0 track */
610 f.open_track( _name, _number );
612 Grid::dump( &f, _channel );
614 f.close_track( length() );
617 /** dump pattern as a track in an already open MIDI file */
619 pattern::dump ( smf *f ) const
621 f->open_track( _name, _number );
623 f->write_pattern_info( this );
625 Grid::dump( f, _channel );
627 f->close_track( length() );
632 pattern::randomize_row ( int y, int feel, float probability )
636 int l = PPQN * 4 / _note;
638 int bx = ts_to_x( _rw->length - l );
640 float *p = (float *)alloca( feel * sizeof( float ) );
642 float prob = probability;
643 for ( int i = 0; i < feel; i++ )
646 // reduce probability as we move away from center
650 for ( int x = 0; x < bx; x++ )
652 float r = ((float)rand()) / RAND_MAX;
654 if ( p[ x % feel ] + r >= 1 )
666 pattern::record ( int mode )
669 pattern::_pattern_recording = _number;
673 pattern::record_stop ( void )
680 if ( config.record_mode == NEW )
683 pattern::_recorded_events.clear();
688 /*******************************/
689 /* Pattern specific accessors. */
690 /*******************************/
694 pattern::port ( void ) const
700 pattern::port ( int p )
706 pattern::channel ( void ) const
712 pattern::channel ( int c )
718 pattern::note ( void ) const
724 pattern::note ( int n )
731 pattern::ppqn ( void ) const
737 pattern::ppqn ( int n )
743 pattern::key ( void ) const
745 return mapping.key();
749 pattern::key ( int k )