utils/pianoroll-client.py
author ymh <ymh.work@gmail.com>
Tue, 13 Jan 2015 10:46:05 +0100
changeset 85 eff9460bd4f2
parent 73 2a6590aeac15
child 93 79ae42ad97d4
permissions -rw-r--r--
add new visualization + small corrections
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
#!/usr/bin/env python
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
"""
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
Example of a UDP txosc sender with Twisted.
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
This example is in the public domain.
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
"""
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
73
2a6590aeac15 Add argument for events on pianoroll client
ymh <ymh.work@gmail.com>
parents: 68
diff changeset
     8
import argparse
0
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
import csv
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
import time
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
85
eff9460bd4f2 add new visualization + small corrections
ymh <ymh.work@gmail.com>
parents: 73
diff changeset
    12
import ntplib
0
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
from twisted.internet import reactor
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
from txosc import osc
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
from txosc import async
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
class UDPSenderApplication(object):
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
    """
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
    Example that sends UDP messages.
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
    """
85
eff9460bd4f2 add new visualization + small corrections
ymh <ymh.work@gmail.com>
parents: 73
diff changeset
    22
    def __init__(self, port, host, address, rows, shift):
0
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
        self.port = port
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
        self.host = host
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
        self.client = async.DatagramClientProtocol()
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
        self._client_port = reactor.listenUDP(0, self.client)
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
        self.rows = rows
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
        self.address = address
85
eff9460bd4f2 add new visualization + small corrections
ymh <ymh.work@gmail.com>
parents: 73
diff changeset
    29
        self.shift = shift
0
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
        reactor.callLater(0, self.send_messages)
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
    def _send(self, element):
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
        # This method is defined only to simplify the example
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
        self.client.send(element, (self.host, self.port))
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
        print("Sent %s to %s:%d" % (element, self.host, self.port))
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
    def send_messages(self):
85
eff9460bd4f2 add new visualization + small corrections
ymh <ymh.work@gmail.com>
parents: 73
diff changeset
    38
        t0 = time.time()
0
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
        for row in self.rows:
85
eff9460bd4f2 add new visualization + small corrections
ymh <ymh.work@gmail.com>
parents: 73
diff changeset
    40
            if self.shift:
eff9460bd4f2 add new visualization + small corrections
ymh <ymh.work@gmail.com>
parents: 73
diff changeset
    41
                row[0] = ntplib.system_to_ntp_time(t0 + float(row[1])/10**3)
0
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
            row_conv = [ osc.TimeTagArgument(float(row[0]))] + [osc.IntArgument(int(a)) for a in row[1:]]
21
89d235bcbbf3 few enhancements
cavaliet
parents: 2
diff changeset
    43
            #time.sleep((row_conv[1].value-tc)/10**3)
89d235bcbbf3 few enhancements
cavaliet
parents: 2
diff changeset
    44
            time.sleep(0.1)
48
a7abfcfd7959 real time with piano roll and new category management
cavaliet
parents: 21
diff changeset
    45
            #tc = row_conv[1].value
0
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
            self._send(osc.Message(self.address,*row_conv))
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
        print("Goodbye.")
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
        reactor.callLater(0.1, reactor.stop)
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
if __name__ == "__main__":
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
73
2a6590aeac15 Add argument for events on pianoroll client
ymh <ymh.work@gmail.com>
parents: 68
diff changeset
    52
    parser = argparse.ArgumentParser(description='Simulate an (osc) pianoroll client.')
2a6590aeac15 Add argument for events on pianoroll client
ymh <ymh.work@gmail.com>
parents: 68
diff changeset
    53
    parser.add_argument('datafile', metavar='DATAFILE', help='The file containing the pianoroll data (CSV).')
2a6590aeac15 Add argument for events on pianoroll client
ymh <ymh.work@gmail.com>
parents: 68
diff changeset
    54
    parser.add_argument('-e', '--event', dest='event', metavar='EVENT', required=True, help='the event code.')
85
eff9460bd4f2 add new visualization + small corrections
ymh <ymh.work@gmail.com>
parents: 73
diff changeset
    55
    parser.add_argument('-s', '--shift', dest='shift', action='store_true', required=False, help='Shift the data.', default=False)
73
2a6590aeac15 Add argument for events on pianoroll client
ymh <ymh.work@gmail.com>
parents: 68
diff changeset
    56
2a6590aeac15 Add argument for events on pianoroll client
ymh <ymh.work@gmail.com>
parents: 68
diff changeset
    57
    args = parser.parse_args()
2a6590aeac15 Add argument for events on pianoroll client
ymh <ymh.work@gmail.com>
parents: 68
diff changeset
    58
2a6590aeac15 Add argument for events on pianoroll client
ymh <ymh.work@gmail.com>
parents: 68
diff changeset
    59
    with open(args.datafile, 'rU') as datafile:
0
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
        reader = csv.reader(datafile, delimiter=' ')
85
eff9460bd4f2 add new visualization + small corrections
ymh <ymh.work@gmail.com>
parents: 73
diff changeset
    61
        app = UDPSenderApplication(9090, "127.0.0.1", "/pianoroll/%s/" % args.event, list(reader), args.shift)
0
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
e1d4d7a8255a First shareable version
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
    reactor.run()