def get_controls(self, amplitudes, harmonic_distribution, f0_hz): """Convert network output tensors into a dictionary of synthesizer controls. Args: amplitudes: 3-D Tensor of synthesizer controls, of shape [batch, time, 1]. harmonic_distribution: 3-D Tensor of synthesizer controls, of shape [batch, time, n_harmonics]. f0_hz: Fundamental frequencies in hertz. Shape [batch, time, 1]. Returns: controls: Dictionary of tensors of synthesizer controls. """ # Scale the amplitudes. if self.scale_fn is not None: amplitudes = self.scale_fn(amplitudes) harmonic_distribution = self.scale_fn(harmonic_distribution) # Bandlimit the harmonic distribution. if self.normalize_below_nyquist: n_harmonics = int(harmonic_distribution.shape[-1]) harmonic_frequencies = core.get_harmonic_frequencies( f0_hz, n_harmonics) harmonic_distribution = core.remove_above_nyquist( harmonic_frequencies, harmonic_distribution, self.sample_rate) # Normalize harmonic_distribution /= tf.reduce_sum(harmonic_distribution, axis=-1, keepdims=True) return { 'amplitudes': amplitudes, 'harmonic_distribution': harmonic_distribution, 'f0_hz': f0_hz }
def get_controls(self, amplitudes, frequencies): """Convert network output tensors into a dictionary of synthesizer controls. Args: amplitudes: 3-D Tensor of synthesizer controls, of shape [batch, time, n_sinusoids]. frequencies: 3-D Tensor of synthesizer controls, of shape [batch, time, n_sinusoids]. Expects strictly positive in Hertz. Returns: controls: Dictionary of tensors of synthesizer controls. """ # Scale the inputs. if self.amp_scale_fn is not None: amplitudes = self.amp_scale_fn(amplitudes) if self.freq_scale_fn is not None: frequencies = self.freq_scale_fn(frequencies, scale=self.freq_scale, hz_max=self.hz_max) amplitudes = core.remove_above_nyquist(frequencies, amplitudes, self.sample_rate) return {'amplitudes': amplitudes, 'frequencies': frequencies}