class PpmGenerator(QWidget): # Inits basic variables def __init__(self, parent): super().__init__() # Init signal params # TODO - Change to correct params for PPM signal self.rate = 1000 self.format = 2 self.channels = 1 # Init default variables self.receiver = Receiver(self) self.signalData = [ ] # DataSamples of the PPM signal (simple array of ints with max and minimum at +/-(2^15-1) # Assign parent app self.parent = parent self.init_ui() # Defines the UI of the widget def init_ui(self): # Init main UI layout self.mainUiGrid = QGridLayout() # Status text to alert user if recording or not self.statusText = QLabel("Stopped") self.mainUiGrid.addWidget(self.statusText, 11, 4, 1, 1) # Graph that will draw the signal in the way it would be transmitted over WIFI network self.graph = MusicPlot() self.update_graph() self.mainUiGrid.addWidget(self.graph, 1, 0, 10, 4) self.mainUiGrid.addWidget(self.graph.plotnav, 1, 4, 10, 1) # Add buttons play_button = QPushButton('Play / Pause') play_button.clicked.connect(self.play_or_pause) self.mainUiGrid.addWidget(play_button, 11, 0) # Add buttons reset_button = QPushButton('Reset') reset_button.clicked.connect(self.reset) self.mainUiGrid.addWidget(reset_button, 11, 1) load_button = QPushButton('Load to program') load_button.clicked.connect(self.load_signal) self.mainUiGrid.addWidget(load_button, 11, 2) save_button = QPushButton('Save') save_button.clicked.connect(self.save_signal) self.mainUiGrid.addWidget(save_button, 11, 3) self.setLayout(self.mainUiGrid) # Resets state def reset(self): if self.receiver.recording(): self.receiver.stop_inputs() self.receiver.reset() self.signalData = [] self.statusText.setText("Stopped") self.update_graph() # Pauses or resumes/starts recording input from controller def play_or_pause(self): if self.receiver.recording(): self.statusText.setText("Paused") self.receiver.stop_inputs() self.signalData = self.receiver.get_ppm_data() self.update_graph() else: self.statusText.setText("Recording") self.receiver.get_inputs() # Load recording date into program to play def load_signal(self): # If still recording pause if self.receiver.recording(): self.receiver.stop_inputs() self.parent.musicName.setText("Opened: New signal") # Load recording into app self.parent.loadSamples(self.signalData, self.rate, self.channels, self.format) # Load recording graphs self.parent.loadWaveGraphs() # Save recording data to a file def save_signal(self): # If still recording pause if self.receiver.recording(): self.receiver.stop_inputs() options = QFileDialog.Options() fileName, _ = QFileDialog.getSaveFileName(self.parent, "Save to file", "", ".mp3 (*.mp3);;.wav (*.wav)", options=options) if fileName: # Get type of file ext = fileName.split(".")[-1] # If on linux and no extension was specified if ext != "mp3" and ext != "wav": fileName += ".mp3" ext = "mp3" # Save to file AudioSegment(b''.join(self.signalData), sample_width=pyaudio.PyAudio().get_sample_size( self.format), channels=self.channels, frame_rate=self.rate).export(fileName, ext) def update_graph(self): # Update graph self.graph.axes.clear() time = np.linspace(0, self.receiver.signal.duration, num=len(self.receiver.signal.data)) self.graph.axes.set_yticks([0, 1]) self.graph.plot(time, self.receiver.signal.data, 1) self.graph.addLabel("amp (int)", "y") self.graph.addLabel("t (ms)", "x")