void AudioView::Pitch() { VTrack *t; bool success = false; TrackList *tracks = GetTracks(); t = tracks->First(); while(t) { if (t->selected && t->GetKind() == VTrack::Wave) { NoteTrack *note = PitchExtract((WaveTrack *)t, &((AudioDoc *)GetDocument())->dirManager); if (note) { success = true; tracks->Add(note); } } t = tracks->Next(); } if (success) { PushState(); FixScrollbars(); REDRAW(trackPanel); REDRAW(rulerPanel); } }
void AudioView::Copy() { ClearClipboard(); TrackList *tracks = GetTracks(); VTrack *n = tracks->First(); VTrack *dest = 0; while(n) { if (n->selected) { n->Copy(sel0, sel1, &dest); if (dest) clipboard->Add(dest); } n = tracks->Next(); } clipLen = (sel1 - sel0); sel1 = sel0; UpdateMenus(); // PushState(); // Not an undoable operation }
void AudioView::Paste() { if (sel0 != sel1) Clear(); wxASSERT(sel0 == sel1); double tsel = sel0; TrackList *tracks = GetTracks(); VTrack *n = tracks->First(); VTrack *c = clipboard->First(); while(n && c) { if (n->selected) { n->Paste(tsel, c); c = clipboard->Next(); } n = tracks->Next(); } // TODO: What if we clicked past the end of the track? sel0 = tsel; sel1 = tsel + clipLen; PushState(); FixScrollbars(); REDRAW(trackPanel); REDRAW(rulerPanel); UpdateMenus(); }
bool AudioView::ProcessEvent(wxEvent& event) { if (event.GetEventType() == wxEVT_COMMAND_MENU_SELECTED && event.GetId() >= FirstEffectID && event.GetId() < FirstEffectID + numEffects) { Effect *f = Effect::GetEffect(event.GetId() - FirstEffectID); TrackList *tracks = GetTracks(); VTrack *t = tracks->First(); while(t) { if (t->selected && t->GetKind() == (VTrack::Wave)) { f->DoInPlaceEffect((WaveTrack *)t, sel0, sel1); } t = tracks->Next(); } PushState(); FixScrollbars(); REDRAW(trackPanel); REDRAW(rulerPanel); // This indicates we handled the event. return true; } return wxView::ProcessEvent(event); }
void AudioView::Cut() { ClearClipboard(); TrackList *tracks = GetTracks(); VTrack *n = tracks->First(); VTrack *dest = 0; while(n) { if (n->selected) { n->Cut(sel0, sel1, &dest); if (dest) clipboard->Add(dest); } n = tracks->Next(); } clipLen = (sel1 - sel0); sel1 = sel0; PushState(); FixScrollbars(); REDRAW(trackPanel); REDRAW(rulerPanel); UpdateMenus(); }
void AudioView::SelectNone() { TrackList *tracks = GetTracks(); VTrack *t = tracks->First(); while(t) { t->selected = false; t = tracks->Next(); } }
void AudioView::QuickMix() { WaveTrack **waveArray; VTrack *t; int numWaves = 0; int w; TrackList *tracks = GetTracks(); t = tracks->First(); while(t) { if (t->selected && t->GetKind() == VTrack::Wave) numWaves++; t = tracks->Next(); } if (numWaves == 0) return; waveArray = new WaveTrack*[numWaves]; w = 0; t = tracks->First(); while(t) { if (t->selected && t->GetKind() == VTrack::Wave) waveArray[w++] = (WaveTrack *)t; t = tracks->Next(); } WaveTrack *mix = ::QuickMix(numWaves, waveArray, &((AudioDoc *)GetDocument())->dirManager); if (mix) { tracks->Add(mix); PushState(); FixScrollbars(); REDRAW(trackPanel); REDRAW(rulerPanel); } }
void AudioView::Export() { VTrack *left = 0; VTrack *right = 0; VTrack *t; int numSelected = 0; TrackList *tracks = GetTracks(); t = tracks->First(); while(t) { if (t->selected) numSelected++; if (t->GetKind() != VTrack::Wave) { wxMessageBox("Only audio tracks can be exported."); return; } t = tracks->Next(); } if (numSelected == 0) { wxMessageBox("Please select one or two tracks before trying to export."); return; } if (numSelected > 2) { wxMessageBox("Cannot export more than two tracks (stereo). " "Please select either one or two tracks."); } left = tracks->First(); while (left && (!left->selected)) left = tracks->Next(); do { right = tracks->Next(); } while (right && (!right->selected)); ::Export((WaveTrack *)left, (WaveTrack *)right); }
void AudioView::SpectrumDisplay() { TrackList *tracks = GetTracks(); VTrack *n = tracks->First(); while(n) { if (n->selected && n->GetKind() == VTrack::Wave) ((WaveTrack *)n)->SetDisplay(WaveTrack::SpectrumDisplay); n = tracks->Next(); } REDRAW(trackPanel); REDRAW(rulerPanel); }
void AudioView::SelectAll() { TrackList *tracks = GetTracks(); VTrack *t = tracks->First(); while(t) { t->selected = true; t = tracks->Next(); } sel0 = 0.0; sel1 = tracks->GetMaxLen(); REDRAW(trackPanel); REDRAW(rulerPanel); UpdateMenus(); }
void AudioView::RemoveTracks() { TrackList *list = GetTracks(); VTrack *t = list->First(); while(t) { if (t->selected) t = list->RemoveCurrent(); else t = list->Next(); } PushState(); REDRAW(trackPanel); REDRAW(rulerPanel); UpdateMenus(); }
void AudioView::Clear() { TrackList *tracks = GetTracks(); VTrack *n = tracks->First(); while(n) { if (n->selected) n->Clear(sel0, sel1); n = tracks->Next(); } sel1 = sel0; PushState(); FixScrollbars(); REDRAW(trackPanel); REDRAW(rulerPanel); UpdateMenus(); }
VTrack *AudioView::FindTrack(int mouseX, int mouseY, bool label, wxRect *trackRect, int *trackNum) { wxRect r; if (label) { r.x = 0; r.width = labelWidth - 1; } else { int wid, ht; r.x = labelWidth; trackPanel->GetSize(&wid, &ht); r.width = wid - labelWidth; } r.y = -vpos; TrackList *tracks = GetTracks(); VTrack *t = tracks->First(); int n=1; while(t) { r.height = t->GetHeight(); if (r.Inside(mouseX, mouseY)) { if (trackRect) *trackRect = r; if (trackNum) *trackNum = n; return t; } r.y += r.height; n++; t = tracks->Next(); } if (mouseY >= r.y && trackNum) *trackNum = n-1; return NULL; }
void AudioView::OnPlayButton() { SoundPlayer player; double plays0 = sel0; double plays1 = sel1; if (sel0 == sel1) { plays0 = 0.0; plays1 = 10000000000.0; } TrackList *tracks = GetTracks(); VTrack *t = tracks->First(); while(t) { if (t->selected && t->GetKind() == (VTrack::Wave)) { player.Begin((WaveTrack *)t, plays0, plays1); return; } t = tracks->Next(); } }
// Draw all tracks void AudioView::DrawTracks(wxDC *dc, wxRect *visible) { wxRect r; r.x = visible->x; r.y = -vpos; r.width = visible->width; TrackList *tracks = GetTracks(); VTrack *t; int num=0; t = tracks->First(); while(t) { r.height = t->GetHeight(); // If it's visible at all (vertically) if (r.y < (visible->y + visible->height) && (r.y + r.height) > visible->y) { double h = sinfo.h + (r.x / sinfo.zoom); bool sel = t->selected; // Tell VTrack to draw itself wxRect innerRect = r; innerRect.x += labelWidth; innerRect.width -= labelWidth; innerRect.y += 4; innerRect.height -= 16; if (!t->IsCollapsed()) { if (sel) t->Draw(*dc, innerRect, h, sinfo.zoom, sel0, sel1); else t->Draw(*dc, innerRect, h, sinfo.zoom, 0.0, 0.0); } else { dc->SetBrush(backgroundBrush); dc->SetPen(backgroundPen); dc->DrawRectangle(innerRect); } // Draw label wxRect labelRect = r; labelRect.width = labelWidth; dc->SetBrush(mediumBrush[sel]); dc->SetPen(mediumPen[sel]); dc->DrawRectangle(labelRect); dc->SetPen(lightPen[sel]); dc->DrawLine(labelRect.x, labelRect.y, labelRect.x + labelRect.width, labelRect.y); dc->DrawLine(labelRect.x, labelRect.y, labelRect.x, labelRect.y + labelRect.height); dc->DrawLine(labelRect.x+1, labelRect.y+1, labelRect.x + labelRect.width, labelRect.y+1); dc->DrawLine(labelRect.x+1, labelRect.y+1, labelRect.x+1, labelRect.y + labelRect.height); dc->SetPen(darkPen[sel]); dc->DrawLine(labelRect.x, labelRect.y + labelRect.height, labelRect.x + labelRect.width, labelRect.y + labelRect.height); dc->DrawLine(labelRect.x+1, labelRect.y + labelRect.height-1, labelRect.x + labelRect.width, labelRect.y + labelRect.height-1); dc->DrawLine(labelRect.x+labelRect.width-1,labelRect.y+4, labelRect.x+labelRect.width-1,labelRect.y+labelRect.height-10); dc->DrawLine(labelRect.x+labelRect.width-2,labelRect.y+4, labelRect.x+labelRect.width-2,labelRect.y+labelRect.height-10); int ctr = labelRect.y + (labelRect.height/2); dc->SetTextForeground(wxColour(0,0,0)); char str[100]; sprintf(str,"%d",num+1); dc->DrawText(str, labelRect.x+15, ctr-8); if (t->GetKind()==VTrack::Wave) { sprintf(str,"%dk",(int)(((WaveTrack *)t)->rate/1000)); dc->DrawText(str, labelRect.x+5, ctr+8); } r.x += labelWidth; // Draw top bevels dc->SetPen(lightPen[sel]); dc->DrawLine(r.x, r.y, r.x + r.width, r.y); dc->DrawLine(r.x, r.y+1, r.x + r.width, r.y+1); dc->SetPen(mediumPen[sel]); dc->DrawLine(r.x, r.y+2, r.x + r.width, r.y+2); dc->DrawLine(r.x, r.y+3, r.x + r.width, r.y+3); dc->SetPen(darkPen[sel]); dc->DrawLine(r.x, r.y+4, r.x + r.width, r.y+4); dc->DrawLine(r.x, r.y+5, r.x + r.width, r.y+5); // Draw bottom bevels dc->SetPen(lightPen[sel]); dc->DrawLine(r.x, r.y+r.height-12, r.x + r.width, r.y+r.height-12); dc->DrawLine(r.x, r.y+r.height-11, r.x + r.width, r.y+r.height-11); dc->SetPen(darkPen[sel]); dc->DrawLine(r.x, r.y+r.height-1, r.x + r.width, r.y+r.height-1); dc->DrawLine(r.x, r.y+r.height-2, r.x + r.width, r.y+r.height-2); dc->SetPen(mediumPen[sel]); int j; for(j=3; j<=10; j++) dc->DrawLine(r.x, r.y+r.height-j, r.x + r.width, r.y+r.height-j); dc->SetPen(lightPen[sel]); for(j=r.width/2-40; j<r.width/2+40; j+=4) dc->DrawLine(r.x+j, r.y+r.height-9, r.x+j, r.y+r.height-5); dc->SetPen(darkPen[sel]); for(j=r.width/2-39; j<r.width/2+41; j+=4) dc->DrawLine(r.x+j, r.y+r.height-9, r.x+j, r.y+r.height-5); r.x -= labelWidth; } r.y += r.height; num++; t = tracks->Next(); } r.height = visible->height; dc->SetBrush(backgroundBrush); dc->SetPen(backgroundPen); dc->DrawRectangle(r); }
void AudioView::UpdateMenus() { numEffects = Effect::GetNumEffects(); if (undoManager.UndoAvailable()) editMenu->Enable(editMenu->FindItem(wxString("Undo")), TRUE); else editMenu->Enable(editMenu->FindItem(wxString("Undo")), FALSE); if (undoManager.RedoAvailable()) editMenu->Enable(editMenu->FindItem(wxString("Redo")), TRUE); else editMenu->Enable(editMenu->FindItem(wxString("Redo")), FALSE); if (clipboard->First() != 0) { editMenu->Enable(editMenu->FindItem(wxString("Paste")), TRUE); } else { editMenu->Enable(editMenu->FindItem(wxString("Paste")), FALSE); } TrackList *tracks = GetTracks(); int numTracks=0; int numSelected=0; VTrack *t = tracks->First(); while(t) { numTracks++; if (t->selected) numSelected++; t = tracks->Next(); } if (numSelected>0) { trackMenu->Enable(trackMenu->FindItem(wxString("Quick Mix")), TRUE); trackMenu->Enable(trackMenu->FindItem(wxString("Waveform Display")), TRUE); trackMenu->Enable(trackMenu->FindItem(wxString("Spectrum Display")), TRUE); trackMenu->Enable(trackMenu->FindItem(wxString("AutoCorrelate")), TRUE); trackMenu->Enable(trackMenu->FindItem(wxString("Pitch Extract")), TRUE); trackMenu->Enable(trackMenu->FindItem(wxString("Remove")), TRUE); fileMenu->Enable(projectMenu->FindItem(wxString("Export")), TRUE); for (int fi = 0; fi < numEffects; fi++) effectMenu->Enable(effectMenu->FindItem( (Effect::GetEffect(fi))->GetEffectName()), TRUE); editMenu->Enable(editMenu->FindItem(wxString("Cut")), TRUE); editMenu->Enable(editMenu->FindItem(wxString("Copy")), TRUE); editMenu->Enable(editMenu->FindItem(wxString("Clear")), TRUE); } else { for (int fi = 0; fi < numEffects; fi++) effectMenu->Enable(effectMenu->FindItem ((Effect::GetEffect(fi))->GetEffectName()), FALSE); editMenu->Enable(editMenu->FindItem(wxString("Cut")), FALSE); editMenu->Enable(editMenu->FindItem(wxString("Copy")), FALSE); editMenu->Enable(editMenu->FindItem(wxString("Clear")), FALSE); trackMenu->Enable(trackMenu->FindItem(wxString("Quick Mix")), FALSE); trackMenu->Enable(trackMenu->FindItem(wxString("Waveform Display")), FALSE); trackMenu->Enable(trackMenu->FindItem(wxString("Spectrum Display")), FALSE); trackMenu->Enable(trackMenu->FindItem(wxString("AutoCorrelate")), FALSE); trackMenu->Enable(trackMenu->FindItem(wxString("Pitch Extract")), FALSE); trackMenu->Enable(trackMenu->FindItem(wxString("Remove")), FALSE); fileMenu->Enable(projectMenu->FindItem(wxString("Export")), FALSE); } }
bool AudioView::DragTrack(wxMouseEvent &event) { VTrack *t; wxRect r; int num; if (capturedTrack) { t = capturedTrack; r = capturedRect; num = capturedNum; } else t = FindTrack(event.m_x, event.m_y, false, &r, &num); if (t) { mouseMostRecentX = event.m_x; mouseMostRecentY = event.m_y; if (resizing) { int delta = (event.m_y - mouseClickY); int newTrackHeight = initialTrackHeight + delta; if (newTrackHeight < 20) newTrackHeight = 20; t->SetHeight(newTrackHeight); REDRAW(trackPanel); } else if (dragging) { double selend = sinfo.h + ((event.m_x - r.x) / sinfo.zoom); if (selend < 0.0) selend = 0.0; if (selend != selstart) { t->Offset(selend - selstart); REDRAW(trackPanel); } selstart = selend; } else { // Selecting double selend = sinfo.h + ((event.m_x - r.x) / sinfo.zoom); if (selend < 0.0) selend = 0.0; if (selend >= selstart) { sel0 = selstart; sel1 = selend; } else { sel0 = selend; sel1 = selstart; } // Handle which tracks are selected int num2; if (0 != FindTrack(event.m_x, event.m_y, false, NULL, &num2)) { // The tracks numbered num...num2 should be selected TrackList *tracks = GetTracks(); VTrack *t = tracks->First(); int i=1; while(t) { t->selected = (i>=num && i<=num2) || (i>=num2 && i<=num); t = tracks->Next(); i++; } } wxString str; str.Printf("Selection: %lf - %lf seconds",sel0,sel1); status->SetLabel(str); REDRAW(trackPanel); } return true; } else return false; }