Update NTK.
[nondaw.git] / sequencer / src / pattern.C
blob803d81d2e45c8af0e42a1442f17cee0b04f6bd24
2 /*******************************************************************************/
3 /* Copyright (C) 2007-2008 Jonathan Moore Liles                                */
4 /*                                                                             */
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.                                                  */
9 /*                                                                             */
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   */
13 /* more details.                                                               */
14 /*                                                                             */
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 /*******************************************************************************/
20 #include "pattern.H"
21 #include "non.H"
22 #include "common.h"
23 #include "smf.H"
25 #include "jack.H"
26 #include "transport.H"
27 #include <math.h>
29 int pattern::note_shape = SQUARE;
31 event_list pattern::_recorded_events;
32 vector <pattern*> pattern::_patterns;
33 int pattern::_solo;
34 int pattern::_pattern_recording;
36 signal <void> pattern::signal_create_destroy;
38 pattern::pattern ( void )
40     viewport.h = 32;
41     viewport.w = 32;
43     viewport.y = 64 - ( viewport.h + ( viewport.h / 2 ) );
45     _channel = _port = 0;
47     _ppqn = 4;
48     _bpb  = 4;
49     _note = 8;
51     _queued = -1;
53     int _bars = 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" );
63     _add();
65     char *s;
66     asprintf( &s, "Pattern %d", number() );
68     name( s );
71 void
72 pattern::_add ( void )
74     // keep track of all the patterns
75     pattern::_patterns.push_back( this );
76     _number = patterns();
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 )
90     _note    = rhs._note;
91     _port    = rhs._port;
92     _channel = rhs._channel;
93     _queued  = rhs._queued;
94     
95     mapping = rhs.mapping;
97     _add();
100 pattern *
101 pattern::clone ( void )
103     return new pattern( *this );
106 /******************/
107 /* Static methods */
108 /******************/
111 pattern::solo ( void )
113     return pattern::_solo;
117 pattern::patterns ( void )
119     return pattern::_patterns.size();
122 // this is the static one
123 pattern *
124 pattern::pattern_by_number ( int n )
126     if ( n <= patterns() && n > 0 )
127     {
128         return pattern::_patterns[ n - 1 ];
129     }
130     return NULL;
133 /** delete all patterns in preparation for a reload */
134 void
135 pattern::reset ( void )
137     for ( int n = pattern::patterns(); n-- ; )
138     {
139         delete pattern::_patterns.back();
140         pattern::_patterns.pop_back();
141     }
144 /* records a MIDI event into a temporary buffer. It'll only be
145  * permanently added to pattern after recording stops or the pattern
146  * loops. */
147 void
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
152      * loop */
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;
162     *e = *me;
164     pattern::_recorded_events.append( e );
166     record_mode_e mode = config.record_mode;
168     if ( mode == OVERWRITE || mode == LAYER )
169     {
170         pattern *p = pattern::recording();
172         if ( ! p->_cleared )
173         {
175             if ( mode == LAYER )
176             {
177                 p->record_stop();
179                 p = p->clone();
181                 p->record( 0 );
182             }
184             p->clear();
186             p->_cleared = true;
187         }
189         mode = MERGE;
190     }
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
194        safe to insert */
195     if ( mode == MERGE || mode == NEW )
196     {
198         pattern *p = pattern::recording();
200         p->lock();
202         event_list *el = &pattern::_recorded_events;
204         if ( e->is_note_off() )
205         {
206             event *off = e;
208             for ( event *on = el->last(); on; on = on->prev() )
209             {
210                 if ( on->is_note_on() &&
211                      on->is_same_note( off ) )
212                     // &&
213                     //   *on < *e )
214                 {
215                     el->unlink( on );
216                     el->unlink( off );
218                     tick_t duration = off->timestamp() - on->timestamp();
220                     /* place within loop */
221                     on->timestamp( 
222                         fmod( on->timestamp() - p->_start, p->_rw->length ) );
224                     on->link( off );
225                     on->note_duration( duration );
227                     p->_rw->events.mix( on );
229                     break;
230                 }
231             }
232         }
233         else
234             if ( ! e->is_note_on() )
235             {
237                 // if ( ! filter )
239                 e->timestamp( fmod( e->timestamp(), p->_rw->length ) );
241                 el->unlink( e );
242                 p->_rw->events.insert( e );
243             }
244         
245         p->_suspend_update = true;
246         p->unlock();
247         p->_suspend_update = false;
248     }
251 pattern *
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  */
264 pattern *
265 pattern::create ( void )
267     if ( pattern::patterns() < 128 )
268     {
269         return new pattern;
270     }
271     else
272         return NULL;
275 pattern *
276 pattern::by_number ( int n ) const
278     return pattern::pattern_by_number( n );
281 void
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 )
289     {
290         /* echo note */
291         midievent e;
293         e.status( event::NOTE_ON );
294         e.channel( _channel );
295         e.timestamp( l );
296         e.note( y_to_note( y ) );
297         e.note_velocity( 64 );
299         midi_output_immediate_event ( _port, &e );
300     }
303 const char *
304 pattern::row_name ( int r ) const
306     return mapping.note_name( y_to_note( r ) );
309 void
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 ) ) );
316 void
317 pattern::trigger ( tick_t start, tick_t end )
319     /* ASSERT( end != -1 && start <= end, "programming error: invalid loop trigger! (%lu-%lu)", start, end ); */
321     _start = start;
322     _end   = end;
325 /* trigger forever */
326 void
327 pattern::trigger ( void )
329     trigger( transport.frame / transport.frames_per_tick, INFINITY );
332 void
333 pattern::stop ( void ) const
335     _playing = false;
337     _start = 0;
338     _end   = 0;
339     _index = 0;
343 void
344 pattern::mode ( int n )
346     if ( QUEUE == song.play_mode )
347     {
348         queue( n );
349         return;
350     }
352     if ( n == SOLO )
353     {
354         if ( pattern::_solo )
355             ((Grid*)pattern::pattern_by_number( pattern::_solo ))->mode( PLAY );
356         pattern::_solo = _number;
357         Grid::mode( SOLO );
358     }
359     else
360     {
361         if ( pattern::_solo == _number )
362             pattern::_solo = 0;
364         Grid::mode( n );
365     }
369 pattern::mode ( void ) const
371     if ( pattern::_solo )
372     {
373         if ( pattern::_solo == _number )
374             return SOLO;
375         else
376             return MUTE;
377     }
378     else
379         return Grid::mode();
382 /* queue a mode change for the next loop  */
383 void
384 pattern::queue ( int m )
386     _queued = m;
390 pattern::queue ( void ) const
392     return _queued;
395 /* WARNING: runs in the RT thread! */
396 // output notes from /start/ to /end/ (absolute)
397 void
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);
403     if ( start > _end )
404     {
405         stop();
406 //        WARNING( "attempt to play a loop (pattern %d) that has ended (%lu, %lu)", number(), start, _end );
407         return;
408     }
409     else
410         if ( end < _start )
411             // not ready yet
412             return;
414     if ( start < _start )
415         start = _start;
417     if ( end > _end )
418         end = _end;
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);
425     const event *e;
427     _index = fmod( tick, d->length );
429     bool reset_queued = false;
431     if ( _index < end - start )
432     {
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  );
436         _cleared = false;
438         if ( PLAY == _queued || SOLO == _queued )
439         {
440             /* set the start point to loop boundary */
441             start = start - _index;
442             _mode = _queued;
443             
444             if ( SOLO == _mode )
445             {
446                 if ( pattern::_solo )
447                     ((Grid*)pattern::pattern_by_number( pattern::_solo ))->mode( PLAY );
449                  pattern::_solo = _number;
450             }
451             else
452             {
453                 if ( pattern::_solo == _number )
454                     pattern::_solo = 0;
455             }
457             reset_queued = true;
458         }
459     }
460     else if ( _index >= d->length - ( end - start ) )
461     {
462         if ( MUTE == _queued )
463         {
464             /* set the end point to loop boundary */
465             end = end - _index;
467             reset_queued = true;
468         }
469     }
471     _playing = true;
473     if ( mode() == MUTE )
474         goto done;
476 try_again:
478     // pattern is empty
479     if ( d->events.empty() )
480         goto done;
482     for ( e = d->events.first(); e; e = e->next() )
483     {
484         //    MESSAGE( "s[%ld] -> t[%ld] : %ld, len %ld", start, end, e->timestamp(), _length ); // (*e).print();
486         tick_t ts = e->timestamp() + offset;
488         if ( ts >= end )
489             goto done;
491         if ( ts >= start )
492         {
493             midievent me = *e;
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() )
506             {
507                 if ( mapping.translate( &me ) )
508                     midi_output_event( _port, &me, 1 + e->note_duration() );
509             }
510             else
511                 if ( me.is_note_off() )
512                 {
513                     if ( mapping.translate( &me ) )
514                         midi_output_event( _port, &me, 0 );
515                 }
516                 else
517                     /* any other event type */
518                     midi_output_event( _port, &me );
519         }
520     }
522     // ran out of events, but there's still some loop left to play.
523     offset += d->length;
524     goto try_again;
526     DMESSAGE( "out of events, resetting to satisfy loop" );
528 done:
530     if ( _queued >= 0 && reset_queued )
531     {
532         _mode = _queued;
533         _queued = -1;
534     }
536     if ( _end == end )
537     {
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  );
541         stop();
542     }
546 /* Import /track/ of /f/ as new pattern */
547 pattern *
548 pattern::import ( smf *f, int track )
550     if ( ! f->seek_track( track ) )
551         return NULL;
553     pattern *p = new pattern;
555     p->lock();
557     p->load( f );
559     /* file could have any notes in it... Use Chromatic scale to
560        ensure all are visible  */
561     p->mapping.open( Mapping::SCALE, "Chromatic" );
563     p->unlock();
565     p->fit();
567     return p;
570 /** fill pattern from current track of /f/ */
571 void
572 pattern::load ( smf *f )
574     lock();
576     f->read_pattern_info( this );
578     tick_t len;
580     list <midievent> *e = f->read_track_events( &len );
582     /* set channel to channel of first event... */
583     if ( e->size() )
584         _channel = e->front().channel();
586     /* copy events into pattern */
587     _rw->events = *e;
588     delete e;
590     if ( len )
591         _rw->length = len;
593     unlock();
595 //    print();
598 /** save (export) pattern to file /name/  */
599 void
600 pattern::save ( const char *name ) const
602     smf f;
604     /* open for writing */
605     f.open( name, smf::WRITE );
607     /* writing SMF 0 track */
608     f.write_header( 0 );
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 */
618 void
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() );
631 void
632 pattern::randomize_row ( int y, int feel, float probability )
634     lock();
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++ )
644     {
645         p[i] = prob;
646         // reduce probability as we move away from center
647         prob *= 0.5;
648     }
650     for ( int x = 0; x < bx; x++ )
651     {
652         float r = ((float)rand()) / RAND_MAX;
654         if ( p[ x % feel ] + r >= 1 )
655             put( x, y, l );
656     }
658     unlock();
661 /*************/
662 /* Recording */
663 /*************/
665 void
666 pattern::record ( int mode )
668     _recording = true;
669     pattern::_pattern_recording = _number;
672 void
673 pattern::record_stop ( void )
675     if ( ! _recording )
676         return;
678     _recording = false;
680     if ( config.record_mode == NEW )
681         trim();
683     pattern::_recorded_events.clear();
688 /*******************************/
689 /* Pattern specific accessors. */
690 /*******************************/
694 pattern::port ( void ) const
696     return _port;
699 void
700 pattern::port ( int p )
702     _port = p;
706 pattern::channel ( void ) const
708     return _channel;
711 void
712 pattern::channel ( int c )
714     _channel = c;
718 pattern::note ( void ) const
720     return _note;
723 void
724 pattern::note ( int n )
726     _note = n;
731 pattern::ppqn ( void ) const
733     return _ppqn;
736 void
737 pattern::ppqn ( int n )
739     _ppqn = n;
743 pattern::key ( void ) const
745     return mapping.key();
748 void
749 pattern::key ( int k )
751     mapping.key( k );