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.

632 lines
13KB

  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. /** transpose selected notes (ignoring other event types) by /n/ tones
  284. * (may span octaves) */
  285. void
  286. event_list::transpose_selected ( int n )
  287. {
  288. FOR_SELECTED( e )
  289. {
  290. if ( e->is_note_on() )
  291. e->note( e->note() + n );
  292. }
  293. }
  294. /** change all notes of value /from/ to /to/ */
  295. void
  296. event_list::rewrite_selected ( int from, int to )
  297. {
  298. FOR_SELECTED( e )
  299. {
  300. if ( e->is_note_on() && e->note() == from )
  301. e->note( to );
  302. }
  303. }
  304. /** get timestamp of earliest selected event */
  305. tick_t
  306. event_list::selection_min ( void )
  307. {
  308. FOR_SELECTED( e )
  309. return e->timestamp();
  310. return 0;
  311. }
  312. tick_t
  313. event_list::selection_max ( void )
  314. {
  315. RFOR_SELECTED( e )
  316. return e->timestamp();
  317. return 0;
  318. }
  319. /** move selected events by offset /o/ */
  320. void
  321. event_list::move_selected ( long o )
  322. {
  323. if ( o < 0 )
  324. if ( selection_min() < (tick_t)( 0 - o ) )
  325. return;
  326. if ( o < 0 )
  327. {
  328. FOR_SELECTED( e )
  329. move( e, o );
  330. }
  331. else
  332. {
  333. RFOR_SELECTED( e )
  334. move( e, o );
  335. }
  336. }
  337. void
  338. event_list::push_selection ( void )
  339. {
  340. FOR_ALL( e )
  341. if ( e->_selected )
  342. ++e->_selected;
  343. }
  344. void
  345. event_list::pop_selection ( void )
  346. {
  347. FOR_ALL( e )
  348. if ( e->_selected )
  349. --e->_selected;
  350. }
  351. /** verify that all note ons are linked to note offs */
  352. bool
  353. event_list::verify ( void ) const
  354. {
  355. FOR_ALL( e )
  356. if ( e->is_note_on() && ! e->linked() )
  357. return false;
  358. return true;
  359. }
  360. /** link /e/ (a note on) with the next corresponding note off */
  361. void
  362. event_list::link ( event *on )
  363. {
  364. if ( ! on->is_note_on() )
  365. return;
  366. for ( event *off = on->_next; off; off = off->_next )
  367. {
  368. if ( off->linked() )
  369. continue;
  370. if ( off->is_note_off() &&
  371. off->channel() == on->channel() &&
  372. off->note() == on->note() )
  373. {
  374. on->link( off );
  375. return;
  376. }
  377. }
  378. WARNING( "no corresponding note_off found for note on, repairing" );
  379. event *off = new event( *on );
  380. off->opcode( event::NOTE_OFF );
  381. on->link( off );
  382. insert( off );
  383. }
  384. /** insert /l/ ticks of time at /start/ */
  385. void
  386. event_list::insert_time ( tick_t start, tick_t l )
  387. {
  388. FOR_ALL( e )
  389. {
  390. tick_t ts = e->timestamp();
  391. if ( e->is_note_off() )
  392. continue;
  393. if ( ts >= start )
  394. {
  395. if ( e->is_note_on() )
  396. {
  397. /* only notes ENTIRELY WITHIN the range will be moved */
  398. e->timestamp( ts + l );
  399. e->link()->timestamp( e->link()->timestamp() + l );
  400. }
  401. else
  402. e->timestamp( e->timestamp() + l );
  403. }
  404. }
  405. sort();
  406. }
  407. /** delete events in range and close the gap */
  408. void
  409. event_list::delete_time ( tick_t start, tick_t end )
  410. {
  411. tick_t l = end - start;
  412. push_selection();
  413. select( start, end );
  414. remove_selected();
  415. pop_selection();
  416. /* cut out the slack */
  417. FOR_ALL( e )
  418. {
  419. tick_t ts = e->timestamp();
  420. if ( ts >= end )
  421. e->timestamp( ts - l );
  422. }
  423. }
  424. /** link all note ons to subsequent note offs */
  425. void
  426. event_list::relink ( void )
  427. {
  428. /* clear links */
  429. FOR_ALL( e )
  430. e->link( NULL );
  431. /* link */
  432. FOR_ALL( on )
  433. link( on );
  434. if ( ! verify() )
  435. FATAL( "event list failed verification" );
  436. }
  437. /** resort event /e/ */
  438. void
  439. event_list::sort ( event *e )
  440. {
  441. unlink( e );
  442. insert( e );
  443. }
  444. /** resort entire list */
  445. void
  446. event_list::sort ( void )
  447. {
  448. event_list *temp = new event_list( );
  449. _head = temp->_head;
  450. _tail = temp->_tail;
  451. FOR_ALL( n )
  452. temp->insert( n );
  453. temp->_head = NULL;
  454. delete temp;
  455. relink();
  456. }
  457. /** move event /e/ by /o/ ticks */
  458. void
  459. event_list::move ( event *e, long o )
  460. {
  461. e->timestamp( e->timestamp() + o );
  462. sort( e );
  463. }
  464. bool
  465. event_list::empty ( void ) const
  466. {
  467. return _head == NULL;
  468. }
  469. size_t
  470. event_list::size ( void ) const
  471. {
  472. return _size;
  473. }
  474. void
  475. event_list::_hi_lo ( bool sel, int *hi, int *lo ) const
  476. {
  477. *hi = 0;
  478. *lo = 127;
  479. FOR_ALL( e )
  480. {
  481. if ( sel && ! e->selected() )
  482. continue;
  483. if ( ! e->is_note_on() )
  484. continue;
  485. int n = e->note();
  486. if ( n > *hi )
  487. *hi = n;
  488. if ( n < *lo )
  489. *lo = n;
  490. }
  491. }
  492. /** set /hi/ and /lo/ to the lowest and highest pitched note events in
  493. * this list, respectively */
  494. void
  495. event_list::hi_lo_note ( int *hi, int *lo ) const
  496. {
  497. _hi_lo( false, hi, lo );
  498. }
  499. void
  500. event_list::selected_hi_lo_note ( int *hi, int *lo ) const
  501. {
  502. _hi_lo( true, hi, lo );
  503. }
  504. }