Making the most of Wifi

‘Wires are not that bad (compared to wireless)’ – Perry R. Cook 2001
Wireless performance is risky, lower, etc than wired, but dancers don’t want to be cabled.
People use bluetooth, ZigBee and wifi. Everything is in the 2.4 gHz ISM band. All of these technologies use the same bands. Bluetooth has 79 narrowband channels. It will always collide, but always find a gap, leading a large variance in latency.
Zigbee has 16 channels, doesn’t hop.
Wifi has 11 channels in the UK. Many of them overlap, but 1, 6, and 11 don’t. It has broad bandwidth. It will swamp out zigbee and bluetooth.
the have seveloped XOSC, which sends OSC over wifi. It hosts ad-hoc networks. The presenter is rubbing a device and a fader is going up and down on a screen. The device is configured via a web browser.
You can further optimise on top of wifi. By using a high gain directional antenna. And by optimising router settings to minimise latency.
Normally, access points are omni directional, which will get signals from audiences, like mobile phone wifi or bluetooth. People’s phones will try to connect with the network. A directional antenna does not include as much of the audience. They tested the antenna patterns of routers. Their custom antenna has three antennas in it, in a line. It is ugly, but solves many problems. the tested results show it’s got very low gain at the rear, partly because it is mounted on a grounded copper plate.
Even commercial routers can have their settings optimised. This is detailed in their paper.
Packet size in routers is optimised for web browsing and is biased towards large packets, which has high latency. Tiny packets have huge throughput in musical applications.
Under ideal conditions, they can get 5ms of latency.
They found that channel 6 does overlap a bit with 1 and 11, so if you have two different devices, but them on the far outside channels.

Questions

UDP vs TCP – have you studied this wrt latency?
No, they only use UDP
How many drop packets do they get when there is interference?
that’s what the graph showed.

To gesture or not? An analysis of technology in nime proceedings 2001-2013

How many papers use the word ‘gesture’?
Gesture can mean many different things. (my battery is dying.)
Gesture is defined as movement of the body in dictionaries. (59 slides, 4 minutes of battery)
Research deifnitions of gesture: communication, control, metaphor (movement of sound or notation).
Who knows what gesture even means??
He downloaded nime papers and ran searches in them. 62% of all nime papers have mentioned gesture. (Only 90% of 2009 papers use the word ‘music’)
Only 32% of SMC papers mention gesture. 17% of ICMC
He checked what words ‘gesture’ came next to – collocation analysis.

NIME papers are good meta-research material
He suggests people define the term when they use it.
Data is available/

Questions

I can’t tell if this question is a joke or not….. oh, no, we’re on semiotics…. Maybe the pairong of the word ‘gesture’ with ‘recognition’ says something fundamental about why we care about gesture.
The word ‘gesture’ goes in and out of fashion.
Maybe ‘movement’ is a more meaningful word sometimes.
how often is gesture defined?
He should have checked that, he says.

Harmonic Motion: a tool kit for processing gestural data for interactive sound

they want to turn movement data into music.
This has come out of a collaboration with a dancer, using kinect. It was an exploration. He added visualisation to his interface. And eventually 240 parameters. The interface ended up taking over compared to the sound design.
They did a user survey to find out what other people were doing. So they wanted to write something that people could use for prototyping, that’s easy, extensible, and re-usable.
They wanted something stable, fast, free and complementary, so you could use your prototype in production. Not GPL, so you can sell stuff.
A patch-based system, because MAX is awesome all of the time.
This system is easily modifiable. He’s making it sound extremely powerful. Paramters are easy to tweak and saved with the patch, because parameters are important.
Has a simple SDK. Save it as a library, so you can run it in your project without the gui. this really does sound very cool.
Still in alpha.http://harmonicmotion.timmb.com

Questions

CNMAT is doing something he should look at, says a CNMAT guy.

Creating music with leap motion and big bang rubette

Leap Motion is cool, he says.
rubato composer is software that allows people to do stuff with music and maths structures and transforms. It’s MAXish, but with maths.
The maths are forms and denotators, which is based on category theory and something about vector spaces. You can define vectors and do map stuff with them. He’s giving some examples, which I’m sure are meaningful to a lot of people in this room. Alas, both the music AND the math terms are outside of my experience. …. Oh no wait, you just define things and make associations between them. …. Or maybe not…..
It sounds complicated, but you can learning while doing it. They want to make it intuitive to enter matrixes via a visual interface, by drawing stuff.
This is built on ontological levels of embodiment. Facts, processes, gestures (and perhaps jargon). Fortunately, he has provided a helpful diagram of triangular planed in different colours, with little hand icons and wavy lines in a different set of colours, all floating in front of a star field.
Now we are looking at graphs that have many colours, which we could interact with.

Leap Motion

A cheap, small device that track hands above the device. More embodied than mouse or multitouch, as it’s in 3d and you cna use all your fingers.

Rubato

Is built in java, as all excellent music software is. You can grab many possible spaces. Here is a straightfoward one in a five dimensional space, which we can draw with a mouse, but sadly, not in five dimensions. Intuitively, his gui plays audio from right to left. The undo interface is actually kind of interesting. This also sends midi….
The demo seems fun.
Now he’s showing a demo of waving his hands over a MIDI piano.

Questions

Is the software available?
Yes, on sourceforge, but that’s crashy. And there will be an andriod version.
Are there strategies to use it without looking at the screen?
That’s what was in the video, apparently.
Can you use all 3 dimensions?
Yes

Triggering Dounds From Discrete Gestures

Studying air drumming
Air instruments, like the theremin need no physical contact. The kinect has expanded this.
Continuous air gestures are like the theremin.
Discrete movements are meant to be triggers.
Air instruments have no tactile feedback, which is hard. They work ok for continuous air gestures, though. Discrete ones work less well.
He asked users to air drum along to a recorded rhythm.
Sensorimotor Synchronization research found that people who tap along to metronomes are ahead of the beat by 100ms.
Recorded motion with sensors on people.
All participants had musical experience, were right handed.
They need to analyze the audio to find drum sounds.
anaylsis looks for ‘sudden change of direction’ in user hand motion.
The have envelope following that is slow and fast and then compare those results. Hit occurs at velocity minimum. (usually)
Acceleration peaks take place before audio events, but very close to it.
Fast notes and slow notes have different means for velocity, but acceleration is unaffected.

Questions

Can this system be used to predict notes to fight latency in the kinect system?
Hopefully
Will result be different if users have drum sticks?
Maybe?

Nime live blog: Conducting aanalysis

They asked people to conduct however they wanted, to build a data set. Focus on the relationship between motion and loudness.
25 subjects conducting along to a recording. Used kinect to sample data. Used libxtract to measure loudness in the recordings.
Users listen to the recording twice and then conduct it 3 times
Got joint descriptors; velocity, acceleration and jerk; distance to torso.
Got general descriptors about quality of motion, maximum hand height.
they looked for descriptors highly correlated to loudness. they found none. some participants said they didn’t follow dynamics. 8 subjects were removed.
Some users used hand height for loudness, others used larger gestures. they separated users into two groups.

They have been able to find tendencies across users. However,a general model may not be the right approach.

Questions

How do they choose users?
People with no musical training were in the group that raised hand height.

Building SuperCollider 3.6 on Raspberry Pi

Raspberry Pi Wheezy ships with SuperCollider, but it ships with an old version that does not have support for Qt graphics. This post is only slightly modified from this (formerly) handy guide for building an unstable snapshot of 3.7 without graphic support. There are a few differences, however to add graphic support and maintain wii support.
This requires the Raspbian operating system, and should work if you get it via NOOBs. I could not get this to fit on a 4 gig SD card.
Note: This whole process takes many hours, but has long stretches where it’s chugging away and you can go work on something else.

Preparation

  1. log in and type sudo raspi-config, select expand file system, set timezone, finish and reboot
  2. sudo apt-get update
  3. sudo apt-get upgrade # this might take a while
  4. sudo apt-get remove supercollider # remove old supercollider
  5. sudo apt-get autoremove
  6. sudo apt-get install cmake libasound2-dev libsamplerate0-dev libsndfile1-dev libavahi-client-dev libicu-dev libreadline-dev libfftw3-dev libxt-dev libcwiid1 libcwiid-dev subversion libqt4-dev libqtwebkit-dev libjack-jackd2-dev
  7. sudo ldconfig

Build SuperCollider

  1. wget http://downloads.sourceforge.net/project/supercollider/Source/3.6/SuperCollider-3.6.6-Source.tar.bz2
  2. tar -xvf SuperCollider-3.6.6-Source.tar.bz2
  3. rm SuperCollider-3.6.6-Source.tar.bz2
  4. cd SuperCollider-Source
  5. mkdir build && cd build
  6. sudo dd if=/dev/zero of=/swapfile bs=1MB count=512 # create a temporary swap file
  7. sudo mkswap /swapfile
  8. sudo swapon /swapfile
  9. CC=”gcc” CXX=”g++” cmake -L -DCMAKE_BUILD_TYPE=”Release” -DBUILD_TESTING=OFF -DSSE=OFF -DSSE2=OFF -DSUPERNOVA=OFF -DNOVA_SIMD=ON -DNATIVE=OFF -DSC_ED=OFF -DSC_EL=OFF -DCMAKE_C_FLAGS=”-march=armv6 -mtune=arm1176jzf-s -mfloat-abi=hard -mfpu=vfp” -DCMAKE_CXX_FLAGS=”-march=armv6 -mtune=arm1176jzf-s -mfloat-abi=hard -mfpu=vfp” ..
    # should add ‘-ffast-math -O3’ here but then gcc4.6.3 fails
  10. make # this takes hours
  11. sudo make install
  12. cd ../..
  13. sudo rm -r SuperCollider-Source
  14. sudo swapoff /swapfile
  15. sudo rm /swapfile
  16. sudo ldconfig
  17. echo "export SC_JACK_DEFAULT_INPUTS="system"" >> ~/.bashrc
  18. echo "export SC_JACK_DEFAULT_OUTPUTS="system"" >> ~/.bashrc
  19. sudo reboot

Test SuperCollider

  1. jackd -p32 -dalsa -dhw:0,0 -p1024 -n3 -s & # built-in sound. change to -dhw:1,0 for usb sound card (see more below)
  2. scsynth -u 57110 &
  3. scide
  4. s.boot;
  5. {SinOsc.ar(440)}.play
  6. Control-.

Optional: Low latency, RealTime, USB Soundcard etc

  1. sudo pico /etc/security/limits.conf
  2. and add the following lines somewhere before it says end of file.
  3. @audio – memlock 256000
  4. @audio – rtprio 99
  5. @audio – nice -19
  6. save and exit with ctrl+o, ctrl+x
  7. sudo halt
  8. power off the rpi and insert the sd card in your laptop.
  9. dwc_otg.speed=1 # add the following to beginning of /boot/cmdline.txt (see http://wiki.linuxaudio.org/wiki/raspberrypi under force usb1.1 mode)
  10. eject the sd card and put it back in the rpi, make sure usb soundcard is connected and power on again.
  11. log in with ssh and now you can start jack with a lower blocksize
  12. jackd -p32 -dalsa -dhw:1,0 -p256 -n3 -s & # uses an usb sound card and lower blocksize
  13. continue like in step5.2 above

links:

This post is licensed under the GNU General Public License.

Personalised Jpegs for emailed wedding invitations

Let’s say you want to invite a bunch of people to your wedding and your soon-to-be-spouse wants some nice graphic you can mail to folks that has their name in it. You can do this! This script works with Linux and should work with OS X. It will require a few changes to work with windows.

Install some nifty software

I’m using both imagemagick and OptiPNG, both of which I got through apt-get. Probably, the png step is overkill and you could go straight to jpeg.
I’m also using Inkscape, Python and LibreOffice, but you can use any spreadsheet you want.

Make the graphic template

  1. Find some nice border of some kind. I drew one and scanned it, but there are other options.
  2. Open your nice border in inkscape (or other svg editor).
  3. Put all the text you want into your graphic, with the font you want.
  4. In the part where you want their name, put GUEST_NAME
  5. Save your lovely creation as template.svg

Compile names and email addresses

In LibreOffice, open a new spreadsheet and make a bunch of entries for your guests.
The first column should be email addresses.
If you are NOT saving the images, then the next column can all say ‘invite’ for every single entry. If you want to save the jpegs (say to post them to facebook walls as well as emailing them), then give them a short name associated with the person. This will be a file name, so it should be all one word that starts with a letter and contains only letters, numbers and underscores.
The last column should be the name you want to appear in the invite. You know from making your template how much space you have for names, so keep that in mind, if you’re deciding to put in Reverend Doctor Julius Milliband Cameron III’s full name or not. Or you may need to go back and tweak your template.
Your speadsheet should look something like this:

foo@example.com jen Jennifer
bar@example.com ralph Ralph & Morris
dr_rev@example.com ju Dr Cameron

Save this spreadsheet as guests.csv

The script

Get ready

Save your template, your spreadsheet and the script (cut and past from below), all to the same folder on your system. Call the script doemail.py
You will need to modify this script a bit.
Put in your own text where you see the part that says YOUR OWN TEXT. You’ll see it asks for your own text twice. One of those times is plain text. The other one is HTML. the plain text one is just text. Don’t include any html tags. If you put in links, you just have to put in the link as plain text. In the HTML part, you can use a lot of markup, including <a href=”blah.com”>blahblah</a> tags and whatnot. You can do inline CSS, if you like, but it’s email, so keep it relatively simple. In both sections, don’t forget to include a link to your website. And if you are using an online form for RSVPs, link to that as well.
You’ll also need to put in your own email address, and your own password. If you are using gmail, you can use an application-specific password.
Finally, you will also need to put in the smpt server for your mail server. Near the top of the file, you’ll see lines for hotmail and gmail. Delete any that don’t apply to you. If you are using a different server, you’ll have to find out what to put there.
If you want to save the nice jpegs, say to also post them in facebook messages, then look for the line:

jpegname = "/tmp/"+name+".jpeg"

and change the ‘/tmp/’ part to another directory on your system.
You need to make the script executable. Open the terminal application and cd to the directory with the script, template, and spreadsheet. Type:

 chmod +x doemail.py

This will make the script executable as a program you can run. then, double check your spreadsheet is ok. Type:

less guests.csv

It should look like:

foo@example.com,jen,Jennifer
bar@example.com,ralph,Ralph & Morris
dr_rev@example.com,ju,Dr Cameron

If you see semicolons instead of commas, then you need to change your script to tell it that. Change

guestreader = csv.reader(csvfile)

to

guestreader = csv.reader(csvfile, delimiter=';')

To run the script, still from your terminal, type:

 ./doemail.py

The Actual script to cut and paste

#! /usr/bin/python

import smtplib
import re
import subprocess
import os
import cgi
import uuid
import csv

from subprocess import call
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text      import MIMEText
from email.mime.image     import MIMEImage
from email.header         import Header    



# me == my email address
me = "example@hotmail.co.uk"
password = "yourEmailPassword"
smpt_server = "smtp.live.com:587" #hotmail
smpt_server = "smtp.gmail.com:587" #gmail

with open('guests.csv') as csvfile:
    guestreader = csv.reader(csvfile)
    for row in guestreader:
        you = row[0]
        name = row[1]
        salutation = row[2]

        name = ''.join(name.split())



        text = "Dear " + salutation + ",nn  YOUR TEXT GOES HERE http://YOURWEBSITE.COM"


        html = """
<html>
  <head></head>
  <body>
    <p>
<a href="YOUR WEDDING WEBSITE">
        """
        html = html + "<img src="cid:{}@example.com" alt="[More Information]" /></a></p>n<p>Dear {},</p>".format(img['cid'], salutation)
        html = html + """
<p>YOUR TEXT GOES HERE</p>
</body></html>
    </p>
  </body>
</html>
        """


        print (salutation)

        # Create message container - the correct MIME type is multipart/alternative.
        msg = MIMEMultipart('related')
        text_msg = MIMEMultipart('alternative')
        msg['Subject'] = Header(u'Wedding Invitation', 'utf-8')
        msg['From'] = me
        msg['To'] = you



        # make the image

        filename = "/tmp/"+name+".svg"
        pngname = "/tmp/"+name+".png"
        jpegname = "/tmp/"+name+".jpeg"

        svg = open("template.svg");
        svgn = open(filename, 'w');
        lines = svg.read().split('n')
        for line in lines:
            line = re.sub('GUEST_NAME',re.sub('&', '&amp;', salutation), line)
            svgn.write(line)
        #endfor

        svg.close()
        svgn.close()

        os.system("inkscape -f " + filename + " -e " + pngname)
        os.system("optipng " + pngname);
        os.system("convert -compress JPEG -quality 87 " + pngname + " " + jpegname);

        os.system("rm " + filename)

    
        # attach the image to the email

        img = dict(title=u'Invitation', path=jpegname, cid=str(uuid.uuid4()))
                                                        #cid=name)
                                                        #cid=str(uuid.uuid4()))
        with open(img['path'], 'rb') as file:
            msg_img = MIMEImage(file.read(), name=os.path.basename(img['path']))
            #msg.attach(msg_img)
            msg_img.add_header('Content-ID', '<{}@example.com>'.format(img['cid']))
            msg_img.add_header('Content-Name', img['cid'])
            msg_img.add_header('X-Attachment-ID', '{}@example.com'.format(img['cid']))
            #msg_img.add_header('Content-Disposition', 'attachment', filename=os.path.basename(img['path']))
            msg_img.add_header('Content-Disposition', 'inline', filename=os.path.basename(img['path']))

        print('<{}>'.format(img['cid']))



        # Create the body of the message (a plain-text and an HTML version).



        # Record the MIME types of both parts - text/plain and text/html.
        part1 = MIMEText(text, 'plain')
        part2 = MIMEText(html, 'html')

        # Attach parts into message container.
        # According to RFC 2046, the last part of a multipart message, in this case
        # the HTML message, is best and preferred.
        text_msg.attach(part1)
        text_msg.attach(part2)
        msg.attach(text_msg)
        msg.attach(msg_img)


        # Send the message via local SMTP server.
        server = smtplib.SMTP(smpt_server)
        server.ehlo()
        server.starttls()
        server.login(me,password)
        # sendmail function takes 3 arguments: sender's address, recipient's address
        # and message to send - here it is sent as one string.
        server.sendmail(me, you, msg.as_string())
        server.close()
        #server.quit()

        os.system("rm " + pngname)

    #end for (going through rows in the database)
    csvfile.close()
#end with    

I’m using Firefox because it’s great in programming and politics

Update: Eich has stepped down.
Yeah, so OkCupid says I should switch to a Google product because it’s better on LGBT rights. Um, have they been paying attention to anything? The new Mozilla CEO gave $1k to overturn marriage quality in California, whereas Google sponsored a national conference of prominent right-wing politicians who want to overturn all LGBT rights everywhere.
You know what, I love having equal marriage rights in California, really I do. And like most LGBT people, I thought prop 8 was terrible. But what I don’t like is ‘pink washing’, where some company makes some lame claim to be a sponsor of LGBT rights, (usually by having a health insurance policy that is vaguely equal or, thse days, by supporting something that a large majority of American agree with anyway (how bold!)) and then we’re supposed to forgive them all their other sins. Even if Google weren’t sponsoring CPAC, they’d still be in bed with the NSA.
We don’t hear much about ‘don’t be evil’ these days, because, alas, Google is making a fuckload of money by being evil. Mozilla never needed a corporate slogan like that because their mission has always been to do good from the very outset. I agree with this queer Mozilla employee who doesn’t want the open internet to get caught up in the American political football match of left vs right wedge issues and distraction. Open internet and NSA spying is more important than a relative small donation to an odious cause, which, by the way, does not mean we should be ‘tolerant’ of some asshole’s concrete political actions to take away rights from a minority which includes some of this own employees. If every other browser was also open source and pro-open standards and on the right side of LGBT rights, then this would be worth switching browsers over, for sure, but that’s not what’s going on here. The CEO says he won’t resign, which is a poor choice, but, again, really not worth a boycott. Especially when the other choices are closed source or blatantly on the side of evil.
So keep Firefox, and install Lightbeam if you want to see just how bloody much Google is spying on your every move. And if you’re an ally or whatever like OKCupid, how about doing a tiny bit of research and not telling LGBT people what to think or do? LGBT people and Mozilla employees can all speak for themselves/ourselves. Because, hey, we’ve got the internet, which is still open, thanks largely to the efforts of Mozilla.
Disclaimers of various sorts: I used to work for Netscape and I got the first same sex divorce in the state of California.

Bullying as Journalism

EDIT: ESPN actually is the publisher of the article, since they own Grantland.
Submitted to https://r.espn.go.com/members/contact/tvindex

Dear sir or Madam,

I am writing because I saw an advertisement for you on an article that I think you may not wish to be associated with. You may be aware of article on Grantland in which the journalist, Caleb Hannan, harasses his subject to the point of suicide. He is clearly aware of the harm he knows he causing her and uses it as part of his narrative arc. I’m sure that you do not wish to have your name associated with this kind of horrific bullying. Yet there is a link to you at the top of the page, implying endorsement. I would like to strongly encourage you to end your relationship with Grantland. I would also like to enquire if you have any policies which would apply if one of your own journalists submitted a similar story.

Thank you for your time,

Charles Hutchins

I’m not linking to the article. A ‘journalist’ decided to investigate the inventor of a new kind of putter. He speaks to her former employer who had used the threat of outing to get her to drop a discrimination lawsuit and then decided to out her anyway. He then called up everyone she knew to tell them personally that she was trans and ask them for comment. Having completely socially isolated her, he then calls her on the phone and tells her he’s going to out her in the press. She wrote him an email saying he was engaging in hate crime, which he included in the story. She took her own life, and he made sure to mention that the person who told him about this hated her and quote that person’s misgendering. He straight up caused somebody to die and then reported his role in it without a hint of remorse.
I’ve read some hateful shit. I’ve read bullying. I’ve read things that are intended to make the victim feel bad. But this, this kind of bloodless dispassionate, emotionally blank destruction of another human being is something I’ve never seen before. This is worse than anything I’ve ever encountered before. He kills someone and really is not at all bothered by it.
There’s a link to ESPN at the top of the socippath’s article and so I wrote to them. Their other adverts are automatically served by outbrain and are the same meaningless shit you see at the bottom of every article on earth. I clicked through on something that’s gone viral and the website is making money off of this. Because they have no qualms about bullying someone to death. Because it’s just a trans woman, so who cares.