Programmable real-time audio signal processing application
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

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. }