Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/City/City.py
blob: 766206d5343cb7b27afb7fb5bbd08212e6952ac1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#!/usr/bin/env python
"""
Turn all of this into executable functions
Then move it to run.py
"""

from CsHelpers import *
import CsSched, Parameters, OrcBuilder, Tracks
import random

class ScenePlayer( SceneData ):
    def __init__(self, scene_name = 'City', key = 'A', mode = 'minor', tempo = 120, defaults = {}):
        SceneData.__init__(self, scene_name)
        self.tempo = tempo
        self.Csynth = CsSched.Csound()
        self.TimeQueue = CsSched.Sched()
        self.Params = Parameters.Perimeter()
        self.orc = OrcBuilder.OrcConstructor()
        self.makeOrc()
        self.cs = CsSched.CsoundPerformer(self.TimeQueue, self.orc, self.Csynth.csound)
        self.Params.csoundChannels(self.cs)
        self.loadTracks(key, mode)
        self.setParameters(defaults)
    def setParameters(self, pdict):
        "dict is a dictionary in the form: {Instrument:{parameter:value}}"
        for i in pdict:
            for p in pdict[i]:
                print "setting: ", p,i,pdict[i][p]
                self.Params.setValue(p,i,pdict[i][p])
    def makeOrc(self, sr = 22050, ksmps = 128):
        orc = self.orc
        orc.sr = sr
        orc.ksmps = ksmps
        lookuptabs = [OrcBuilder.orcLoadSamples(orc, self.Csynth, instr+"Lookup", eval("self."+instr+"AudioPath")) for instr in INAMES]
        ftabs = [OrcBuilder.FtableBreakPoint("rvbc1", -558, -594, -638, -678, -711, -745, -778, -808,  0.8,  0.79,  0.78,  0.77,  0.76,  0.75,  0.74,  0.73),
                 OrcBuilder.FtableBreakPoint("rvbc2", -517, -540, -656, -699, -752, -799, -818, -841,  0.8,  0.79,  0.78,  0.77,  0.76,  0.75,  0.74,  0.73),
                 OrcBuilder.FtableBreakPoint("rvba1", -278, -220, -170, -122,  0.4,  0.52,  0.64,  0.76),
                 OrcBuilder.FtableBreakPoint("rvba2", -333, -263, -166, -105,  0.5,  0.52,  0.64,  0.76)]
        orc.insertftables(*ftabs)
        volumechans = self.commonChannels("Volume", 0.8)
        timbrechans = self.commonChannels("Timbre", 0.5)
        orc.insertChannels(*volumechans)
        orc.insertChannels(*timbrechans)
        setlevels = OrcBuilder.OrcSetLevelInstrument()
        setlevels.effect = True
        mixerout = OrcBuilder.OrcMixoutInstrument()
        mixerout.effect = True
        samplerbody = """
            idur = p3
            iamp = p4 * (0dbfs / 127)
            kcps init cpsmidinn(p5)
            isamp table p5, %s
            a1 loscil iamp, kcps, isamp
            a1 dcblock a1 
            kdeclick linseg 0, 0.008, 1, idur - 0.05 - 0.008, 1, 0.05, 0
            a1 = a1 * kdeclick """
        timbrebody = ("""
            idur = p3
            ires = 5.75
            kfco expcurve %s + 0.01, 17
            kfco = kfco * """ + str(orc.sr*0.5 * 0.45) + """ + 1200
            a2 rezzy a1, kfco, ires
            a1 balance a2, a1
            a1 = a1 * 0.2 + a2 * 0.4
            """)
        SamplerInstruments, TimbreInstruments = [OrcBuilder.OrcInstrument(i+'Sampler') for i in INAMES], [OrcBuilder.OrcInstrument(i+'Timbre') for i in INAMES]
        for Si, Ti in zip(SamplerInstruments, TimbreInstruments):
            Si.insertLine(samplerbody % [x for x in [n.varname() for n in lookuptabs] if x.__contains__(Si.name[:-7])][0])
            Ti.insertLine(timbrebody % [y for y in [j.varname() for j in timbrechans] if y.__contains__(Ti.name[:-6])][0])
            Si.routeOut('a1', Ti, setlevels, [c for c in [v.varname() for v in volumechans] if c.__contains__(Si.name[:-7])][0])
            Ti.routeOut('a1', mixerout, setlevels)
            Ti.routeIn('a1')
            Ti.effect = True
            orc.appendInstruments(Si, Ti)
        orc.appendInstruments(mixerout)
        orc.prependInstrument(setlevels)
        return True
    def commonChannels(self, chnName, default):
        "returns a list of channel objects for INAMES"
        return OrcBuilder.orcChannelMaker(INAMES, chnName, init = default)
    def loadTracks(self, key, mode):
        "see sc below"
        self.scale = Tracks.Scale(key, mode)
        midifiles = ResourceList(self.MidiFilePath, ".mid")
        for m in midifiles:
            score = Tracks.Midi2Score(self.MidiFilePath + "/" + m)
            track = score.midiTrack2ScoreTrack(score.getTrack(0))
            if m.startswith('Lead'):
                self.leadtrack = track
            elif m.startswith('Bass'):
                self.basstrack = track
            elif m.startswith('Chords'):
                self.chordstrack = track
            elif m.startswith('Drums'):
                self.drumstrack = track
            else:
                raise ValueError, "Can't match MIDI file %s to instrument" %m

def makePlayer(scene):
    "create and return a player"
    player = Tracks.beatDebugPlayer(scene.cs, scene.TimeQueue, scene.Params, scene.scale)
    player.setBPM(scene.tempo)
    lead = scene.orc.nameNumber['LeadSampler']
    bass = scene.orc.nameNumber['BassSampler']
    chords = scene.orc.nameNumber['ChordsSampler']
    drums = scene.orc.nameNumber['DrumsSampler']
    player.beatInstrumentMap(1, Lead = [scene.leadtrack, lead], Bass = [scene.basstrack,bass], 
                        Chords = [scene.chordstrack, chords], Drums = [scene.drumstrack, drums])
    return player