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.

619 lines
11KB

  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 "event_list.H"
  19. /* The operations we perform on event lists are clumsy with STL lists
  20. and iterators so we have a custom doubly-linked list implementation
  21. here for complete control */
  22. #define RFOR_ALL( it ) for ( event *next, * it = _tail; it && ((next = it ->_prev), true) ; it = next )
  23. #define FOR_ALL( it ) for ( event *next, * it = _head; it && ((next = it ->_next), true) ; it = next )
  24. // #define FOR_ALL( e ) for ( event * e = _head; e; e = e ->_next )
  25. #define FOR_SELECTED( e ) FOR_ALL( e ) if ( e ->selected() )
  26. #define RFOR_SELECTED( e ) RFOR_ALL( e ) if ( e ->selected() )
  27. event_list::event_list ( void )
  28. {
  29. _head = NULL;
  30. _tail = NULL;
  31. _size = 0;
  32. }
  33. event_list::~event_list ( void )
  34. {
  35. clear();
  36. }
  37. /* copy constructor */
  38. event_list::event_list ( const event_list &el )
  39. {
  40. _copy( &el );
  41. }
  42. event_list &
  43. event_list::operator= ( const event_list &rhs )
  44. {
  45. if ( this != &rhs )
  46. {
  47. clear();
  48. _copy( &rhs );
  49. }
  50. return *this;
  51. }
  52. event_list &
  53. event_list::operator= ( const list <midievent> &rhs )
  54. {
  55. clear();
  56. for ( list <midievent>::const_iterator me = rhs.begin(); me != rhs.end(); me++ )
  57. {
  58. event *e = new event( *me );
  59. _insert( NULL, e );
  60. }
  61. relink();
  62. return *this;
  63. }
  64. /** allow indexing */
  65. event *
  66. event_list::operator[] ( unsigned int index )
  67. {
  68. unsigned int i = 0;
  69. for ( event *e = _head; e; (e = e->_next), ++i )
  70. if ( i == index )
  71. return e;
  72. // all else fails.
  73. return _tail;
  74. }
  75. void
  76. event_list::_copy ( const event_list *el )
  77. {
  78. if ( ! el->_head )
  79. {
  80. _head = _tail = NULL;
  81. _size = 0;
  82. return;
  83. }
  84. _head = new event( *(el->_head) );
  85. _head->_prev = NULL;
  86. event *p = _head;
  87. for ( event *e = el->_head->_next; e; e = e->_next )
  88. {
  89. event *n = new event( *e );
  90. n->_next = NULL;
  91. p->_next = n;
  92. n->_prev = p;
  93. p = n;
  94. }
  95. _tail = p;
  96. _size = el->_size;
  97. relink();
  98. }
  99. /** insert event /n/ before event /o/ */
  100. void
  101. event_list::_insert ( event *o, event *n )
  102. {
  103. ++_size;
  104. if ( ! o )
  105. {
  106. n->_next = NULL;
  107. n->_prev = _tail;
  108. if ( _tail )
  109. _tail->_next = n;
  110. _tail = n;
  111. if ( ! _head )
  112. _head = n;
  113. return;
  114. }
  115. event *t = o->_prev;
  116. o->_prev = n;
  117. n->_next = o;
  118. n->_prev = t;
  119. if ( ! t )
  120. _head = n;
  121. else
  122. t->_next = n;
  123. }
  124. void
  125. event_list::unlink ( event *e )
  126. {
  127. if ( e->_next )
  128. e->_next->_prev = e->_prev;
  129. else
  130. _tail = e->_prev;
  131. if ( e->_prev )
  132. e->_prev->_next = e->_next;
  133. else
  134. _head = e->_next;
  135. --_size;
  136. }
  137. void
  138. event_list::clear ( void )
  139. {
  140. for ( event *e = _head; e ; )
  141. {
  142. event *n = e->_next;
  143. delete e;
  144. e = n;
  145. }
  146. _head = NULL;
  147. _tail = NULL;
  148. _size = 0;
  149. }
  150. void
  151. event_list::mix ( event *ne )
  152. {
  153. FOR_ALL( e )
  154. if ( *e == *ne )
  155. {
  156. /* already have an event like this, drop it */
  157. if ( ne->linked() )
  158. delete ne->link();
  159. delete ne;
  160. return;
  161. }
  162. insert( ne );
  163. if ( ne->linked() )
  164. insert( ne->link() );
  165. }
  166. /** remove elements from list /el/ to this list */
  167. void
  168. event_list::merge ( event_list *el )
  169. {
  170. event *n;
  171. for ( event *e = el->_head; e; e = n )
  172. {
  173. n = e->_next;
  174. el->unlink( e );
  175. insert( e );
  176. }
  177. }
  178. /** unlink event e */
  179. void
  180. event_list::remove ( event *e )
  181. {
  182. unlink( e );
  183. delete e;
  184. }
  185. /** sorted insert /e/ */
  186. void
  187. event_list::insert ( event *e )
  188. {
  189. /* find the place to insert */
  190. RFOR_ALL( i )
  191. if ( *e >= *i )
  192. {
  193. _insert( i->_next, e );
  194. return;
  195. }
  196. _insert( _head, e );
  197. }
  198. /** just append event without sorting */
  199. void
  200. event_list::append ( event *e )
  201. {
  202. _insert( NULL, e );
  203. }
  204. event *
  205. event_list::first ( void ) const
  206. {
  207. return _head;
  208. }
  209. event *
  210. event_list::last ( void ) const
  211. {
  212. return _tail;
  213. }
  214. /*************/
  215. /* Selection */
  216. /*************/
  217. /** select all events from /start/ to /end/ inclusive */
  218. void
  219. event_list::select ( tick_t start, tick_t end )
  220. {
  221. FOR_ALL( e )
  222. {
  223. tick_t ts = e->timestamp();
  224. /* don't count note offs exactly on start */
  225. if ( ts == start && e->is_note_off() )
  226. continue;
  227. if ( ts >= start && ts < end )
  228. e->select();
  229. }
  230. }
  231. /** select note evenets from /start/ to /end/ within range /hi/ through /lo/ */
  232. void
  233. event_list::select ( tick_t start, tick_t end, int hi, int lo )
  234. {
  235. FOR_ALL( e )
  236. {
  237. tick_t ts = e->timestamp();
  238. /* don't count note offs exactly on start */
  239. if ( ! e->is_note_on() )
  240. continue;
  241. if ( ts >= start && ts < end &&
  242. e->note() <= hi && e->note() >= lo )
  243. e->select();
  244. }
  245. }
  246. /** select ALL events */
  247. void
  248. event_list::select_all ( void )
  249. {
  250. FOR_ALL( e )
  251. e->select();
  252. }
  253. void
  254. event_list::select_none ( void )
  255. {
  256. FOR_ALL( e )
  257. e->deselect();
  258. }
  259. void
  260. event_list::invert_selection ( void )
  261. {
  262. FOR_ALL( e )
  263. if ( ! e->is_note_off() )
  264. {
  265. if ( e->selected() )
  266. e->deselect();
  267. else
  268. e->select();
  269. }
  270. }
  271. /** remove all selected events */
  272. void
  273. event_list::remove_selected ( void )
  274. {
  275. FOR_SELECTED( e )
  276. {
  277. remove( e );
  278. }
  279. }
  280. /** transpose selected notes (ignoring other event types) by /n/ tones
  281. * (may span octaves) */
  282. void
  283. event_list::transpose_selected ( int n )
  284. {
  285. FOR_SELECTED( e )
  286. {
  287. if ( e->is_note_on() )
  288. e->note( e->note() + n );
  289. }
  290. }
  291. /** change all notes of value /from/ to /to/ */
  292. void
  293. event_list::rewrite_selected ( int from, int to )
  294. {
  295. FOR_SELECTED( e )
  296. {
  297. if ( e->is_note_on() && e->note() == from )
  298. e->note( to );
  299. }
  300. }
  301. /** get timestamp of earliest selected event */
  302. tick_t
  303. event_list::selection_min ( void )
  304. {
  305. FOR_SELECTED( e )
  306. return e->timestamp();
  307. return 0;
  308. }
  309. tick_t
  310. event_list::selection_max ( void )
  311. {
  312. RFOR_SELECTED( e )
  313. return e->timestamp();
  314. return 0;
  315. }
  316. /** move selected events by offset /o/ */
  317. void
  318. event_list::move_selected ( long o )
  319. {
  320. if ( o < 0 )
  321. if ( selection_min() < (tick_t)( 0 - o ) )
  322. return;
  323. if ( o < 0 )
  324. {
  325. FOR_SELECTED( e )
  326. move( e, o );
  327. }
  328. else
  329. {
  330. RFOR_SELECTED( e )
  331. move( e, o );
  332. }
  333. }
  334. void
  335. event_list::push_selection ( void )
  336. {
  337. FOR_ALL( e )
  338. if ( e->_selected )
  339. ++e->_selected;
  340. }
  341. void
  342. event_list::pop_selection ( void )
  343. {
  344. FOR_ALL( e )
  345. if ( e->_selected )
  346. --e->_selected;
  347. }
  348. /** verify that all note ons are linked to note offs */
  349. bool
  350. event_list::verify ( void ) const
  351. {
  352. FOR_ALL( e )
  353. if ( e->is_note_on() && ! e->linked() )
  354. return false;
  355. return true;
  356. }
  357. /** link /e/ (a note on) with the next corresponding note off */
  358. void
  359. event_list::link ( event *on )
  360. {
  361. if ( ! on->is_note_on() )
  362. return;
  363. for ( event *off = on->_next; off; off = off->_next )
  364. {
  365. if ( off->linked() )
  366. continue;
  367. if ( off->is_note_off() &&
  368. off->channel() == on->channel() &&
  369. off->note() == on->note() )
  370. {
  371. on->link( off );
  372. return;
  373. }
  374. }
  375. WARNING( "no corresponding note_off found for note on, repairing" );
  376. event *off = new event( *on );
  377. off->opcode( event::NOTE_OFF );
  378. on->link( off );
  379. insert( off );
  380. }
  381. /** insert /l/ ticks of time at /start/ */
  382. void
  383. event_list::insert_time ( tick_t start, tick_t l )
  384. {
  385. FOR_ALL( e )
  386. {
  387. tick_t ts = e->timestamp();
  388. if ( e->is_note_off() )
  389. continue;
  390. if ( ts >= start )
  391. if ( e->is_note_on() )
  392. {
  393. /* only notes ENTIRELY WITHIN the range will be moved */
  394. e->timestamp( ts + l );
  395. e->link()->timestamp( e->link()->timestamp() + l );
  396. }
  397. else
  398. e->timestamp( e->timestamp() + l );
  399. }
  400. }
  401. /** delete events in range and close the gap */
  402. void
  403. event_list::delete_time ( tick_t start, tick_t end )
  404. {
  405. tick_t l = end - start;
  406. push_selection();
  407. select( start, end );
  408. remove_selected();
  409. pop_selection();
  410. /* cut out the slack */
  411. FOR_ALL( e )
  412. {
  413. tick_t ts = e->timestamp();
  414. if ( ts >= end )
  415. e->timestamp( ts - l );
  416. }
  417. }
  418. /** link all note ons to subsequent note offs */
  419. void
  420. event_list::relink ( void )
  421. {
  422. /* clear links */
  423. FOR_ALL( e )
  424. e->link( NULL );
  425. /* link */
  426. FOR_ALL( on )
  427. link( on );
  428. if ( ! verify() )
  429. ASSERTION( "event list failed verification" );
  430. }
  431. /** resort event /e/ */
  432. void
  433. event_list::sort ( event *e )
  434. {
  435. unlink( e );
  436. insert( e );
  437. }
  438. /** resort entire list */
  439. void
  440. event_list::sort ( void )
  441. {
  442. event_list *temp = new event_list( *this );
  443. _head = temp->_head;
  444. _tail = temp->_tail;
  445. temp->_head = NULL;
  446. delete temp;
  447. }
  448. /** move event /e/ by /o/ ticks */
  449. void
  450. event_list::move ( event *e, long o )
  451. {
  452. e->timestamp( e->timestamp() + o );
  453. sort( e );
  454. }
  455. bool
  456. event_list::empty ( void ) const
  457. {
  458. return _head == NULL;
  459. }
  460. size_t
  461. event_list::size ( void ) const
  462. {
  463. return _size;
  464. }
  465. void
  466. event_list::_hi_lo ( bool sel, int *hi, int *lo ) const
  467. {
  468. *hi = 0;
  469. *lo = 127;
  470. FOR_ALL( e )
  471. {
  472. if ( sel && ! e->selected() )
  473. continue;
  474. if ( ! e->is_note_on() )
  475. continue;
  476. int n = e->note();
  477. if ( n > *hi )
  478. *hi = n;
  479. if ( n < *lo )
  480. *lo = n;
  481. }
  482. }
  483. /** set /hi/ and /lo/ to the lowest and highest pitched note events in
  484. * this list, respectively */
  485. void
  486. event_list::hi_lo_note ( int *hi, int *lo ) const
  487. {
  488. _hi_lo( false, hi, lo );
  489. }
  490. void
  491. event_list::selected_hi_lo_note ( int *hi, int *lo ) const
  492. {
  493. _hi_lo( true, hi, lo );
  494. }