Changeset 1286
- Timestamp:
- 10/16/07 02:45:58 (11 months ago)
- Location:
- trunk/src/buzelib
- Files:
-
- 5 modified
-
PatternView.cpp (modified) (3 diffs)
-
PatternView.h (modified) (2 diffs)
-
WaveEditorCtrl.cpp (modified) (6 diffs)
-
WaveEditorCtrl.h (modified) (1 diff)
-
WaveTableView.cpp (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/buzelib/PatternView.cpp
r1285 r1286 221 221 mainFrame->addTimerHandler(this); 222 222 223 machine->addEventHandler(this); 223 224 return 0; 224 225 } … … 232 233 233 234 LRESULT CPatternView::OnClose(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) { 235 machine->removeEventHandler(this); 236 234 237 setPattern(0,0); // in case pattern is deleted and window updated before window is fully destroyed 238 235 239 236 240 CMessageLoop* pLoop = _Module.GetMessageLoop(); … … 1821 1825 return 0; 1822 1826 } 1827 1828 bool CPatternView::invoke(zzub_event_data_t& data) { 1829 if (!pattern) return false; 1830 if (data.type == zzub::event_type_parameter_changed && document->player->recordParameters) { 1831 // TODO: restrict updating to around currently playing row(s) only 1832 for (int i = 0; i < pattern->getRows(); i++) { 1833 zzub::patterntrack* track = pattern->getPatternTrack(data.change_parameter.group, data.change_parameter.track); 1834 patternEditor.SetValue(data.change_parameter.group, data.change_parameter.track, data.change_parameter.param, i, track->getValue(i, data.change_parameter.param)); 1835 } 1836 return true; 1837 } 1838 return false; 1839 } -
trunk/src/buzelib/PatternView.h
r1281 r1286 51 51 , public CMessageFilter 52 52 , public CTimerHandler 53 , zzub::event_handler 53 54 { 54 55 friend class CPatternEditor; … … 318 319 void OnUpdate(CView* pSender, LPARAM lHint, LPVOID pHint); 319 320 virtual void updateTimer(); 321 bool invoke(zzub_event_data_t& data); 320 322 321 323 void bindPatternEditor(); -
trunk/src/buzelib/WaveEditorCtrl.cpp
r1285 r1286 187 187 dc.Draw3dRect(&tlrc, GetSysColor(COLOR_BTNHIGHLIGHT), GetSysColor(COLOR_BTNSHADOW));//0, height, width, height+20); 188 188 189 float unit, firstTickValue; 190 float num_samples = wave->get_sample_count(currentLevel); 191 float samplesPerWord = num_samples / 65536; 192 193 switch (gridType) { 194 case WaveEditorSamples: 195 unit=getDisplaySamplesPerPixel(); 196 firstTickValue=beginDisplaySample; 197 break; 198 case WaveEditorTicks: 199 unit=getDisplaySamplesPerTick(); 200 firstTickValue=(float)beginDisplaySample / view->mainFrame->player->masterInfo.samples_per_tick; 201 break; 202 case WaveEditorSeconds: 203 unit=getDisplaySamplesPerSec(); 204 firstTickValue=(float)beginDisplaySample / getWave()->get_samples_per_sec(getWaveLevel()); 205 break; 206 case WaveEditorWord: 207 unit=getDisplaySamplesPerWord(); 208 firstTickValue=beginDisplaySample / samplesPerWord; 209 break; 210 default: 211 return 0; 212 } 213 189 float samplesPerUnit = getSamplesPerUnit(gridType); 190 float unit = getDisplaySamplesPerUnit(samplesPerUnit); 191 float firstTickValue = beginDisplaySample / samplesPerUnit; 214 192 215 193 // assume min 30px per major tick 216 float majorScale =unit*30.0f;194 float majorScale = unit*30.0f; 217 195 218 196 // round majorunit up to nearest 10, 100, 1000, 10000 etc if scale is in samples, or 1,2,4,8,16,etc for ticks or, ms,sec,min for time 219 if (majorScale <10)220 majorScale =ceil(majorScale); else221 if (majorScale <100)222 majorScale =ceil(majorScale/10)*10; else223 if (majorScale <1000)224 majorScale =ceil(majorScale/100)*100; else225 if (majorScale <10000)226 majorScale =ceil(majorScale/1000)*1000; else227 if (majorScale <100000)228 majorScale =ceil(majorScale/10000)*10000; else229 majorScale =ceil(majorScale/100000)*100000;230 231 float roundAdjust =fmod(firstTickValue, majorScale);232 233 float firstTick =firstTickValue - roundAdjust;234 235 float tickX =-roundAdjust/unit;197 if (majorScale < 10) 198 majorScale = ceil(majorScale); else 199 if (majorScale < 100) 200 majorScale = ceil(majorScale/10)*10; else 201 if (majorScale < 1000) 202 majorScale = ceil(majorScale/100)*100; else 203 if (majorScale < 10000) 204 majorScale = ceil(majorScale/1000)*1000; else 205 if (majorScale < 100000) 206 majorScale = ceil(majorScale/10000)*10000; else 207 majorScale = ceil(majorScale/100000)*100000; 208 209 float roundAdjust = fmod(firstTickValue, majorScale); 210 211 float firstTick = firstTickValue - roundAdjust; 212 213 float tickX = -roundAdjust/unit; 236 214 CPen tickPen; 237 215 tickPen.CreatePen(PS_SOLID, 1, (COLORREF)0x0); … … 242 220 243 221 dc.SelectFont(tickFont); 244 int prevBkMode =dc.SetBkMode(TRANSPARENT);245 while (tickX <width) {222 int prevBkMode = dc.SetBkMode(TRANSPARENT); 223 while (tickX < width) { 246 224 dc.MoveTo(tickX, fullHeight+2); 247 225 dc.LineTo(tickX, fullHeight+8); 248 226 249 char pc[16]; 250 251 if (gridType==WaveEditorWord) 252 sprintf(pc, "%04X", (int)firstTick); else 253 sprintf(pc, "%i", (int)firstTick); 254 255 dc.TextOut(tickX, fullHeight+8, pc, strlen(pc)); 256 tickX+=majorScale/unit; 257 firstTick+=majorScale; 227 std::string marker_str = formatSampleUnit(firstTick, gridType); 228 dc.TextOut(tickX, fullHeight+8, marker_str.c_str(), marker_str.length()); 229 tickX += majorScale / unit; 230 firstTick += majorScale; 258 231 } 259 232 … … 284 257 285 258 return DefWindowProc(); 259 } 260 261 std::string CWaveEditorCtrl::formatSampleUnit(float units, WaveEditorGridMode mode) { 262 std::stringstream marker_strm; 263 if (mode == WaveEditorWord) 264 marker_strm << std::uppercase << std::setw(4) << std::hex << (unsigned int)units; else 265 if (mode == WaveEditorSeconds) 266 marker_strm << std::setprecision(2) << std::fixed << units / 1000.0f; else 267 marker_strm << (unsigned int)units; 268 return marker_strm.str(); 286 269 } 287 270 … … 458 441 459 442 LRESULT CWaveEditorCtrl::OnKeyDown( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { 460 /* switch (wParam) {461 case 'S':462 if (view->isShiftDown()) {463 zoomShowSelection();464 }465 break;466 case 'A':467 if (view->isShiftDown()) {468 zoomShowAll();469 }470 break;471 case VK_DOWN:472 if (view->isShiftDown()) {473 zoomOut();474 }475 break;476 case VK_UP:477 if (view->isShiftDown()) {478 zoomIn();479 }480 break;481 case VK_RIGHT:482 MessageBox("scroll right");483 if (view->isShiftDown()) {484 MessageBox("move selection");485 }486 break;487 case VK_LEFT:488 MessageBox("scroll left");489 if (view->isShiftDown()) {490 MessageBox("move selection");491 }492 break;493 default:494 //MessageBox("WaveEditorCtrl keydown");495 break;496 }497 */498 443 return 0; 499 444 } … … 521 466 } 522 467 523 float CWaveEditorCtrl::getDisplaySamplesPerPixel() { 524 // returns number of samples in a pixel 468 float CWaveEditorCtrl::getSamplesPerUnit(WaveEditorGridMode mode) { 469 if (mode == WaveEditorSamples) { 470 return 1.0f; 471 } else 472 if (mode == WaveEditorTicks) { 473 return view->mainFrame->player->masterInfo.samples_per_tick; 474 } else 475 if (mode == WaveEditorSeconds) { 476 wave_info_ex* wave = getWave(); 477 if (wave == 0) return 0.0f; 478 return (float)wave->get_samples_per_sec(currentLevel) / 1000.0f; 479 } else 480 if (mode == WaveEditorWord) { 481 wave_info_ex* wave = getWave(); 482 if (wave == 0) return 0.0f; 483 float num_samples = wave->get_sample_count(currentLevel); 484 return num_samples / 65536; 485 } 486 487 return 1.0f; 488 } 489 490 float CWaveEditorCtrl::getDisplaySamplesPerUnit(float samplesPerUnit) { 525 491 RECT rc; 526 492 GetClientRect(&rc); 527 float unit= (float)(endDisplaySample-beginDisplaySample) / rc.right; 528 return unit; 529 } 530 531 float CWaveEditorCtrl::getDisplaySamplesPerTick() { 532 // returns number of samples in a pixel 533 RECT rc; 534 GetClientRect(&rc); 535 float samplesPerTick=view->mainFrame->player->masterInfo.samples_per_tick_frac+view->mainFrame->player->masterInfo.samples_per_tick; 536 float unit= (float)(endDisplaySample-beginDisplaySample) / samplesPerTick / rc.right; 537 return unit; 538 } 539 540 float CWaveEditorCtrl::getDisplaySamplesPerSec() { 541 // returns number of samples in a pixel 542 RECT rc; 543 GetClientRect(&rc); 544 float unit= (float)(endDisplaySample-beginDisplaySample) / getWave()->get_samples_per_sec(getWaveLevel()) / rc.right; 545 return unit; 546 } 547 548 float CWaveEditorCtrl::getDisplaySamplesPerWord(){ 549 // returns number of samples per "hexcent" 550 RECT rc; 551 GetClientRect(&rc); 552 553 wave_info_ex* waveInfo=getWave(); 554 if (waveInfo==0) return 0; 555 556 float num_samples = waveInfo->get_sample_count(currentLevel); 557 float samplesPerWord = num_samples / 65536; 558 559 float unit= (float)(endDisplaySample-beginDisplaySample) / samplesPerWord / rc.right; 560 return unit; 561 } 562 493 return (float)(endDisplaySample-beginDisplaySample) / samplesPerUnit / rc.right; 494 } 563 495 564 496 LRESULT CWaveEditorCtrl::OnHScroll(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/) { … … 566 498 WORD req=LOWORD(wParam); 567 499 // how many samples are 1 pixel? 568 float unit=getDisplaySamplesPerPixel(); 500 float unit = getDisplaySamplesPerUnit(1); 501 502 //float unit = getDisplaySamplesPerPixel(); 569 503 if (unit<1.0f) unit=1.0f; 570 504 -
trunk/src/buzelib/WaveEditorCtrl.h
r1285 r1286 107 107 int getWaveLevel(); 108 108 109 float getDisplaySamplesPerPixel(); 110 float getDisplaySamplesPerTick(); 111 float getDisplaySamplesPerSec(); 112 float getDisplaySamplesPerWord(); 109 float getSamplesPerUnit(WaveEditorGridMode mode); 110 float getDisplaySamplesPerUnit(float samplesPerUnit); 111 std::string formatSampleUnit(float units, WaveEditorGridMode mode); 113 112 114 113 void zoomShowSelection(); -
trunk/src/buzelib/WaveTableView.cpp
r1285 r1286 12 12 #include "Utils/Keymaps.h" 13 13 14 #ifdef min 15 #undef min 16 #endif 17 18 #ifdef max 19 #undef max 20 #endif 21 22 14 23 using namespace std; 15 24 using namespace zzub; … … 92 101 waveMachineDropDown.InsertString(-1, "<select machine>"); 93 102 for (size_t i=0; i<view->mainFrame->player->getMachines(); i++) { 94 metaplugin* machine=view->mainFrame->player->getMachine(i); 95 if (!machine->loader) continue; 96 97 const zzub::info* info=machine->loader->plugin_info; 98 99 if (info->flags&plugin_flag_plays_waves) { 100 waveMachineDropDown.InsertString(-1, machine->getName().c_str()); 101 } 103 metaplugin* machine = view->mainFrame->player->getMachine(i); 104 if (machine->nonSongPlugin) continue; 105 if ((machine->loader->plugin_info->flags&plugin_flag_plays_waves) == 0) continue; 106 107 waveMachineDropDown.InsertString(-1, machine->getName().c_str()); 102 108 } 103 109 waveMachineDropDown.SetCurSel(0); … … 336 342 SendMessage(hWndEditToolBar, TB_PRESSBUTTON, ID_WAVE_ZOOM_WORD, TRUE); 337 343 break; 338 339 344 } 340 345 } … … 617 622 int waveIndex = waveEditorCtrl.getWaveIndex(); 618 623 waveEditorCtrl.setEditWave(waveIndex, level); 624 bindStatus(); 619 625 620 626 return 0; … … 625 631 waveEditorCtrl.endSelectSample=waveEditorCtrl.getWave()->get_sample_count(waveEditorCtrl.getWaveLevel())-1; 626 632 waveEditorCtrl.Invalidate(); 633 bindStatus(); 627 634 628 635 return 0; … … 653 660 updateToolbar(); 654 661 waveEditorCtrl.Invalidate(FALSE); 662 bindStatus(); 655 663 return 0; 656 664 } … … 660 668 updateToolbar(); 661 669 waveEditorCtrl.Invalidate(FALSE); 670 bindStatus(); 662 671 return 0; 663 672 } … … 667 676 updateToolbar(); 668 677 waveEditorCtrl.Invalidate(FALSE); 669 return 0;670 } 671 672 // test 014 678 bindStatus(); 679 return 0; 680 } 681 673 682 LRESULT CWaveTableView::OnZoomWord(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& bHandled) { 674 683 waveEditorCtrl.gridType=WaveEditorWord; 675 684 updateToolbar(); 676 685 waveEditorCtrl.Invalidate(FALSE); 677 return 0; 678 } 679 680 686 bindStatus(); 687 return 0; 688 } 681 689 682 690 LRESULT CWaveTableView::OnZoomIn(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& bHandled) { … … 713 721 case UpdateSelectedWave: 714 722 updateFromWaveTable(); 723 bindStatus(); 715 724 break; 716 725 case UpdateSelectedWaveEntry: 717 726 bindWaveLevels(); 718 727 waveEditorCtrl.Invalidate(FALSE); 728 bindStatus(); 719 729 break; 720 730 case UpdateMachines: … … 743 753 void CWaveTableView::bindStatus() { 744 754 745 wave_info_ex* test=waveEditorCtrl.getWave(); //test = currently selected wave entry 746 if (test==0) return; 747 748 float num_samples = waveEditorCtrl.getWave()->get_sample_count(waveEditorCtrl.getWaveLevel()); 749 long hexfrompixel = ((waveEditorCtrl.currentCursorSamplePosition/num_samples)*65536); 750 751 std::stringstream valueStrm; //current mode 752 753 if (waveEditorCtrl.gridType==WaveEditorSamples) 754 valueStrm << "Samples"; else 755 if (waveEditorCtrl.gridType==WaveEditorTicks) 756 valueStrm << "Ticks"; else 757 if (waveEditorCtrl.gridType==WaveEditorSeconds) 758 valueStrm << "Seconds"; else 759 if (waveEditorCtrl.gridType==WaveEditorWord) 760 valueStrm << std::hex << hexfrompixel; 761 762 763 764 statusBar.SetText(1, valueStrm.str().c_str()); 765 } 755 wave_info_ex* wave = waveEditorCtrl.getWave(); //test = currently selected wave entry 756 757 float num_samples = 0; 758 759 if (wave != 0) 760 num_samples = wave->get_sample_count(waveEditorCtrl.getWaveLevel()); 761 762 WaveEditorGridMode gridType = waveEditorCtrl.gridType; 763 float samples_per_unit = waveEditorCtrl.getSamplesPerUnit(gridType); 764 765 std::stringstream pos_strm; 766 std::stringstream select_strm; 767 768 std::string unit_name; 769 switch (gridType) { 770 case WaveEditorSamples: 771 unit_name = "samples"; 772 break; 773 case WaveEditorSeconds: 774 unit_name = "sec"; 775 break; 776 case WaveEditorTicks: 777 unit_name = "ticks"; 778 break; 779 case WaveEditorWord: 780 unit_name = "hex"; 781 break; 782 default: 783 unit_name = "??"; 784 break; 785 } 786 787 if (waveEditorCtrl.beginSelectSample != -1) { 788 float min_select = std::min(waveEditorCtrl.beginSelectSample, waveEditorCtrl.endSelectSample); 789 float max_select = std::max(waveEditorCtrl.beginSelectSample, waveEditorCtrl.endSelectSample); 790 791 float select_start_unit = min_select / samples_per_unit; 792 float select_end_unit = max_select / samples_per_unit; 793 794 std::stringstream selectStrm; 795 select_strm << "Select " << waveEditorCtrl.formatSampleUnit(select_start_unit, gridType) << " to " << waveEditorCtrl.formatSampleUnit(select_end_unit, gridType) << " (" << unit_name << ")"; 796 } 797 798 if (num_samples != 0) { 799 int sample_unit = (float)waveEditorCtrl.currentCursorSamplePosition / samples_per_unit; 800 std::string sample_unit_string = waveEditorCtrl.formatSampleUnit(sample_unit, gridType); 801 802 pos_strm << "Pos: " << sample_unit_string << " (" << unit_name << ")"; 803 } 804 805 statusBar.SetText(0, pos_strm.str().c_str()); 806 statusBar.SetText(1, select_strm.str().c_str()); 807 }
