Class: STFTSpectrogram::GUI

Inherits:
FXMainWindow
  • Object
show all
Defined in:
lib/gui/gui.rb

Overview

User interface

Constant Summary collapse

PLOT_TYPE_SPECTROGRAM =
1
PLOT_TYPE_TOP_MAGNITUDES =
2
MIN_WINDOW_WIDTH =
960
MIN_WINDOW_HEIGHT =
960

Instance Method Summary collapse

Constructor Details

#initialize(app) ⇒ GUI

Returns a new instance of GUI.



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/gui/gui.rb', line 17

def initialize(app)
  super(app, 'STFT Spectrogram generator', width: 1280, height: 720,
                                           opts: DECOR_ALL &
                                             ~DECOR_SHRINKABLE)

  @plot = Plot.new

  @audio = nil
  @spectrogram = nil

  vframe1 = FXVerticalFrame.new(self, width: 1280, opts: LAYOUT_FILL)
  hframe1 = FXHorizontalFrame.new(vframe1, opts: LAYOUT_FILL | FRAME_SUNKEN)
  @img_spectrum = FXImageView.new(hframe1, opts: LAYOUT_FILL)

  @current_spec_img = nil

  hframe2 = FXHorizontalFrame.new(vframe1)

  vframe_window = FXVerticalFrame.new(hframe2, opts: LAYOUT_FILL)
  hframe_window_size = FXHorizontalFrame.new(vframe_window,
                                             opts: LAYOUT_RIGHT)
  hframe_window_overlap = FXHorizontalFrame.new(vframe_window,
                                                opts: LAYOUT_RIGHT)
  FXLabel.new(hframe_window_size, 'Window size:')
  @spin_window_size = FXSpinner.new(hframe_window_size, 10)
  @spin_window_size.range = 1..(2**31 - 1)
  @spin_window_size.value = 1
  FXLabel.new(hframe_window_size, 'ms')
  FXLabel.new(hframe_window_overlap, 'Window overlap:')
  @spin_window_overlap = FXSpinner.new(hframe_window_overlap, 10)
  @spin_window_overlap.range = 0..(2**31 - 1)
  FXLabel.new(hframe_window_overlap, 'ms')

  FXVerticalSeparator.new(hframe2)

  vframe_freq = FXVerticalFrame.new(hframe2, opts: LAYOUT_FILL)
  hframe_freq_low = FXHorizontalFrame.new(vframe_freq, opts: LAYOUT_RIGHT)
  hframe_freq_high = FXHorizontalFrame.new(vframe_freq, opts: LAYOUT_RIGHT)
  FXLabel.new(hframe_freq_low, 'Low pass:')
  @spin_freq_low = FXSpinner.new(hframe_freq_low, 10)
  @spin_freq_low.range = 0..(2**31 - 1)
  FXLabel.new(hframe_freq_low, 'Hz')
  FXLabel.new(hframe_freq_high, 'High pass:')
  @spin_freq_high = FXSpinner.new(hframe_freq_high, 10)
  @spin_freq_high.range = 0..(2**31 - 1)
  FXLabel.new(hframe_freq_high, 'Hz')

  FXVerticalSeparator.new(hframe2)

  vframe_wav = FXVerticalFrame.new(hframe2, opts: LAYOUT_FILL)
  hframe_wav_txt = FXHorizontalFrame.new(vframe_wav, opts: LAYOUT_RIGHT)
  hframe_wav_btn = FXHorizontalFrame.new(vframe_wav, opts: LAYOUT_RIGHT)
  FXLabel.new(hframe_wav_txt, 'Loaded wave file:')
  @txt_wav_file = FXTextField.new(hframe_wav_txt, 60,
                                  opts: TEXTFIELD_READONLY)
  btn_wav_open = FXButton.new(hframe_wav_btn, 'Select WAV file')
  btn_wav_open.connect(SEL_COMMAND) { open_wav_file }

  FXVerticalSeparator.new(hframe2)

  vframe_plot = FXVerticalFrame.new(hframe2, opts: LAYOUT_FILL)
  hframe_plot_type = FXHorizontalFrame.new(vframe_plot, opts: LAYOUT_RIGHT)
  hframe_gen_plot = FXHorizontalFrame.new(vframe_plot, opts: LAYOUT_RIGHT)

  @combo_plot_type = FXComboBox.new(hframe_plot_type, 25,
                                    opts: COMBOBOX_STATIC)
  @combo_plot_type.appendItem('Spectrogram', PLOT_TYPE_SPECTROGRAM)
  @combo_plot_type.appendItem('Most significant frequencies only',
                              PLOT_TYPE_TOP_MAGNITUDES)

  btn_plot = FXButton.new(hframe_gen_plot, 'Generate plot')
  btn_plot.connect(SEL_COMMAND) { on_btnplot_pressed }

  FXVerticalSeparator.new(hframe2)

  hframe_save_img = FXHorizontalFrame.new(hframe2, opts: LAYOUT_RIGHT)
  btn_save_img = FXButton.new(hframe_save_img, 'Save graph')
  btn_save_img.connect(SEL_COMMAND) { on_save_graph }

  @spin_window_size.connect(SEL_COMMAND) { on_window_changed }
  @spin_window_overlap.connect(SEL_COMMAND) { on_window_changed }
end

Instance Method Details

#createObject



100
101
102
103
# File 'lib/gui/gui.rb', line 100

def create
  super
  show(PLACEMENT_SCREEN)
end