示例#1
0
def test_saw():
    
    synth = Synth(44100)
    
    synth.setParameter(SynthParameters.OSC_1_WAVEFORM, Waveform.SAW)
    synth.setParameter(SynthParameters.OSC_2_WAVEFORM, Waveform.SAW)
    synth.setParameter(SynthParameters.OSC_3_WAVEFORM, Waveform.SAW)

    synth.noteOn(10)

    out = []
        
    for i in range(44100):
        out.append(synth.getSample())
        
    synth.noteOff(10)
示例#2
0
def test_whiteNoise():
    
    synth = Synth(44100)
    
    synth.setParameter(SynthParameters.OSC_1_WAVEFORM, Waveform.WHITE_NOISE)
    synth.setParameter(SynthParameters.OSC_2_WAVEFORM, Waveform.WHITE_NOISE)
    synth.setParameter(SynthParameters.OSC_3_WAVEFORM, Waveform.WHITE_NOISE)

    synth.noteOn(60)

    out = []
        
    for i in range(44100):
        out.append(synth.getSample())
        
    synth.noteOff(60)
示例#3
0
    def getSynth(self,
                               samplerate,
                               melodyToPad      = 0.5,
                               calmToExciting   = 0.5,
                               brightToDark     = 0.5,
                               softToHard       = 0.5,
                               clearToRich      = 0.5,
                               ):
        """This method returns a Synth matching the requirements.
        
        It uses REALLY COOL algorithms to embed the parameters into the Synth.
        Python's random module is used to generate random parameters. Therefore, a seed can be used to 
        generate the exact same song twice. That seed needs to be fed to the Composer instance.
        
        The beta-distribution is used a lot in this code as its density function can be centered 
        very easily and it naturally yields values in [0.0, 1.0].
        
        More on the beta distribution in the misc.additionalmath module.
        """

        """Set up synth."""
        synth = Synth(samplerate)
        
        """Waveforms"""
        synth.setParameter(SynthParameters.OSC_ALL_WAVEFORM, Waveform.SAW)
        
        """Oscillator gain"""
        #synth.setParameter(SynthParameters.OSC_ALL_GAIN, 1.0)
        synth.setParameter(SynthParameters.OSC_1_GAIN, 1.0)
        synth.setParameter(SynthParameters.OSC_2_GAIN, 1.0)
        synth.setParameter(SynthParameters.OSC_3_GAIN, 1.0)
        
        """Oscillator detune
        
        Depends on 
            - brightToDark
            - clearToRich
        """
        for i in range(SynthParameters.NUM_OSCILLATORS):
            mode = (brightToDark + 2.0 * clearToRich) / 3.0
            steepness = 1000      # high steepness, we dont want to much detune
            maxDetune = 50.0    # 50 cents
            detune = 2.0 * maxDetune * beta(mode, steepness) - maxDetune
            synth.setParameter(SynthParameters.OSC_1_DETUNE + i, detune)

        
        """Volume envelope
        
        Depends on:
            - melodyToPad
            - calmToExciting
            - softToHard
        """
        maxAttack   =  4.0
        maxDecay    =  3.0
        maxRelease  =  10.0
        
        for i in range(SynthParameters.NUM_OSCILLATORS):
            mode = (5.0 * melodyToPad + (1.0 - calmToExciting) + (1.0 - softToHard)) / 7.0
            steepness = 40
            attack  = maxAttack     * beta(mode, steepness) ** 1.5
            decay   = maxDecay      * beta(mode, steepness) ** 1.5
            
            mode = (3.0 * melodyToPad + (1.0 - calmToExciting) + (1.0 - softToHard)) / 5.0
            steepness = 40
            release = maxRelease    * beta(mode, steepness)

            synth.setParameter(SynthParameters.OSC_1_VOLUME_ENEVELOPE_ATTACK + i, attack)
            synth.setParameter(SynthParameters.OSC_1_VOLUME_ENEVELOPE_DECAY + i, decay)
            synth.setParameter(SynthParameters.OSC_1_VOLUME_ENEVELOPE_RELEASE + i, release)
        
        """Cutoff + Resonance
        
        Depend on:
            - melodyToPad        (resonance not)
            - calmToExciting
            - softToHard
        """ 
        # for i in range(SynthParameters.NUM_OSCILLATORS):
        # cutoff
        mode = ((1.0 - melodyToPad) + calmToExciting + 3.0 * softToHard) / 5.0
        steepness = 20
        cutoff = beta(mode, steepness) ** 3.0
        
        # resonance
        mode = (calmToExciting + softToHard) / 2.0
        steepness = 2
        resonance = beta(mode, steepness) ** 1.5
        
        synth.setParameter(SynthParameters.OSC_ALL_CUTOFF, cutoff)
        synth.setParameter(SynthParameters.OSC_ALL_RESONANCE, resonance)
        
        
        """LFO
        
        Depend on 
            - calmToExciting
            - softToHard
        """
        mode = calmToExciting
        steepness = 3
        frequency = beta(mode, steepness) ** 2.0
        
        mode = (calmToExciting + softToHard) / 2.0
        steepness = 20
        lfoToVolume = beta(mode, steepness) ** 6.0
        
        mode = (calmToExciting + softToHard) / 2.0
        steepness = 20
        lfoToFilter = beta(mode, steepness) ** 6.0
        
        synth.setParameter(SynthParameters.LFO_FREQUENCY, frequency)
        synth.setParameter(SynthParameters.LFO_TO_VOLUME, lfoToVolume)
        synth.setParameter(SynthParameters.LFO_TO_FILTER, lfoToFilter)

        return synth