SpectMorph
smsampleview.hh
1 // Licensed GNU LGPL v3 or later: http://www.gnu.org/licenses/lgpl.html
2 
3 #ifndef SPECTMORPH_SAMPLE_VIEW_HH
4 #define SPECTMORPH_SAMPLE_VIEW_HH
5 
6 #include "smaudio.hh"
7 #include <bse/bseblockutils.hh>
8 
9 #include <QWidget>
10 
11 namespace SpectMorph {
12 
13 class SampleView : public QWidget
14 {
15  Q_OBJECT
16 
17 public:
18  enum EditMarkerType {
19  MARKER_NONE,
20  MARKER_LOOP_START,
21  MARKER_LOOP_END,
22  MARKER_CLIP_START,
23  MARKER_CLIP_END
24  };
25  class Markers {
26  public:
27  virtual size_t count() = 0;
28  virtual EditMarkerType type (size_t marker) = 0;
29  virtual float position (size_t marker) = 0;
30  virtual bool valid (size_t marker) = 0;
31  virtual void set_position (size_t marker, float new_position) = 0;
32  virtual void clear (size_t marker) = 0;
33  };
34 
35 private:
36  std::vector<float> signal;
37  Audio *audio;
38  Markers *markers;
39  double attack_start;
40  double attack_end;
41  double hzoom;
42  double vzoom;
43  EditMarkerType m_edit_marker_type;
44  bool button_1_pressed;
45 
46  void update_size();
47  void mousePressEvent (QMouseEvent *event);
48  void move_marker (int x);
49  void mouseMoveEvent (QMouseEvent *event);
50  void mouseReleaseEvent (QMouseEvent *event);
51 
52 public:
53  SampleView();
54  void load (GslDataHandle *dhandle, SpectMorph::Audio *audio, Markers *markers = 0);
55  void set_zoom (double hzoom, double vzoom);
56  void paintEvent (QPaintEvent *event);
57 
58  void set_edit_marker_type (EditMarkerType marker_type);
59  EditMarkerType edit_marker_type();
60 
61  template<class Painter> static void
62  draw_signal (std::vector<float>& signal, Painter& painter, const QRect& rect, int height, double vz, double hz)
63  {
64  int last_i0 = -1;
65  int last_x = 0;
66  double last_value = 0;
67 
68  for (int x = rect.x(); x < rect.x() + rect.width(); x++)
69  {
70  int i0 = x / hz;
71  int i1 = (x + 1) / hz + 1;
72 
73  if (last_i0 != i0)
74  {
75  if (i0 < int (signal.size()) && i0 >= 0 && i1 < int (signal.size() + 1) && i1 > 0)
76  {
77  painter.drawLine (last_x, (height / 2) + last_value * vz, x, (height / 2) + signal[i0] * vz);
78 
79  float min_value, max_value;
80  Bse::Block::range (i1 - i0, &signal[i0], min_value, max_value);
81 
82  painter.drawLine (x, (height / 2) + min_value * vz, x, (height / 2) + max_value * vz);
83 
84  last_x = x;
85  last_value = signal[i1 - 1];
86  }
87  last_i0 = i0;
88  }
89  }
90  }
91 signals:
92  void audio_edit();
93  void mouse_time_changed (int pos);
94 };
95 
96 }
97 
98 #endif
Audio sample containing many blocks.
Definition: smaudio.hh:79
Definition: smsampleview.hh:25
Definition: smaudio.hh:15
Definition: smsampleview.hh:13