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.

588 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 ALL events */
  232. void
  233. event_list::select_all ( void )
  234. {
  235. FOR_ALL( e )
  236. e->select();
  237. }
  238. void
  239. event_list::select_none ( void )
  240. {
  241. FOR_ALL( e )
  242. e->deselect();
  243. }
  244. /** remove all selected events */
  245. void
  246. event_list::remove_selected ( void )
  247. {
  248. FOR_SELECTED( e )
  249. {
  250. remove( e );
  251. }
  252. }
  253. /** transpose selected notes (ignoring other event types) by /n/ tones
  254. * (may span octaves) */
  255. void
  256. event_list::transpose_selected ( int n )
  257. {
  258. FOR_SELECTED( e )
  259. {
  260. if ( e->is_note_on() )
  261. e->note( e->note() + n );
  262. }
  263. }
  264. /** change all notes of value /from/ to /to/ */
  265. void
  266. event_list::rewrite_selected ( int from, int to )
  267. {
  268. FOR_SELECTED( e )
  269. {
  270. if ( e->is_note_on() && e->note() == from )
  271. e->note( to );
  272. }
  273. }
  274. /** get timestamp of earliest selected event */
  275. tick_t
  276. event_list::selection_min ( void )
  277. {
  278. FOR_SELECTED( e )
  279. return e->timestamp();
  280. return 0;
  281. }
  282. tick_t
  283. event_list::selection_max ( void )
  284. {
  285. RFOR_SELECTED( e )
  286. return e->timestamp();
  287. return 0;
  288. }
  289. /** move selected events by offset /o/ */
  290. void
  291. event_list::move_selected ( long o )
  292. {
  293. if ( o < 0 )
  294. if ( selection_min() < (tick_t)( 0 - o ) )
  295. return;
  296. if ( o < 0 )
  297. {
  298. FOR_SELECTED( e )
  299. move( e, o );
  300. }
  301. else
  302. {
  303. RFOR_SELECTED( e )
  304. move( e, o );
  305. }
  306. }
  307. void
  308. event_list::push_selection ( void )
  309. {
  310. FOR_ALL( e )
  311. if ( e->_selected )
  312. ++e->_selected;
  313. }
  314. void
  315. event_list::pop_selection ( void )
  316. {
  317. FOR_ALL( e )
  318. if ( e->_selected )
  319. --e->_selected;
  320. }
  321. /** verify that all note ons are linked to note offs */
  322. bool
  323. event_list::verify ( void ) const
  324. {
  325. FOR_ALL( e )
  326. if ( e->is_note_on() && ! e->linked() )
  327. return false;
  328. return true;
  329. }
  330. /** link /e/ (a note on) with the next corresponding note off */
  331. void
  332. event_list::link ( event *on )
  333. {
  334. if ( ! on->is_note_on() )
  335. return;
  336. for ( event *off = on->_next; off; off = off->_next )
  337. {
  338. if ( off->linked() )
  339. continue;
  340. if ( off->is_note_off() &&
  341. off->channel() == on->channel() &&
  342. off->note() == on->note() )
  343. {
  344. on->link( off );
  345. return;
  346. }
  347. }
  348. WARNING( "no corresponding note_off found for note on, repairing" );
  349. event *off = new event( *on );
  350. off->opcode( event::NOTE_OFF );
  351. on->link( off );
  352. insert( off );
  353. }
  354. /** insert /l/ ticks of time at /start/ */
  355. void
  356. event_list::insert_time ( tick_t start, tick_t l )
  357. {
  358. FOR_ALL( e )
  359. {
  360. tick_t ts = e->timestamp();
  361. if ( e->is_note_off() )
  362. continue;
  363. if ( ts >= start )
  364. if ( e->is_note_on() )
  365. {
  366. /* only notes ENTIRELY WITHIN the range will be moved */
  367. e->timestamp( ts + l );
  368. e->link()->timestamp( e->link()->timestamp() + l );
  369. }
  370. else
  371. e->timestamp( e->timestamp() + l );
  372. }
  373. }
  374. /** delete events in range and close the gap */
  375. void
  376. event_list::delete_time ( tick_t start, tick_t end )
  377. {
  378. tick_t l = end - start;
  379. push_selection();
  380. select( start, end );
  381. remove_selected();
  382. pop_selection();
  383. /* cut out the slack */
  384. FOR_ALL( e )
  385. {
  386. tick_t ts = e->timestamp();
  387. if ( ts >= end )
  388. e->timestamp( ts - l );
  389. }
  390. }
  391. /** link all note ons to subsequent note offs */
  392. void
  393. event_list::relink ( void )
  394. {
  395. /* clear links */
  396. FOR_ALL( e )
  397. e->link( NULL );
  398. /* link */
  399. FOR_ALL( on )
  400. link( on );
  401. if ( ! verify() )
  402. ASSERTION( "event list failed verification" );
  403. }
  404. /** resort event /e/ */
  405. void
  406. event_list::sort ( event *e )
  407. {
  408. unlink( e );
  409. insert( e );
  410. }
  411. /** resort entire list */
  412. void
  413. event_list::sort ( void )
  414. {
  415. event_list *temp = new event_list( *this );
  416. _head = temp->_head;
  417. _tail = temp->_tail;
  418. temp->_head = NULL;
  419. delete temp;
  420. }
  421. /** move event /e/ by /o/ ticks */
  422. void
  423. event_list::move ( event *e, long o )
  424. {
  425. e->timestamp( e->timestamp() + o );
  426. sort( e );
  427. }
  428. bool
  429. event_list::empty ( void ) const
  430. {
  431. return _head == NULL;
  432. }
  433. size_t
  434. event_list::size ( void ) const
  435. {
  436. return _size;
  437. }
  438. void
  439. event_list::_hi_lo ( bool sel, int *hi, int *lo ) const
  440. {
  441. *hi = 0;
  442. *lo = 127;
  443. FOR_ALL( e )
  444. {
  445. if ( sel && ! e->selected() )
  446. continue;
  447. if ( ! e->is_note_on() )
  448. continue;
  449. int n = e->note();
  450. if ( n > *hi )
  451. *hi = n;
  452. if ( n < *lo )
  453. *lo = n;
  454. }
  455. }
  456. /** set /hi/ and /lo/ to the lowest and highest pitched note events in
  457. * this list, respectively */
  458. void
  459. event_list::hi_lo_note ( int *hi, int *lo ) const
  460. {
  461. _hi_lo( false, hi, lo );
  462. }
  463. void
  464. event_list::selected_hi_lo_note ( int *hi, int *lo ) const
  465. {
  466. _hi_lo( true, hi, lo );
  467. }