aboutsummaryrefslogtreecommitdiffstats
path: root/.config/SuperCollider/functions.scd
blob: 731760a3d6ebf5a4b0ad765d9c2dfdf9ffe1f7d0 (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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
postln('Loading custom functions.');

/*
 * JACK specific helper functions
 * TODO: move to Quark
 */
// disconnect a port
~jackDisconnectPort = {
  arg source, sourceChannel, destination, destinationChannel;
  ("jack_disconnect "++source++":"++sourceChannel++" "++destination++":"++destinationChannel).unixCmd({
    arg exitCode;
    if(exitCode != 0, {
      postln("Disconnecting "++source++":"++sourceChannel++" from "++destination++":"++destinationChannel++" was unsuccessful!");
    });
  });
};

// connect a port
~jackConnectPort = {
  arg source, sourceChannel, destination, destinationChannel;
  ("jack_connect "++source++":"++sourceChannel++" "++destination++":"++destinationChannel).unixCmd({
    arg exitCode;
    if(exitCode != 0, {
      postln("Connecting "++source++":"++sourceChannel++" from "++destination++":"++destinationChannel++" was unsuccessful!");
    });
  });
};

// returns the amount of ports of a given client
~jackClientPorts = {
  arg clientName;
  ("jack_lsp "++clientName++"| wc -l").unixCmdGetStdOut.asInt;
};

/*
 * SuperCollider specific helper functions
 *
 */
// adds one or more channels to Server.local.options.num{In,Out}putBusChannels
// makes the tuple available in ~additionalChannels Dictionairy
~addAdditionalChannels = {
  arg type, name, channels;
  if( name.isKindOf(Symbol) && channels.isArray, {
    switch (type,
      \input, {
        ~additionalChannels.at(\inputs).add(name -> channels);
        postln("Added additional input channels for '"++name++"': "++channels.asString);
        Server.local.options.numInputBusChannels = Server.local.options.numInputBusChannels + channels.size;
        postln("Setting numInputBusChannels to "++Server.local.options.numInputBusChannels);
      },
      \output, {
        ~additionalChannels.at(\outputs).add(name -> channels);
        postln("Added additional output channels for '"++name++"': "++channels.asString);
        Server.local.options.numOutputBusChannels = Server.local.options.numOutputBusChannels + channels.size;
        postln("Setting numOutputBusChannels to "++Server.local.options.numOutputBusChannels);
      },
      { postln("Expecting \input or \output as type, got "++type.asString);
    });
  },{
    postln('Expecting type Symbol for name and type Array for channels.');
  });
};

/*
 * SSR specific helper functions
 * TODO: move to Quark
 */

// sets up the necessary OSC connection for an existing local or remote SSR
// instance, subscribes to it and returns the NetAddr associated with it
~ssrSetupOSC = {
  arg host="localhost", port=50001;
  var ssr;
  // set ssr of the client instance
  ssr = NetAddr(host, port);
  // answer /poll messages with an /alive answer
  OSCdef(
    \pollreply,
    {
      arg msg, time, addr, recvPort;
      ~ssr.sendMsg("/alive");
    },
    '/poll',
    ssr
  );
  // subscribe to server with MessageLevel::SERVER
  ssr.sendMsg("/subscribe", $T, 2);
  ssr;
};

// clears the SSR scene, unsubscribes from the instance and removes alive
// answers OSCdef
~ssrDismantleOSC = {
  arg ssr;
  if (ssr.isKindOf(NetAddr), {
    // remove all sources
    ssr.sendMsg("/scene/clear");
    // unsubscribe from server
    ssr.sendMsg("/subscribe", $F);
    // disable alive answers
    OSCdef(\alive).disable;
  });
};

// adds a source to an SSR instance
~ssrAddSource = {
  arg ssr, name, model = "point", port, x = 0.0, y = 0.0, orientation = 0.0,
  gain = 0.0, movability = $F, orientationMovability = $F, mute = $F;
  if (ssr.isKindOf(NetAddr), {
    if (name.isString, {
      if (model.isString, {
        if (port.isString, {
          ssr.sendMsg("/source/new", name, model, port, x, y, orientation,
            gain, movability, orientationMovability, mute)
        },{
          error("The port argument is not of type String: "++port.class);
        });
      },{
        error("The model argument is not of type String: "++model.class);
      });
    },{
      error("The name argument is not of type String: "++name.class);
    });
  },{
    error("The ssr argument is not of type NetAddr: "++ssr.class);
  });
};