def _post_process(self): '''Effects added to the instrument. They can linger beyond notes.''' if self._tremolo_freq > 0: self._wave = effects.tremolo(self._wave, self._tremolo_freq) if self._slow_intro: attack = adsr.linear_envelope(0, 1, self._total_dur) self._wave = mixer.multiply((self._wave, attack)) self._wave = effects.echo(self._timer, self._wave, .2, 1/4)
def _chord_to_wave(self, chord_notes): '''Change lists of notes.Note() objects into numpy arrays of samples.''' # ring modulation done seperately for each indiv. note chord_waves = [] for note in chord_notes: dur = self._timer.samples_per_note(note.dur) self._total_dur += dur if note is None or note.dur == 0: continue if note.note == notes.REST: return oscil.Flat(dur=dur) carrier = self._oscil(note.freq, self._vol, dur=dur) if self._detune == 1: modulated_tone = carrier else: modulator = self._oscil(note.freq/self._detune, self._vol, dur=dur) modulated_tone = mixer.multiply((carrier, modulator)) chord_waves.append(modulated_tone) return mixer.add(chord_waves)
def _post_process(self): if self._tremolo_freq > 0: self._wave = effects.tremolo(self._wave, self._tremolo_freq) if self._slow_intro: attack = adsr.linear_envelope(0, 1, self._total_dur) self._wave = mixer.multiply((self._wave, attack))