Programmable real-time audio signal processing application
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.

cmGrTksbFltk.cpp 19KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695
  1. #include <FL/Fl.H>
  2. #include <Fl/fl_draw.h>
  3. #include <FL/Fl_Widget.H>
  4. #include <FL/Fl_Double_Window.H>
  5. #include <Fl/Fl_Output.H>
  6. #include <Fl/Fl_Menu_Bar.H>
  7. #include <vector>
  8. #include "Fl_CbLinker.h"
  9. #include "cmGlobal.h"
  10. #include "cmFloatTypes.h"
  11. #include "cmRpt.h"
  12. #include "cmErr.h"
  13. #include "cmCtx.h"
  14. #include "cmMem.h"
  15. #include "cmMallocDebug.h"
  16. #include "cmLinkedHeap.h"
  17. #include "cmText.h"
  18. #include "cmThread.h"
  19. #include "cmPrefs.h"
  20. #include "cmSymTbl.h"
  21. #include "cmTime.h"
  22. #include "cmMidi.h"
  23. #include "cmMidiFile.h"
  24. #include "cmAudioFile.h"
  25. #include "cmAudioFileMgr.h"
  26. #include "cmTimeLine.h"
  27. #include "cmScore.h"
  28. #include "cmTakeSeqBldr.h"
  29. #include "cmGr.h"
  30. #include "cmGrDevCtx.h"
  31. #include "cmGrPlot.h"
  32. #include "cmGrPage.h"
  33. #include "cmGrFltk.h"
  34. #include "gvHashFunc.h"
  35. #include "cmGrTksbFltk.h"
  36. #include "cmGrPlotAudio.h"
  37. #include "cmdIf.h"
  38. cmGrTksbFltk::cmGrTksbFltk(cmCtx_t* ctx, cmdIf* cp, Fl_Menu_Bar* menu, int x, int y, int w, int h)
  39. : cmGrPlotFltk(ctx,x,y,w,h),
  40. //_cmdIf(cp),
  41. _tksbH(cmTakeSeqBldrNullHandle),
  42. _menuBar(menu),
  43. _samplesMetricId(cmInvalidId),_secondsMetricId(cmInvalidId),
  44. //_objSecs(0),
  45. _objId(0),
  46. //_togFl(true),
  47. _lastBarPlotObjH(cmGrPlObjNullHandle),
  48. _nextTakeY(5),
  49. _curCbTId(kInvalidTId)
  50. {
  51. cmErrSetup(&_err,&ctx->rpt,"cmGrTksbFltk");
  52. _createMenu();
  53. if( cmGrPageIsValid(pageHandle()) == false )
  54. return;
  55. initViews(1,1);
  56. unsigned vwIdx = 0;
  57. cmGrPgH_t pgH = pageHandle();
  58. cmGrVwH_t vwH = cmGrPageViewHandle( pgH, vwIdx);
  59. cmGrH_t cvH = cmGrViewGrHandle( vwH );
  60. cmGrAxH_t axH = cmGrAxNullHandle;
  61. cmGrVExt_t limExt;
  62. _samplesMetricId = cmGrPageLabelFuncRegister( pgH, gvRoundHashValueFunc, this, "Round" );
  63. _secondsMetricId = cmGrPageLabelFuncRegister( pgH, gvMinSecMsHashValueFunc, this, "Min:Sec:Ms" );
  64. unsigned pitchLabelFuncId = cmGrPageLabelFuncRegister( pgH, gvMidiSciPitchValueFunc, this, "Pitch" );
  65. cmGrVExtSetD(&limExt,0,0,0,127);
  66. cmGrObjSetWorldExt( cvH, cmGrRootObjH(cvH), &limExt );
  67. cmGrObjSetWorldLimitExt(cvH, cmGrRootObjH(cvH), &limExt, kTopGrFl | kBottomGrFl );
  68. axH = cmGrViewAxisHandle(vwH, kTopGrIdx);
  69. cmGrAxisSetCfg( axH, cmClrFlag(cmGrAxisCfg( axH ), kHashMarkGrFl | kHashLabelGrFl ));
  70. axH = cmGrViewAxisHandle(vwH, kLeftGrIdx );
  71. cmGrAxisSetLabelFunc( axH, pitchLabelFuncId );
  72. cmGrViewSetLabelFunc( vwH, kLeftGrIdx, pitchLabelFuncId );
  73. axH = cmGrViewAxisHandle(vwH, kRightGrIdx);
  74. cmGrAxisSetCfg( axH, cmClrFlag(cmGrAxisCfg( axH ), kHashLabelGrFl ));
  75. cmGrViewSetCfg( vwH, cmSetFlag(cmGrViewCfg(vwH),kSelectHorzGrFl) );
  76. }
  77. cmGrTksbFltk::~cmGrTksbFltk()
  78. {
  79. }
  80. void _cmGrTksbRecvScoreMsg( void* cbArg, const void* msg, unsigned msgByteCnt )
  81. {
  82. cmGrTksbFltk* thisPtr = (cmGrTksbFltk*)cbArg;
  83. thisPtr->recvScoreMsg(msg,msgByteCnt);
  84. }
  85. void cmGrTksbFltk::setTksbHandle( void* v )
  86. {
  87. _tksbH.h = v;
  88. if( cmTakeSeqBldrIsValid(_tksbH) == false )
  89. return;
  90. // load the score plot objects
  91. cmScoreSeqNotifyCb(cmTakeSeqBldrScoreHandle(_tksbH),_cmGrTksbRecvScoreMsg, this );
  92. // get the count of score-track takes
  93. unsigned n = cmTakeSeqBldrScTrkTakeCount(_tksbH);
  94. // for each score-track take
  95. for(unsigned i=0; i<n; ++i)
  96. {
  97. cmTksbScTrkTake_t r;
  98. // get the ith take
  99. if( cmTakeSeqBldrScTrkTake(_tksbH,i,&r) != kOkTsbRC )
  100. continue;
  101. // create the take plot-object
  102. _insertTake(&r);
  103. }
  104. }
  105. cmScMsgTypeId_t cmGrTksbFltk::recvScoreMsg( const void* msg, unsigned msgByteCnt )
  106. {
  107. cmScMsg_t m;
  108. cmScoreDecode(msg,msgByteCnt,&m);
  109. switch( m.typeId )
  110. {
  111. case kBeginMsgScId:
  112. {
  113. _objId = 0;
  114. _objSecs = 0;
  115. // remove all objects from all views
  116. //cmGrPageClear(pageHandle());
  117. //_srate = m.srate;
  118. //_updateSeqMenu(m.seqCnt,m.seqId);
  119. }
  120. break;
  121. case kEndMsgScId:
  122. //size(w(),h()+1);
  123. break;
  124. case kEventMsgScId:
  125. _insertEvent(&m.u.evt);
  126. break;
  127. case kSectionMsgScId:
  128. _insertSection(&m.u.sect);
  129. break;
  130. case kVarMsgScId:
  131. break;
  132. default:
  133. { assert(0); }
  134. }
  135. return m.typeId;
  136. }
  137. double cmGrTksbFltk::sampleRate() const
  138. {
  139. if( cmTakeSeqBldrIsValid(_tksbH) )
  140. return cmTakeSeqBldrSampleRate(_tksbH);
  141. return 0;
  142. }
  143. bool cmGrTksbFltk::on_plot_object( cmGrPlotCbArg_t* arg )
  144. {
  145. if( arg->selId!=kStateChangeGrPlId || cmIsNotFlag(arg->deltaFlags,kSelectGrPlFl) )
  146. return true;
  147. scObj_t* sop = (scObj_t*)cmGrPlotObjUserPtr(arg->objH);
  148. unsigned state = cmGrPlotObjStateFlags(arg->objH);
  149. bool isSelectedFl = cmIsFlag( state, kSelectGrPlFl);
  150. if( sop == NULL )
  151. return true;
  152. //printf("SELECT:%i %i 0x%x\n",cmGrPlotObjId(arg->objH),isSelectedFl,state);
  153. if( sop->id==kTakeTksbId && sop->u.tlMarkerUid!=cmInvalidId )
  154. {
  155. if( isSelectedFl )
  156. cmTakeSeqBldrLoadTake(_tksbH,sop->u.tlMarkerUid,true);
  157. else
  158. cmTakeSeqBldrUnloadTake(_tksbH,sop->u.tlMarkerUid);
  159. setStatusText(cmTsPrintfS("%s", cmStringNullGuard(cmTakeSeqBldrScTrkTakeText(_tksbH,sop->u.tlMarkerUid))));
  160. _curCbTId = kRefreshTId;
  161. // callback to: kcApp::_ctl_cb(ctl_t* cp)
  162. callback()(this,user_data());
  163. }
  164. if( sop->id==kEventTksbId && sop->u.ep!=NULL && sop->u.ep->type==kBarEvtScId )
  165. {
  166. _lastBarPlotObjH = arg->objH;
  167. _curCbTId = kSelectTId;
  168. // callback to: kcApp::_ctl_cb(ctl_t* cp)
  169. callback()(this,user_data());
  170. }
  171. return true;
  172. }
  173. cmGrTksbFltk::cbTId_t cmGrTksbFltk::cbTypeId() const
  174. { return _curCbTId; }
  175. unsigned cmGrTksbFltk::scoreSelectedEleIndex() const
  176. {
  177. if( cmGrPlotObjIsValid(_lastBarPlotObjH) )
  178. {
  179. scObj_t* sop = (scObj_t*)cmGrPlotObjUserPtr(_lastBarPlotObjH);
  180. if( sop!=NULL && sop->id==kEventTksbId && sop->u.ep != NULL && sop->u.ep->type == kBarEvtScId )
  181. {
  182. return sop->u.ep->locIdx;
  183. }
  184. }
  185. return cmInvalidIdx;
  186. }
  187. void cmGrTksbFltk::setScoreLocation( unsigned locIdx, unsigned vel, unsigned smpIdx )
  188. {
  189. }
  190. void cmGrTksbFltk::_insertSection( const cmScoreSection_t* m )
  191. {
  192. // The argument is a serialzed copy of a cmScoreSection_t record.
  193. // Convert it to a pointer to an actual object in the local score mgr.
  194. if( cmGrPageIsValid(pageHandle()) == false )
  195. return;
  196. m = cmScoreSection(cmTakeSeqBldrScoreHandle(_tksbH),m->index);
  197. assert(m!=NULL);
  198. const cmScoreEvt_t* ep = cmScoreEvt( cmTakeSeqBldrScoreHandle(_tksbH), m->begEvtIndex);
  199. assert( ep != NULL );
  200. cmGrPlH_t plH = plotHandle();
  201. cmGrPgH_t pgH = pageHandle();
  202. unsigned vwIdx = 0;
  203. cmGrVwH_t vwH = cmGrPageViewHandle( pgH, vwIdx );
  204. cmGrH_t cvH = cmGrViewGrHandle( vwH );
  205. cmGrPlObjH_t parentObjH = cmGrPlObjNullHandle;
  206. cmGrPlObjH_t xAnchorObjH = cmGrPlObjNullHandle;
  207. cmGrPlObjH_t yAnchorObjH = cmGrPlObjNullHandle;
  208. cmGrPlObjH_t objH = cmGrPlObjNullHandle;
  209. cmGrPlObjTypeId_t objTypeId = kLineGrPlId;
  210. cmReal_t x = ep->secs;
  211. cmReal_t y = 120;
  212. cmReal_t w = 0;
  213. cmReal_t h = 7;
  214. const cmChar_t* label = m->label;
  215. unsigned flags = kNoDragGrPlFl;
  216. cmGrVExt_t wext;
  217. scObj_t scObj(m);
  218. cmGrVExtSetNull(&wext);
  219. if( cmGrPlotObjCreate(plH, cvH, &objH, _objId++, parentObjH, xAnchorObjH, yAnchorObjH, objTypeId, flags, x, y, w, h, label, cmGrVExtIsNull(&wext)?NULL:&wext ) != kOkGrPlRC )
  220. {
  221. cmErrMsg(&_err,kInsertObjFailRC,"Insert failed on a score section.", cmStringNullGuard(label));
  222. return;
  223. }
  224. cmGrPlotObjAllocUser(objH,&scObj,sizeof(scObj));
  225. unsigned f = 0 ? (kNorthJsGrFl | kTopJsGrFl) : (kSouthJsGrFl | kBottomJsGrFl);
  226. cmGrPlotObjSetLabelAttr( objH, f | kWestJsGrFl | kTopJsGrFl | kRightJsGrFl, 0, kBlackGrId );
  227. cmGrPlotObjSetLineColor( objH, kEnablePlGrId, kGreenGrId );
  228. //cmGrPlotObjSetPhysExt(objH, 1, 0, 1, 0 );
  229. cmGrPlotObjSetFontSize(objH,8);
  230. }
  231. void cmGrTksbFltk::_insertEvent( const cmScoreEvt_t* m )
  232. {
  233. // The argument is a serialzed copy of a cmScoreEvt record.
  234. // Convert it to a pointer to an actual object in the local score mgr.
  235. if( cmGrPageIsValid(pageHandle()) == false )
  236. return;
  237. // Get a pointer to the score event
  238. m = cmScoreEvt( cmTakeSeqBldrScoreHandle(_tksbH), m->index );
  239. assert(m!=NULL);
  240. cmGrPlH_t plH = plotHandle();
  241. cmGrPgH_t pgH = pageHandle();
  242. unsigned vwIdx = 0;
  243. cmGrVwH_t vwH = cmGrPageViewHandle( pgH, vwIdx );
  244. cmGrH_t cvH = cmGrViewGrHandle( vwH );
  245. cmGrPlObjH_t parentObjH = cmGrPlObjNullHandle;
  246. cmGrPlObjH_t xAnchorObjH = cmGrPlObjNullHandle;
  247. cmGrPlObjH_t yAnchorObjH = cmGrPlObjNullHandle;
  248. cmGrPlObjH_t objH = cmGrPlObjNullHandle;
  249. cmGrPlObjTypeId_t objTypeId = kVLineGrPlId;
  250. cmReal_t x = m->secs;
  251. cmReal_t y = 0;
  252. cmReal_t w = 0;
  253. cmReal_t h = 127;
  254. const cmChar_t* label = NULL;
  255. unsigned flags = kNoDragGrPlFl;
  256. int bufN = 7;
  257. cmChar_t buf[bufN+1];
  258. cmGrVExt_t wext;
  259. scObj_t scObj(m);
  260. cmGrVExtSetNull(&wext);
  261. switch( m->type )
  262. {
  263. case kNonEvtScId:
  264. objTypeId = kRectGrPlId;
  265. y = m->pitch;
  266. h = 1;
  267. w = m->durSecs;
  268. label = cmMidiToSciPitch(m->pitch,NULL,0);
  269. break;
  270. case kPedalEvtScId:
  271. objTypeId = kRectGrPlId;
  272. y = 108;
  273. h = 2;
  274. w = m->durSecs;
  275. label = "pedal";
  276. break;
  277. case kBarEvtScId:
  278. {
  279. buf[bufN] = 0;
  280. snprintf(buf,bufN,"%i",m->barNumb);
  281. objTypeId = kVLineGrPlId;
  282. label = buf;
  283. }
  284. break;
  285. default:
  286. return;
  287. }
  288. // create the plot object to represent this event
  289. if( cmGrPlotObjCreate(plH, cvH, &objH, _objId++, parentObjH, xAnchorObjH, yAnchorObjH, objTypeId, flags, x, y, w, h, label, cmGrVExtIsNull(&wext)?NULL:&wext ) != kOkGrPlRC )
  290. {
  291. cmErrMsg(&_err,kInsertObjFailRC,"Insert failed on a score event.", cmStringNullGuard(label));
  292. return;
  293. }
  294. // store the score event reference as custom data inside the plot object
  295. cmGrPlotObjAllocUser(objH,&scObj,sizeof(scObj));
  296. switch( m->type )
  297. {
  298. case kBarEvtScId:
  299. {
  300. unsigned f = _togFl ? (kNorthJsGrFl | kTopJsGrFl) : (kSouthJsGrFl | kBottomJsGrFl);
  301. cmGrPlotObjSetLabelAttr( objH, f | kWestJsGrFl | kTopJsGrFl | kRightJsGrFl, 0, kBlueGrId );
  302. cmGrPlotObjSetLineColor( objH, kEnablePlGrId, kYellowGrId );
  303. cmGrPlotObjSetPhysExt(objH, 1, 0, 1, 0 );
  304. _togFl = !_togFl;
  305. }
  306. break;
  307. case kNonEvtScId:
  308. cmGrPlotObjSetLineColor( objH, kEnablePlGrId, cmGrPlotObjFillColor(objH,kEnablePlGrId) );
  309. cmGrPlotObjSetFontSize(objH,8);
  310. break;
  311. case kPedalEvtScId:
  312. cmGrPlotObjSetLineColor( objH, kEnablePlGrId, kDeepPinkGrId );
  313. cmGrPlotObjSetFillColor(objH, kEnablePlGrId, kDeepPinkGrId );
  314. cmGrPlotObjSetFontSize(objH,8);
  315. break;
  316. default:
  317. break;
  318. }
  319. if( cmIsFlag(m->flags,kInvalidScFl) )
  320. {
  321. cmGrPlotObjSetFillColor(objH, kEnablePlGrId, kRedGrId );
  322. }
  323. }
  324. void cmGrTksbFltk::_insertTake( const cmTksbScTrkTake_t* take )
  325. {
  326. cmGrPlH_t plH = plotHandle();
  327. cmGrPgH_t pgH = pageHandle();
  328. unsigned vwIdx = 0;
  329. cmGrVwH_t vwH = cmGrPageViewHandle( pgH, vwIdx );
  330. cmGrH_t cvH = cmGrViewGrHandle( vwH );
  331. cmGrPlObjH_t parentObjH = cmGrPlObjNullHandle;
  332. cmGrPlObjH_t xAnchorObjH = cmGrPlObjNullHandle;
  333. cmGrPlObjH_t yAnchorObjH = cmGrPlObjNullHandle;
  334. cmGrPlObjH_t objH = cmGrPlObjNullHandle;
  335. cmGrPlObjTypeId_t objTypeId = kRectGrPlId;
  336. cmReal_t x = 0;
  337. cmReal_t y = 0;
  338. cmReal_t w = 0;
  339. cmReal_t h = 127;
  340. const cmChar_t* label = NULL;
  341. unsigned flags = kNoDragGrPlFl | kNoFillGrPlFl;
  342. int bufN = 7;
  343. cmChar_t buf[bufN+1];
  344. cmGrVExt_t wext;
  345. cmGrVExt_t vext;
  346. scObj_t scObj(take->tlMarkerUid);
  347. cmGrVExtSetNull(&wext);
  348. if( cmGrPlotObjIsValid(objH = _scEvtIdxToPlotObj( take->minScEvtIdx ))==false )
  349. return;
  350. cmGrPlotObjVExt( objH, &vext);
  351. x = cmGrVExtMinX(&vext);
  352. if( cmGrPlotObjIsValid(objH = _scEvtIdxToPlotObj( take->maxScEvtIdx )) == false )
  353. return;
  354. cmGrPlotObjVExt( objH, &vext);
  355. w = cmGrVExtMaxX(&vext) - x;
  356. h = 1;
  357. y = _nextTakeY;
  358. buf[bufN] = 0;
  359. snprintf(buf,bufN,"%i",(_nextTakeY-5)/2);
  360. label = buf;
  361. _nextTakeY += 2;
  362. if( _nextTakeY > 120 )
  363. _nextTakeY = 5;
  364. // create the plot object to represent this event
  365. if( cmGrPlotObjCreate(plH, cvH, &objH, _objId++, parentObjH, xAnchorObjH, yAnchorObjH, objTypeId, flags, x, y, w, h, label, cmGrVExtIsNull(&wext)?NULL:&wext ) != kOkGrPlRC )
  366. {
  367. cmErrMsg(&_err,kInsertObjFailRC,"Insert failed on score-track take.", cmStringNullGuard(label));
  368. return;
  369. }
  370. // store the score event reference as custom data inside the plot object
  371. cmGrPlotObjAllocUser(objH,&scObj,sizeof(scObj));
  372. cmGrPlotObjSetLineColor( objH, kFocusPlGrId, kRedGrId );
  373. cmGrPlotObjSetLineColor( objH, kSelectPlGrId, kDeepPinkGrId );
  374. cmGrPlotObjSetFontSize(objH,8);
  375. }
  376. #define cmMENU_TITLE "Bldr"
  377. void cmGrTksbFltk::_createMenu( )
  378. {
  379. int idx = _menuBar->add(cmMENU_TITLE,0,NULL,0,FL_SUBMENU);
  380. const char* titleArray[] = { "Pitch", "Attributes", "Dynamics", "Location", "Fraction", "Section Even", "Section Dyn", "Section Tempo" };
  381. bool onFl[] = { true, false, false, false, false, false, false, false };
  382. int i;
  383. for(i=0; i<kMenuItemCnt; ++i)
  384. {
  385. _menuArray[i].id = i;
  386. _menuArray[i].p = this;
  387. _menuBar->insert(idx+1+i,titleArray[i],0,_s_menuCallback, _menuArray + i, FL_MENU_TOGGLE );
  388. if( onFl[i] )
  389. {
  390. Fl_Menu_Item* mip = (Fl_Menu_Item*)_menuBar->menu() + idx + i + 1;
  391. mip->set();
  392. }
  393. }
  394. _menuBar->redraw();
  395. }
  396. bool cmGrTksbFltk::_isMenuChecked( int id )
  397. {
  398. unsigned i;
  399. // locate the menu item assoc'd with id
  400. for(i=0; i<kMenuItemCnt; ++i)
  401. if( _menuArray[i].id == id )
  402. break;
  403. assert( i < kMenuItemCnt );
  404. int menuIdx;
  405. if(( menuIdx = _menuBar->find_index(cmMENU_TITLE)) == -1 )
  406. return false;
  407. // The menu items and _menuArray[] were initialized in the same order
  408. // therefore the offset from the base of both should be the same.
  409. Fl_Menu_Item* mip = (Fl_Menu_Item*)_menuBar->menu() + menuIdx + i + 1;
  410. assert( (item_t*)mip->user_data() == _menuArray + i );
  411. return mip->value() != 0;
  412. }
  413. void cmGrTksbFltk::_setEventLabels()
  414. {
  415. enum { kPitchFl=0x01, kAttrFl=0x02, kDynFl=0x04, kLocFl=0x08, kFracFl };
  416. cmGrPlH_t plH = plotHandle();
  417. unsigned flags = 0;
  418. flags |= _isMenuChecked(kPitchMId) ? kPitchFl : 0;
  419. flags |= _isMenuChecked(kAttrMId) ? kAttrFl : 0;
  420. flags |= _isMenuChecked(kDynMId) ? kDynFl : 0;
  421. flags |= _isMenuChecked(kLocIdxMId) ? kLocFl : 0;
  422. flags |= _isMenuChecked(kFracMId) ? kFracFl : 0;
  423. unsigned n = cmGrPlotObjectCount(plH);
  424. unsigned i;
  425. for(i=0; i<n; ++i)
  426. {
  427. cmGrPlObjH_t poH = cmGrPlotObjectIndexToHandle(plH,i);
  428. if( cmGrPlotObjIsValid(poH) )
  429. {
  430. scObj_t* sop = (scObj_t*)cmGrPlotObjUserPtr(poH);
  431. if( sop!=NULL && sop->id==kEventTksbId && sop->u.ep!=NULL && sop->u.ep->type==kNonEvtScId )
  432. {
  433. const cmScoreEvt_t* ep = sop->u.ep;
  434. int bufN = 255;
  435. cmChar_t buf[ bufN+1 ];
  436. buf[bufN] = 0;
  437. buf[0] = 0;
  438. if( cmIsFlag(flags,kPitchFl) )
  439. snprintf(buf+strlen(buf),bufN-strlen(buf),"%s ",cmMidiToSciPitch(ep->pitch,NULL,0));
  440. if( cmIsFlag(flags,kAttrFl) )
  441. {
  442. cmChar_t s[4];
  443. int j=0;
  444. if( cmIsFlag(ep->flags,kEvenScFl) )
  445. s[j++] = 'e';
  446. if( cmIsFlag(ep->flags,kDynScFl) )
  447. s[j++] = 'd';
  448. if( cmIsFlag(ep->flags,kTempoScFl) )
  449. s[j++] = 't';
  450. s[j] = 0;
  451. snprintf(buf+strlen(buf),bufN-strlen(buf),"%s ",s);
  452. }
  453. if( cmIsFlag(flags,kDynFl) && cmIsFlag(ep->flags,kDynScFl) )
  454. {
  455. snprintf(buf+strlen(buf),bufN-strlen(buf),"d:%i",ep->dynVal);
  456. if( ep->perfDynLvl != 0 )
  457. snprintf(buf+strlen(buf),bufN-strlen(buf),"|%i ",ep->perfDynLvl);
  458. else
  459. snprintf(buf+strlen(buf),bufN-strlen(buf)," ");
  460. }
  461. if( cmIsFlag(flags,kLocFl) )
  462. snprintf(buf+strlen(buf),bufN-strlen(buf),"loc:%i ",ep->locIdx);
  463. if( cmIsFlag(flags,kFracFl) && ep->frac != 0)
  464. snprintf(buf+strlen(buf),bufN-strlen(buf),"%5.3f ",ep->frac);
  465. cmGrPlotObjSetLabel(poH, buf );
  466. }
  467. }
  468. }
  469. }
  470. void cmGrTksbFltk::_setSectionLabels()
  471. {
  472. enum { kEvenFl=0x01, kDynFl=0x02, kTempoFl=0x04 };
  473. cmGrPlH_t plH = plotHandle();
  474. unsigned flags = 0;
  475. flags |= _isMenuChecked(kSectEvenMId) ? kEvenFl : 0;
  476. flags |= _isMenuChecked(kSectDynMId) ? kDynFl : 0;
  477. flags |= _isMenuChecked(kSectTempoMId) ? kTempoFl : 0;
  478. unsigned n = cmGrPlotObjectCount(plH);
  479. unsigned i;
  480. for(i=0; i<n; ++i)
  481. {
  482. cmGrPlObjH_t poH = cmGrPlotObjectIndexToHandle(plH,i);
  483. if( cmGrPlotObjIsValid(poH) )
  484. {
  485. scObj_t* sop = (scObj_t*)cmGrPlotObjUserPtr(poH);
  486. if( sop!=NULL && sop->id==kSectionTksbId && sop->u.sp!=NULL )
  487. {
  488. const cmScoreSection_t* sp = sop->u.sp;
  489. int bufN = 255;
  490. cmChar_t buf[ bufN+1 ];
  491. buf[bufN] = 0;
  492. buf[0] = 0;
  493. snprintf(buf,bufN,"%s ",sp->label);
  494. if( cmIsFlag(flags,kEvenFl) && sp->vars[kEvenVarScId] != DBL_MAX)
  495. snprintf(buf+strlen(buf),bufN-strlen(buf),"e:%f ",sp->vars[kEvenVarScId]);
  496. if( cmIsFlag(flags,kDynFl) && sp->vars[kDynVarScId] != DBL_MAX)
  497. snprintf(buf+strlen(buf),bufN-strlen(buf),"d:%f ",sp->vars[kDynVarScId]);
  498. if( cmIsFlag(flags,kTempoFl) && sp->vars[kTempoVarScId] != DBL_MAX)
  499. snprintf(buf+strlen(buf),bufN-strlen(buf),"t:%f ",sp->vars[kTempoVarScId]);
  500. cmGrPlotObjSetLabel(poH, buf );
  501. }
  502. }
  503. }
  504. }
  505. void cmGrTksbFltk::_s_menuCallback(Fl_Widget* w, void* arg )
  506. {
  507. item_t* ip = (item_t*)arg;
  508. cmGrTksbFltk* p = ip->p;
  509. unsigned long id = ip->id;
  510. switch( id )
  511. {
  512. case kPitchMId:
  513. case kAttrMId:
  514. case kDynMId:
  515. case kLocIdxMId:
  516. case kFracMId:
  517. {
  518. p->_setEventLabels();
  519. p->redraw();
  520. }
  521. break;
  522. case kSectEvenMId:
  523. case kSectDynMId:
  524. case kSectTempoMId:
  525. {
  526. p->_setSectionLabels();
  527. p->redraw();
  528. }
  529. break;
  530. }
  531. }
  532. cmGrPlObjH_t cmGrTksbFltk::_scEvtIdxToPlotObj( unsigned scEvtIdx )
  533. {
  534. cmGrPlH_t plH = plotHandle();
  535. unsigned n = cmGrPlotObjectCount(plH);
  536. unsigned i;
  537. cmGrPlObjH_t poH;
  538. scObj_t* sop;
  539. for(i=0; i<n; ++i)
  540. if(cmGrPlotObjIsValid(poH = cmGrPlotObjectIndexToHandle(plH,i))
  541. && (sop = (scObj_t*)cmGrPlotObjUserPtr(poH)) != NULL
  542. && sop->id == kEventTksbId
  543. && sop->u.ep->index == scEvtIdx )
  544. {
  545. return poH;
  546. }
  547. return cmGrPlObjNullHandle;
  548. }