Assists music production by grouping standalone programs into sessions. Community version of "Non Session Manager".
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

722 lines
15KB

  1. /*******************************************************************************/
  2. /* Copyright (C) 2008 Jonathan Moore Liles */
  3. /* */
  4. /* This program is free software; you can redistribute it and/or modify it */
  5. /* under the terms of the GNU General Public License as published by the */
  6. /* Free Software Foundation; either version 2 of the License, or (at your */
  7. /* option) any later version. */
  8. /* */
  9. /* This program is distributed in the hope that it will be useful, but WITHOUT */
  10. /* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
  11. /* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
  12. /* more details. */
  13. /* */
  14. /* You should have received a copy of the GNU General Public License along */
  15. /* with This program; see the file COPYING. If not,write to the Free Software */
  16. /* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
  17. /*******************************************************************************/
  18. #include "debug.h"
  19. #include "event_list.H"
  20. /* The operations we perform on event lists are clumsy with STL lists
  21. and iterators so we have a custom doubly-linked list implementation
  22. here for complete control */
  23. namespace MIDI
  24. {
  25. #define RFOR_ALL( it ) for ( event *next, * it = _tail; it && ((next = it ->_prev), true) ; it = next )
  26. #define FOR_ALL( it ) for ( event *next, * it = _head; it && ((next = it ->_next), true) ; it = next )
  27. // #define FOR_ALL( e ) for ( event * e = _head; e; e = e ->_next )
  28. #define FOR_SELECTED( e ) FOR_ALL( e ) if ( e ->selected() )
  29. #define RFOR_SELECTED( e ) RFOR_ALL( e ) if ( e ->selected() )
  30. event_list::event_list ( void )
  31. {
  32. _head = NULL;
  33. _tail = NULL;
  34. _size = 0;
  35. }
  36. event_list::~event_list ( void )
  37. {
  38. clear();
  39. }
  40. /* copy constructor */
  41. event_list::event_list ( const event_list &el )
  42. {
  43. _copy( &el );
  44. }
  45. event_list &
  46. event_list::operator= ( const event_list &rhs )
  47. {
  48. if ( this != &rhs )
  49. {
  50. clear();
  51. _copy( &rhs );
  52. }
  53. return *this;
  54. }
  55. event_list &
  56. event_list::operator= ( const list <midievent> &rhs )
  57. {
  58. clear();
  59. for ( list <midievent>::const_iterator me = rhs.begin(); me != rhs.end(); me++ )
  60. {
  61. event *e = new event( *me );
  62. _insert( NULL, e );
  63. }
  64. relink();
  65. return *this;
  66. }
  67. /** allow indexing */
  68. event *
  69. event_list::operator[] ( unsigned int index )
  70. {
  71. unsigned int i = 0;
  72. for ( event *e = _head; e; (e = e->_next), ++i )
  73. if ( i == index )
  74. return e;
  75. // all else fails.
  76. return _tail;
  77. }
  78. void
  79. event_list::_copy ( const event_list *el )
  80. {
  81. if ( ! el->_head )
  82. {
  83. _head = _tail = NULL;
  84. _size = 0;
  85. return;
  86. }
  87. _head = new event( *(el->_head) );
  88. _head->_prev = NULL;
  89. event *p = _head;
  90. for ( event *e = el->_head->_next; e; e = e->_next )
  91. {
  92. event *n = new event( *e );
  93. n->_next = NULL;
  94. p->_next = n;
  95. n->_prev = p;
  96. p = n;
  97. }
  98. _tail = p;
  99. _size = el->_size;
  100. relink();
  101. }
  102. /** insert event /n/ before event /o/ */
  103. void
  104. event_list::_insert ( event *o, event *n )
  105. {
  106. ++_size;
  107. if ( ! o )
  108. {
  109. n->_next = NULL;
  110. n->_prev = _tail;
  111. if ( _tail )
  112. _tail->_next = n;
  113. _tail = n;
  114. if ( ! _head )
  115. _head = n;
  116. return;
  117. }
  118. event *t = o->_prev;
  119. o->_prev = n;
  120. n->_next = o;
  121. n->_prev = t;
  122. if ( ! t )
  123. _head = n;
  124. else
  125. t->_next = n;
  126. }
  127. void
  128. event_list::unlink ( event *e )
  129. {
  130. if ( e->_next )
  131. e->_next->_prev = e->_prev;
  132. else
  133. _tail = e->_prev;
  134. if ( e->_prev )
  135. e->_prev->_next = e->_next;
  136. else
  137. _head = e->_next;
  138. --_size;
  139. }
  140. void
  141. event_list::clear ( void )
  142. {
  143. for ( event *e = _head; e ; )
  144. {
  145. event *n = e->_next;
  146. delete e;
  147. e = n;
  148. }
  149. _head = NULL;
  150. _tail = NULL;
  151. _size = 0;
  152. }
  153. void
  154. event_list::mix ( event *ne )
  155. {
  156. FOR_ALL( e )
  157. if ( *e == *ne )
  158. {
  159. /* already have an event like this, drop it */
  160. if ( ne->linked() )
  161. delete ne->link();
  162. delete ne;
  163. return;
  164. }
  165. insert( ne );
  166. if ( ne->linked() )
  167. insert( ne->link() );
  168. }
  169. /** remove elements from list /el/ to this list */
  170. void
  171. event_list::merge ( event_list *el )
  172. {
  173. event *n;
  174. for ( event *e = el->_head; e; e = n )
  175. {
  176. n = e->_next;
  177. el->unlink( e );
  178. insert( e );
  179. }
  180. }
  181. /** unlink event e */
  182. void
  183. event_list::remove ( event *e )
  184. {
  185. unlink( e );
  186. delete e;
  187. }
  188. /** sorted insert /e/ */
  189. void
  190. event_list::insert ( event *e )
  191. {
  192. /* find the place to insert */
  193. RFOR_ALL( i )
  194. if ( *e >= *i )
  195. {
  196. _insert( i->_next, e );
  197. return;
  198. }
  199. _insert( _head, e );
  200. }
  201. /** just append event without sorting */
  202. void
  203. event_list::append ( event *e )
  204. {
  205. _insert( NULL, e );
  206. }
  207. event *
  208. event_list::first ( void ) const
  209. {
  210. return _head;
  211. }
  212. event *
  213. event_list::last ( void ) const
  214. {
  215. return _tail;
  216. }
  217. /*************/
  218. /* Selection */
  219. /*************/
  220. /** select all events from /start/ to /end/ inclusive */
  221. void
  222. event_list::select ( tick_t start, tick_t end )
  223. {
  224. FOR_ALL( e )
  225. {
  226. tick_t ts = e->timestamp();
  227. /* don't count note offs exactly on start */
  228. if ( ts == start && e->is_note_off() )
  229. continue;
  230. if ( ts >= start && ts < end )
  231. e->select();
  232. }
  233. }
  234. /** select note evenets from /start/ to /end/ within range /hi/ through /lo/ */
  235. void
  236. event_list::select ( tick_t start, tick_t end, int hi, int lo )
  237. {
  238. FOR_ALL( e )
  239. {
  240. tick_t ts = e->timestamp();
  241. /* don't count note offs exactly on start */
  242. if ( ! e->is_note_on() )
  243. continue;
  244. if ( ts >= start && ts < end &&
  245. e->note() <= hi && e->note() >= lo )
  246. e->select();
  247. }
  248. }
  249. /** select ALL events */
  250. void
  251. event_list::select_all ( void )
  252. {
  253. FOR_ALL( e )
  254. e->select();
  255. }
  256. void
  257. event_list::select_none ( void )
  258. {
  259. FOR_ALL( e )
  260. e->deselect();
  261. }
  262. void
  263. event_list::invert_selection ( void )
  264. {
  265. FOR_ALL( e )
  266. if ( ! e->is_note_off() )
  267. {
  268. if ( e->selected() )
  269. e->deselect();
  270. else
  271. e->select();
  272. }
  273. }
  274. /** remove all selected events */
  275. void
  276. event_list::remove_selected ( void )
  277. {
  278. FOR_SELECTED( e )
  279. {
  280. remove( e );
  281. }
  282. }
  283. /** copy selected events into event list /el/ */
  284. void
  285. event_list::copy_selected ( event_list *el ) const
  286. {
  287. event *fi = first();
  288. if ( ! fi )
  289. return;
  290. tick_t offset = fi->timestamp();
  291. FOR_SELECTED( e )
  292. {
  293. event *nel = 0;
  294. if ( e->linked() )
  295. nel = new event(*e->link());
  296. event *ne = new event(*e);
  297. ne->timestamp( ne->timestamp() - offset );
  298. if ( nel )
  299. {
  300. nel->link( ne );
  301. ne->link( nel );
  302. nel->timestamp( nel->timestamp() - offset );
  303. }
  304. el->mix(ne);
  305. }
  306. }
  307. /** add events from list /el/ */
  308. void
  309. event_list::paste ( tick_t offset, const event_list *el )
  310. {
  311. event *n;
  312. for ( event *e = el->_head; e; e = n )
  313. {
  314. n = e->_next;
  315. event *ne = new event(*e);
  316. ne->link( NULL );
  317. ne->timestamp( ne->timestamp() + offset );
  318. insert( ne );
  319. }
  320. relink();
  321. }
  322. /** transpose selected notes (ignoring other event types) by /n/ tones
  323. * (may span octaves) */
  324. void
  325. event_list::transpose_selected ( int n )
  326. {
  327. FOR_SELECTED( e )
  328. {
  329. if ( e->is_note_on() )
  330. e->note( e->note() + n );
  331. }
  332. }
  333. /** change all notes of value /from/ to /to/ */
  334. void
  335. event_list::rewrite_selected ( int from, int to )
  336. {
  337. FOR_SELECTED( e )
  338. {
  339. if ( e->is_note_on() && e->note() == from )
  340. e->note( to );
  341. }
  342. }
  343. /** set velocity of selected notes to /v/ */
  344. void
  345. event_list::selected_velocity ( int v )
  346. {
  347. FOR_SELECTED( e )
  348. {
  349. if ( e->is_note_on() )
  350. e->note_velocity( v );
  351. }
  352. }
  353. /** get timestamp of earliest selected event */
  354. tick_t
  355. event_list::selection_min ( void ) const
  356. {
  357. FOR_SELECTED( e )
  358. return e->timestamp();
  359. return 0;
  360. }
  361. tick_t
  362. event_list::selection_max ( void ) const
  363. {
  364. RFOR_SELECTED( e )
  365. return e->timestamp();
  366. return 0;
  367. }
  368. /** move selected events by offset /o/ */
  369. void
  370. event_list::nudge_selected ( long o )
  371. {
  372. if ( o < 0 )
  373. if ( selection_min() < (tick_t)( 0 - o ) )
  374. return;
  375. if ( o < 0 )
  376. {
  377. FOR_SELECTED( e )
  378. move( e, o );
  379. }
  380. else
  381. {
  382. RFOR_SELECTED( e )
  383. move( e, o );
  384. }
  385. }
  386. /** move block of selected events to tick /tick/ */
  387. void
  388. event_list::move_selected ( tick_t tick )
  389. {
  390. /* if ( o < 0 ) */
  391. /* if ( selection_min() < (tick_t)( 0 - o ) ) */
  392. /* return; */
  393. tick_t min = selection_min();
  394. tick_t offset = tick - min;
  395. nudge_selected( offset );
  396. /* FOR_SELECTED( e ) */
  397. /* { */
  398. /* e->timestamp( e->timestamp() + offset ); */
  399. /* sort( e ); */
  400. /* move( e, o ); */
  401. /* } */
  402. }
  403. void
  404. event_list::push_selection ( void )
  405. {
  406. FOR_ALL( e )
  407. if ( e->_selected )
  408. ++e->_selected;
  409. }
  410. void
  411. event_list::pop_selection ( void )
  412. {
  413. FOR_ALL( e )
  414. if ( e->_selected )
  415. --e->_selected;
  416. }
  417. /** verify that all note ons are linked to note offs */
  418. bool
  419. event_list::verify ( void ) const
  420. {
  421. FOR_ALL( e )
  422. if ( e->is_note_on() && ! e->linked() )
  423. return false;
  424. return true;
  425. }
  426. /** link /e/ (a note on) with the next corresponding note off */
  427. void
  428. event_list::link ( event *on )
  429. {
  430. if ( ! on->is_note_on() )
  431. return;
  432. for ( event *off = on->_next; off; off = off->_next )
  433. {
  434. if ( off->linked() )
  435. continue;
  436. if ( off->is_note_off() &&
  437. off->channel() == on->channel() &&
  438. off->note() == on->note() )
  439. {
  440. on->link( off );
  441. return;
  442. }
  443. }
  444. WARNING( "no corresponding note_off found for note on, repairing" );
  445. event *off = new event( *on );
  446. off->opcode( event::NOTE_OFF );
  447. on->link( off );
  448. insert( off );
  449. }
  450. /** insert /l/ ticks of time at /start/ */
  451. void
  452. event_list::insert_time ( tick_t start, tick_t l )
  453. {
  454. FOR_ALL( e )
  455. {
  456. tick_t ts = e->timestamp();
  457. if ( e->is_note_off() )
  458. continue;
  459. if ( ts >= start )
  460. {
  461. if ( e->is_note_on() )
  462. {
  463. /* only notes ENTIRELY WITHIN the range will be moved */
  464. e->timestamp( ts + l );
  465. e->link()->timestamp( e->link()->timestamp() + l );
  466. }
  467. else
  468. e->timestamp( e->timestamp() + l );
  469. }
  470. }
  471. sort();
  472. }
  473. /** delete events in range and close the gap */
  474. void
  475. event_list::delete_time ( tick_t start, tick_t end )
  476. {
  477. tick_t l = end - start;
  478. push_selection();
  479. select( start, end );
  480. remove_selected();
  481. pop_selection();
  482. /* cut out the slack */
  483. FOR_ALL( e )
  484. {
  485. tick_t ts = e->timestamp();
  486. if ( ts >= end )
  487. e->timestamp( ts - l );
  488. }
  489. }
  490. /** link all note ons to subsequent note offs */
  491. void
  492. event_list::relink ( void )
  493. {
  494. /* clear links */
  495. FOR_ALL( e )
  496. e->link( NULL );
  497. /* link */
  498. FOR_ALL( on )
  499. link( on );
  500. if ( ! verify() )
  501. FATAL( "event list failed verification" );
  502. }
  503. /** resort event /e/ */
  504. void
  505. event_list::sort ( event *e )
  506. {
  507. unlink( e );
  508. insert( e );
  509. }
  510. /** resort entire list */
  511. void
  512. event_list::sort ( void )
  513. {
  514. event_list *temp = new event_list( );
  515. _head = temp->_head;
  516. _tail = temp->_tail;
  517. FOR_ALL( n )
  518. temp->insert( n );
  519. temp->_head = NULL;
  520. delete temp;
  521. relink();
  522. }
  523. /** move event /e/ by /o/ ticks */
  524. void
  525. event_list::move ( event *e, long o )
  526. {
  527. e->timestamp( e->timestamp() + o );
  528. sort( e );
  529. }
  530. bool
  531. event_list::empty ( void ) const
  532. {
  533. return _head == NULL;
  534. }
  535. size_t
  536. event_list::size ( void ) const
  537. {
  538. return _size;
  539. }
  540. void
  541. event_list::_hi_lo ( bool sel, int *hi, int *lo ) const
  542. {
  543. *hi = 0;
  544. *lo = 127;
  545. FOR_ALL( e )
  546. {
  547. if ( sel && ! e->selected() )
  548. continue;
  549. if ( ! e->is_note_on() )
  550. continue;
  551. int n = e->note();
  552. if ( n > *hi )
  553. *hi = n;
  554. if ( n < *lo )
  555. *lo = n;
  556. }
  557. }
  558. /** set /hi/ and /lo/ to the lowest and highest pitched note events in
  559. * this list, respectively */
  560. void
  561. event_list::hi_lo_note ( int *hi, int *lo ) const
  562. {
  563. _hi_lo( false, hi, lo );
  564. }
  565. void
  566. event_list::selected_hi_lo_note ( int *hi, int *lo ) const
  567. {
  568. _hi_lo( true, hi, lo );
  569. }
  570. }