Пример #1
0
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);
  }
}
Пример #2
0
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
}
Пример #3
0
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();
}
Пример #4
0
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);
}
Пример #5
0
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();
}
Пример #6
0
void AudioView::SelectNone()
{
  TrackList *tracks = GetTracks();

  VTrack *t = tracks->First();
  while(t) {
	t->selected = false;
	t = tracks->Next();
  }
}
Пример #7
0
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);
  }
}
Пример #8
0
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);
}
Пример #9
0
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);
}
Пример #10
0
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();
}
Пример #11
0
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();
}
Пример #12
0
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();
}
Пример #13
0
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;
}
Пример #14
0
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();
  }
}
Пример #15
0
// 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);
}
Пример #16
0
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);
  }
}
Пример #17
0
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;
}