예제 #1
0
    def test_callables_lambda(self):
        tuplestream = Itemstream(
            [{keys.rhythm: "h", "indx": .769}, {keys.rhythm: "h", "indx": 1.95}, {keys.rhythm: "w", "indx": 3.175},
             {keys.rhythm: "h", "indx": 5.54}, {keys.rhythm: "h", "indx": 6.67}, {keys.rhythm: "h", "indx": 8.0}]
        )
        pitches = Itemstream(sum([
            ['c1', 'c', 'c', 'd', 'c1', 'c', 'c', 'd'],
        ], []))
        pitches.notetype = 'pitch'

        g = Generator(
            streams=OrderedDict([
                (keys.instrument, Itemstream([1])),
                (keys.duration, lambda note:note.rhythm*2),
                ('rhy|indx', tuplestream),
                (keys.amplitude, Itemstream([1])),
                (keys.frequency, pitches)
            ]),
            pfields=[
                keys.instrument,
                keys.start_time,
                keys.duration,
                keys.amplitude,
                keys.frequency,
                'indx'
            ],
            note_limit=(len(pitches.values) * 2)
        )

        g.gen_lines = [';sine', 'f 1 0 16384 10 1', ';saw', 'f 2 0 256 7 0 128 1 0 -1 128 0', ';pulse',
                       'f 3 0 256 7 1 128 1 0 -1 128 -1']
        g.generate_notes()
        score_string = g.generate_score_string()
        self.assertTrue(score_string is not None)
        self.assertTrue(len(score_string.split('\n')) == 23)
예제 #2
0
    def test_basiccase(self):
        rhythms = Itemstream(['q','32'], 'sequence', tempo=60)
        rhythms.notetype = 'rhythm'
        amps = Itemstream([1])
        pitches = Itemstream(sum([
            ['c4', 'c', 'c', 'd', 'c5', 'c', 'c', 'd'],
        ], []))
        pitches.notetype = 'pitch'

        g = Generator(
            streams=OrderedDict([
                (keys.instrument, Itemstream([1])),
                (keys.duration, Itemstream([.1])),
                (keys.rhythm, rhythms),
                (keys.amplitude, amps),
                (keys.frequency, pitches)
            ]),
            note_limit=(len(pitches.values) * 2)
        )

        g.gen_lines = [';sine', 'f 1 0 16384 10 1', ';saw', 'f 2 0 256 7 0 128 1 0 -1 128 0', ';pulse',
                       'f 3 0 256 7 1 128 1 0 -1 128 -1']
        g.generate_notes()

        output = ""
        for x in range(len(g.gen_lines)):
            output += g.gen_lines[x]
        for x in range(len(g.notes)):
            output += g.notes[x]

        score = g.generate_score_string()
        self.assertTrue(score is not None)
        print(len(score.split('\n')))
        self.assertTrue(len(score.split('\n')) == 23)
예제 #3
0
    def test_callables_postprocesses(self):
        rhythms = 'h h w h h h'.split()
        indexes = [.769, 1.95, 3.175, 5.54, 6.67, 8.0]
        tuplestream = Itemstream(mapping_keys=[keys.rhythm, keys.index], mapping_lists=[rhythms, indexes])
        pitches = Itemstream(sum([
            ['c1', 'c', 'c', 'd', 'c1', 'c', 'c', 'd'],
        ], []))
        pitches.notetype = 'pitch'

        def post_processs(note):
            indx = g.context['indexstream'].get_next_value()
            item = g.context['tuplestream'].values[indx]
            note.rhythm = utils.rhythm_to_duration(item[keys.rhythm], g.context['tuplestream'].tempo)
            note.pfields[keys.index] = item[keys.index]

        g = Generator(
            streams=OrderedDict([
                (keys.instrument, Itemstream([1])),
                (keys.duration, lambda note:note.rhythm*2),
                (keys.amplitude, Itemstream([1])),
                (keys.frequency, pitches)
            ]),
            pfields=[
                keys.instrument,
                keys.start_time,
                keys.duration,
                keys.amplitude,
                keys.frequency,
                'indx'
            ],
            note_limit=(len(pitches.values) * 2),
            post_processes=[post_processs]
        )

        g.context['indexstream'] = Itemstream([1, 1, 1, 4, 5])
        g.context['tuplestream'] = tuplestream

        g.gen_lines = [';sine', 'f 1 0 16384 10 1', ';saw', 'f 2 0 256 7 0 128 1 0 -1 128 0', ';pulse',
                       'f 3 0 256 7 1 128 1 0 -1 128 -1']
        g.generate_notes()
        score_string = g.generate_score_string()
        self.assertTrue(score_string is not None)
        self.assertTrue(len(score_string.split('\n')) == 23)
예제 #4
0
    def test_literals(self):
        rhythms = Itemstream(['e'] * 60, 'sequence',
                             tempo=np.linspace(120, 480, 32).tolist() + np.linspace(480, 120, 32).tolist())
        rhythms.notetype = 'rhythm'
        amps = Itemstream([3])
        pitches = Itemstream(sum([
            ['c4', 'd', 'e', 'f', 'g'],
        ], []))
        pitches.streammode = 'heap'
        pitches.notetype = 'pitch'
        pan = 0
        dist = 10
        pct = .1

        g = Generator(
            streams=OrderedDict([
                (keys.instrument, Itemstream([1])),
                (keys.duration, Itemstream([.1])),
                (keys.rhythm, rhythms),
                (keys.amplitude, amps),
                (keys.frequency, pitches),
                (keys.pan, pan),
                (keys.distance, dist),
                (keys.percent, pct)
            ]),
            note_limit=240
        )
        g.gen_lines = [';sine', 'f 1 0 16384 10 1', ';saw', 'f 2 0 256 7 0 128 1 0 -1 128 0', ';pulse',
                       'f 3 0 256 7 1 128 1 0 -1 128 -1']

        g.generate_notes()
        g.streams[keys.rhythm].tempo = np.linspace(480, 30, 32).tolist() + np.linspace(30, 480, 32).tolist()
        g.streams[keys.pan] = 90
        g.generate_notes()


        g.end_lines = ['i99 0 ' + str(g.score_dur) + '\n']

        score = g.generate_score_string()
        self.assertTrue(score is not None)
        self.assertTrue(len(score.split('\n')) == 488)
예제 #5
0
from thuja.itemstream import notetypes
from thuja.itemstream import streammodes
from thuja.itemstream import Itemstream
from thuja.generator import Generator
from thuja.generator import keys
from thuja import csound_utils
import copy

rhythms = Itemstream(
    # '12 12 12 12 12 12 e. e. e q. e q. e q q'.split()+['s']*16,
    ['12'] * 4 + ['6'] * 4,
    streammode=streammodes.sequence,
    tempo=120,
    notetype=notetypes.rhythm)

amps = Itemstream([1])

pitches = Itemstream(sum([
    ['c4', 'c', 'c', 'd', 'c5', 'c', 'c', 'd'],
    ['c3', 'e', ['c', 'e', 'g'], 'c4', 'e', ['c', 'e', 'g']],
    [['c', 'e', 'g'], ['c', 'e', 'g'], ['c', 'd', 'e'], ['e', 'f', 'g']],
], []),
                     streammode=streammodes.heap,
                     notetype=notetypes.pitch)

g = Generator(streams=[(keys.instrument, 1), (keys.rhythm, rhythms),
                       (keys.duration, Itemstream([.1])), (keys.amplitude, 1),
                       (keys.frequency, pitches)],
              pfields=None,
              gen_lines=[';sine', 'f 1 0 16384 10 1'])
g.time_limit = 120
예제 #6
0
from __future__ import print_function
import unittest
from thuja.itemstream import Itemstream
from thuja.generator import Generator
from thuja.generator import keys
import thuja.utils as utils

from collections import OrderedDict
import numpy as np

rhythm = Itemstream('w h q e s e. w+q'.split())
rhythm.notetype = 'rhythm'


class TestGenerators(unittest.TestCase):

    def test_callables(self):
        tuplestream = Itemstream(
            [{keys.rhythm: "h", "indx": .769}, {keys.rhythm: "h", "indx": 1.95}, {keys.rhythm: "w", "indx": 3.175},
             {keys.rhythm: "h", "indx": 5.54}, {keys.rhythm: "h", "indx": 6.67}, {keys.rhythm: "h", "indx": 8.0}]
        )

        pitches = Itemstream('c1 c c d c c c d'.split())
        pitches.notetype = 'pitch'

        def f(note):
            return note.rhythm * 2

        g = Generator(
            pfields=[
                keys.instrument,