HID Update

Download a new version of my HID classes.
So I think some of my original features were overzealous, so some of them have been removed. For instance, no more specifying a ControlSpec for an HIDElementExt. If you want to use a ControlSpec, you should attach the HIDElementExt (or HIDElement Group) to a CV by means of the action. Remember that CVs are really useful objects. See their help file for more information. For example of how to attach one:

element.action_({arg vendorID, productID, locID, cookie, value;

 var scaled, mycv;
     
 scaled = element.scale(value);
         
 mycv = cvDictionary.at(element.usage.asSymbol);
 mycv.input_(scaled);
});

Note the name and order of arguments, as this is a change. In this example, cvDictionary is an IdentityDictionary where CVs are stored according to the element.usage as a key. scale is a message you can pass to an element in which a value is scaled according to the min and max to be a number between 0 and 1. You can still set the min and max of an element based on what you’ve discovered to be the range of your HID, regardless of what lies the device may whisper in your ear about it’s ranges.
The HIDDeviceExt.configure message was not really needed, so it’s gone.
Here is some code to automatically generate a GUI for every HID that you have attached. Note that you will need the Conductor class for it, which is part of the Wesleyan nightly build. This GUI will give you one line for every reported piece of the device. You can then try moving everything around to see what their actual ranges are (if they are smaller than reported) and the correlation between reported names and the elements.

(

 var elems, names, cv, conductor;

 HIDDeviceServiceExt.buildDeviceList;
 
 HIDDeviceServiceExt.devices.do({ arg dev;
 
  elems = [];
  names = [];

  dev.queueDevice;

  dev.elements.do ({ arg elm;
  
   cv = CV.new.sp(0, elm.min, elm.max, 0, 'linear');
   elems = elems.add(cv);
   names = names.add(elm.usage.asSymbol);
   elm.action_({ arg vendorID, productID, locID, cookie, value;
     
    var scaled, mycv;
     
    scaled = elm.scale(value);
         
    mycv = conductor.at(elm.usage.asSymbol);
    mycv.input_(scaled);
   });

  });
 
  conductor = Conductor.make({ arg cond; 
  
   elems.do({ arg item, index;
   
    cond.put(names[index], item);
   });
   
   cond.argList = cond.argList ++ elems;
   cond.argNames = cond.argNames ++ names;
   cond.valueItems = cond.valueItems ++ names;
   cond.guiItems = cond.valueItems;
  });
  
  conductor.show;
  
 });
 
 HIDDeviceServiceExt.runEventLoop;

)

Then stop it with:

HIDDeviceServiceExt.stopEventLoop;

But what if the returned values are outside of the range? And what are the cookies? You should then generate a little report to correlate everything.

(
 HIDDeviceServiceExt.devices.do({arg dev;
  [dev.manufacturer, dev.product, dev.vendorID, dev.productID, dev.locID].postln;
  dev.elements.do({arg ele;
   [ele.type, ele.usage, ele.cookie, ele.min, ele.max, ele.minFound, ele.maxFound].postln;
  });
 });
)

You can use the minFound and maxFound data to calibrate the device.
This is my current code to configure my (crappy) joystick:

HIDDeviceServiceExt.buildDeviceList;
HIDDeviceServiceExt.queueDeviceByName('USB Joystick STD');

(

 var thisHID, simpleButtons, buttons, stick;
 
 thisHID = HIDDeviceServiceExt.deviceDict.at('USB Joystick STD');
 simpleButtons = HIDElementGroup.new;
 buttons = HIDElementGroup.new;
 stick = HIDElementGroup.new;
  
 thisHID.deviceSpec = IdentityDictionary[
   // buttons
   trig->7, left->9, right->10, down->8, hat->11,
   // stick
   x->12, y->13,
   wheel->14,
   throttle->15
  ]; 
  
  
 simpleButtons.add(thisHID.get(trig));
 simpleButtons.add(thisHID.get(left));
 simpleButtons.add(thisHID.get(right));
 simpleButtons.add(thisHID.get(down));
  
 buttons.add(simpleButtons);
 buttons.add(thisHID.get(hat));
  
 stick.add(thisHID.get(x));
 stick.add(thisHID.get(y));
  
 // make sure each element is only lsted once in the nodes list, or else it
 // will run it's action once for each time a value arrives for it
  
 thisHID.nodes = [ buttons, stick, thisHID.get(wheel), thisHID.get(throttle)];
  
 // When I was testing my joystick, I noticed that it lied a bit about ranges
  
 thisHID.get(hat).min = -1;  // it gives back -12 for center, but -1 is close enough
  
 // none of the analog inputs ever went below 60
  
  
 thisHID.get(wheel).min = 60;
 thisHID.get(throttle).min = 60;
 // can set all stick elements at once
 stick.min = 60;
)

Setting the min and the max for each element is used for the scale message. If you don’t want to bother scaling the values to be between 0 and 1 (or some other range) and you set the threshold to 0, then you can skip setting the min and the max.
Here is a silly example of using the x and y axis of my joystick to control the frequency and amplitude of a Pbind in a GUI. Note that it would work almost identically without the GUI.

(

 HIDDeviceServiceExt.runEventLoop;

 Conductor.make({arg cond, freq, amp;
 
  var joystick;
 
  freq.spec_(freq);
  amp.spec_(amp);
  
  joystick = HIDDeviceServiceExt.deviceDict.at('USB Joystick STD');
  
  joystick.get(y).action_({ arg vendorID, productID, locID, cookie, value;
  
   freq.input_(joystick.get(y).scale(value));
  });
  
  joystick.get(x).action_({ arg vendorID, productID, locID, cookie, value;
  
   amp.input_(joystick.get(x).scale(value));
  });
  
  cond.name_("silly demo");
  
  cond.pattern_( Pbind (
  
   freq, freq,
   amp, amp
  ));
  
 }).show;
  
)

Don’t forget to stop the loop when you’re done:

HIDDeviceServiceExt.stopEventLoop;

As you may have guessed from this EventLoop business, HIDs are polled. Their timing, therefore, may not be as fast as you’d like for gaming. They may be more suited to controlling Pbinds like in the silly example, rather than Synth objects. You will need to experiment on your own system to see what will work for you.
The HIDElementExt all have a threshold of change below which they will not call their actions. This defaults to 5%, which is a good value for my very crappy joystick. You can set your own threshold. It’s a floating point number representing a percent change, so you can put it between 0 and 1. Again, you may want to experiment with this. Most HIDs have a little bit of noise and flutter where they report tiny actions where none occurred. Also, do not buy a 5€ joystick from a sketchy shop. It’s range will suck and it will will flutter like crazy and it will be slow and you will end up buying a more expensive joystick anyway.

joystick.threshold_(0.01); // 1% 

Tags: , ,

“Bank” means “sofa” in Dutch

But it’s a good thing they’re different things, or nobody would let me sit anywhere. I have gone to every bank chain in the city, as far as I know. I have never encountered anybody who wanted my business less. What is causing this?
All of my American classmates have managed to open accounts, so it’s not anti-Americanism. Is it sexism? Is it homophobia? Do I not closely enough look like a student? Am I too butch for them? Not manly enough?
I ask for an account and they start looking for reasons to say no. Note that I don’t say that they’re listing requirements. They quite clearly want to refuse me. Given that I’ve gone to the same banks as my classmates, I can only assume that I’m experiencing discrimination. I was hoping that being the recipient of antigay slurs at the train station was an isolated event, but maybe not. Or maybe it’s something else.
I really miss France. Their bureaucracy is way easier and more logical than here. And when it wasn’t, one could always resort to yelling. I don’t think that will help here, but I’m about a millimeter away from it.
Tags: ,

Biography, programs and music

A while ago, I had a conversation with a friend who contended that people go to concerts, read the biographies (and program notes) of a composer and judge the pieces based on this rather than on the sound. He furthermore stated that many biographies of students were inflated. They had played concerts in their home towns, their college towns and now here, perhaps in three different countries. But they’re not international stars, it’s just where they studied. Furthermore, who their teachers were might be important, but it’s not germane to listening to the piece. If these composers are so fantastic, why are they in school at all? (Maybe they just want to live in another country until Habeas Corpus is reinstated.)
I’ve been thinking about this in regards to my bio. I think having a bio that lists teachers, education, awards and whatnot is useful for a press kit. As in: anything that helps me get gigs is good. But what about a bio for programs? Apparently, according to my (non-Dutch) friend, the Dutch don’t react well to self aggrandizement. So I’ve thought about having a different short bio for use in printed programs at musical performances.
Nicole says it’s too weird. She may be right, as it might not fully encourage people to judge my music on it’s merits rather than a perception of me that they gleam from my printed statement. But it’s not self-aggrandizing and does get to the heart of certain issues. So I’m asking you, dear readers, too weird or just right?

Celeste Hutchins is a Californian abroad, testing Philip K Dick’s theory that once you become a Berkeley radical, you can never leave. She explores issues of regional identity, plays music, goes to school and has telepathic conversations with an alien satellite orbiting the earth.

Tag:

HID, Joysticks and SuperCollider

So, game controllers and joysticks and the like are called Human Interface Devices (HID). There is some HID stuff built into SuperCollider, but it seemed sort of half implemented. They let you specify things, but not do much with it. So I wrote an extension yesterday, which maybe I should submit as something official or a replacement, although I didn’t bother checking first if anybody else had already done anything. No internet access at home sucks.

To use it, download HID.sc and put it in ~/Library/Application Support/SuperCollider/Extensions. Plug in your joystick or controller. Start SuperCollider.
First, you want to know some specifications for your device, so execute:


HIDDeviceServiceExt.buildDeviceList;

  
(
HIDDeviceServiceExt.devices.do({arg dev;
  [dev.manufacturer, dev.product, dev.vendorID, dev.productID, dev.locID].postln;
  dev.elements.do({arg ele;
   [ele.type, ele.usage, ele.cookie, ele.min, ele.max].postln;
  });
});
)

I got back:

  [ , USB Joystick STD, 1539, 26742, 454033408 ]
  [ Collection, Joystick, 1, 0, 0 ]
  [ Collection, Pointer, 2, 0, 0 ]
  [ Button Input, Button #5, 3, 0, 1 ]
  [ Button Input, Button #6, 4, 0, 1 ]
  [ Button Input, Button #7, 5, 0, 1 ]
  [ Button Input, Button #8, 6, 0, 1 ]
  [ Button Input, Button #1, 7, 0, 1 ]
  [ Button Input, Button #2, 8, 0, 1 ]
  [ Button Input, Button #3, 9, 0, 1 ]
  [ Button Input, Button #4, 10, 0, 1 ]
  [ Miscellaneous Input, Hatswitch, 11, 0, 3 ]
  [ Miscellaneous Input, X-Axis, 12, 0, 127 ]
  [ Miscellaneous Input, Y-Axis, 13, 0, 127 ]
  [ Miscellaneous Input, Z-Rotation, 14, 0, 127 ]
  [ Miscellaneous Input, Slider, 15, 0, 127 ]
  [ a HIDDevice ]

Ok, so I know the name of the device and something about all the buttons and ranges it claims to have. (Some of them are lies!) So, I want to assign it to a variable. I use the name.

j = HIDDeviceServiceExt.deviceDict.at('USB Joystick STD');

Ok, I can set the action for the whole joystick to tell me what it’s doing, or I can use the cookie to set the action for each individual element. I want to print the results. In either case, the action would look like:

x.action = { arg value, cookie, vendorID, productID, locID, val;
 [ value, cookie, vendorID, productID, locID, val].postln;
};

You need to queue the device and start the polling loop before the action will execute.

HIDDeviceServiceExt.queueDeviceByName('USB Joystick STD');
HIDDeviceServiceExt.runEventLoop;

It will start printing a bunch of stuff as you move the controls. When you want it to stop, you can stop the loop.

 HIDDeviceServiceExt.stopEventLoop; 

Ok, so what is all that data. The first is the output of the device scaled to be between 0-1 according to the min and max range it reported by the specification. The next is very important. It’s the cookie. The cookie is the ID number for each element. You can use that to figure out which button and widget is which. Once you know this information, you can come up with an IdentityDictionary to refer to every element by a name that you want. Mine looks like:

  j.deviceSpec = IdentityDictionary[
   // buttons
   a->7, left->9, right->10, down->8, hat->11,
   // stick
   x->12, y->13,
   wheel->14,
   throttle->15
  ]; 

The last argument in our action function was the raw data actually produced by the device. You can use all your printed data to figure out actual ranges of highs and lows, or you can set the action to an empty function and then restart the loop. Push each control as far in every direction that it will go. Then stop the loop. Each element will recall the minimum and maximum numbers actually recorded.

(
j.elements.do({arg ele;
   [ele.type, ele.usage, ele.cookie, ele.min, ele.max, ele.minFound, ele.maxFound].postln;
  });
)

This gives us back a table like the one we saw earlier but with two more numbers, the actual min and the actual max. This should improve scaling quite a bit, if you set the elements min and max to those values.   ele.min = ele.minFound;   Speaking of scaling, there are times when you want non-linear or within a different range, so you can set a ControlSpec for every element. Using my identity dictionary:

j.get(throttle).spec = ControlSpec(-1, 1, step: 0, default: 0);

Every element can have an action, as can the device as a whole and the HIDService as a whole. You can also create HIDElementGroup ‘s which contain one or more elements and have an action. For example, you could have an action specific for buttons. (Note that if you have an action for an individual button, one for a button group and one for the device, three actions will be evaluated when push the button.) Currently, an element can only belong to one group, although that might change if somebody gives me a good reason.
This is a lot of stuff to configure, so luckily HIDDeviceExt has a config method that looks a lot like make in the conductor class. HIDDeviceExt.config takes a function as an argument. The function you write has as many arguments as you want. The first refers to the HIDDeviceExt that you are configuring. The subsequent ones refer to HIDElementGroup ‘s. The HIDDeviceExt will create the groups for you and you can manipulate them in your function. You can also set min and max ranges for an entire group and apply a ControlSpec to an entire group. My config is below.

 j.config ({arg thisHID, simpleButtons, buttons, stick;
  
  thisHID.deviceSpec = IdentityDictionary[
   // buttons
   a->7, left->9, right->10, down->8, hat->11,
   // stick
   x->12, y->13,
   wheel->14,
   throttle->15
  ]; 
  
  
  simpleButtons.add(thisHID.get(a));
  simpleButtons.add(thisHID.get(left));
  simpleButtons.add(thisHID.get(right));
  simpleButtons.add(thisHID.get(down));
  
  buttons.add(simpleButtons);
  buttons.add(thisHID.get(hat));
  
  stick.add(thisHID.get(x));
  stick.add(thisHID.get(y));
  
  // make sure each element is only lsted once in the nodes list, or else it
  // will run it's action once for each time a value arrives for it
  
  thisHID.nodes = [ buttons, stick, thisHID.get(wheel), thisHID.get(throttle)];
  
  // When I was testing my joystick, I noticed that it lied a bit about ranges
  
  thisHID.get(hat).min = -1;  // it gives back -12 for center, but -1 is close enough
  
  // none of the analog inputs ever went below 60
  
  
  thisHID.get(wheel).min = 60;
  thisHID.get(throttle).min = 60;
  // can set all stick elements at once
  stick.min = 60;
      
  // ok, now set some ControlSpecs
  
  thisHID.get(hat).spec = ControlSpec(0, 4, setp:1, default: 0);
  // set all binary buttons at once
  simpleButtons.spec = ControlSpec(0, 1, step: 1, default: 1);
  
  // all stick elements at once
  stick.spec = ControlSpec(-1, 1, step: 0, default: 0);
  thisHID.get(wheel).spec = ControlSpec(-1, 1, step: 0, default: 0);
  thisHID.get(throttle).spec = ControlSpec(-1, 1, step: 0, default: 0);
  
  thisHID.action = {arg value, cookie, vendorID, productID, locID, val;
  
   [value, cookie, vendorID, productID, locID, val].postln;
  };
   
 });

I wrote all of this yesterday, so this is very demo/pre-release. If something doesn’t work, let me know and I’ll fix it. If people have interest, I’ll post better versions in the future.
Tags: , ,

Concert Announcement

8 Oktober: Over tekst en muziek – Kader Abdolah

Kader Abdolah – lezing over de relatie tussen tekst en muziek
Han Buhrs – zang, live elektronica
Joseph Bowie – trombone, zang, live elektronica
Luc Houtkamp – computer, saxofoon
Guy Harries – computer, zang
Celeste Hutchins – compositie, computer
Kader Abdolah, Nederlands schrijver van Iraanse afkomst, zal een lezing houden over de synthese tussen poëzie en muziek in de Perzische cultuur. Abdolah heeft met het POW Ensemble een voorstelling gemaakt voor het Crossing Border festival 2005, waarin de gedichten van de Perzische dichter Jalaluddin Rumi een centrale rol innemen. Bij het werkproces aan dat project is het ons opgevallen hoe nauw muziek en poëzie in de Perzische cultuur samen vallen. Kader Abdolah heeft over dit gegeven veel te vertellen.
De relatie tussen tekst en muziek is een onderwerp dat het POW Ensemble ten zeerste bezighoudt. Het ensemble legt de verbinding tussen beiden op een eigentijdse manier door gebruik te maken van computers. Op dit concert zullen we laten horen wat de mogelijkheden van deze werkwijze zijn.
Daarnaast zal de Amerikaanse componiste Celeste Hutchins haar composities Meditations pour les Femmes en Faux-bourdon Bleu te gehore brengen.

Plaats: Galerie <TAG>, Stille Veerkade 19, tel. 070-3468500 Aanvang: 16:00 uur (deuren open om 15:30)
Toegang 5 euro (studenten 2,50 euro) Passe partout voor 4 concerten: 15 euro

Which is to say that I’ll be playing 2 pieces in a larger concert on October 8 at 4:00 PM at Galerie <TAG>, Stille Veerkade 19, The Hague. Tel. 070-3468500. Price is 5€ or 2.50€ for students. If you want to go to the whole series (you missed the first one (ack, I forgot the first one)), it’s 15€.
Tags: ,

Heh heh. She said “Joystick”

Is it me, or is everything about game devices loaded with innuendo? “Joy stick?” I mean, really. I went out yesterday and attempted to purchase one called the “thrust master.” Sublimation much?
No, I have not discovered the joys of gaming. (Well, I briefly became interested in a Soduku widget, but it got old fast. Closely related to minesweeper but without the smiley face or the implied violence. bah.) If I gamed, I would not do anything else. It’s difficult for me to compartmentalize.
Anyway, I found a bargain joystick with 2 degrees of A->D conversion for the stick and another degree for the throttle. I have plans to use it with my tuba (or, rather, my formerly bubblewrapped sousaphone). If the stick proves too awkward / stupid, then different variable resistors, such as ribbons can be put in place of where the stick went.
Right now, though, I am giggling like a middle schooler at game device terminology. If I remove the plastic of the handle and replace it with a cyberskin packer, would this be over-the-top for performance? What if it was crotch-mounted?
(For those of you wondering what a “cyberskin packer” is: It’s a limp, squishy prosthetic penis that one might use for stuffing their trousers. These are used by Drag Kings, FTMs, cisgender males with injuries, and people who know how to get a party started. And very serious gamers, of course.)
Tag:

Weekend Trips not to Take

#1

Leave The Hague at 12:30 PM, Drive to Paris. Eat. Sleep. Carry all belongings down 3 flights of stairs. Drive back to The Hague. Leave girlfriend and all belongings at a gas station. Carry all belongings the few blocks from the gas station, through the pedestrian area, to apartment. Move all belongings up steepest flights of stairs ever. Wonder why knee hurts.

#2

Cut Friday classes. Go to train station. Take train to airport. Get on plane. Fly to San Francisco. Borrow Car. Drive to Santa Cruz. Eat. Get drunk. Go dancing. (awake for 26 hours!) Collapse. Awake. Eat. Get lost trying to find beach. Drive to Berkeley. Eat. Sleep. Drive to Santa Cruz. Watch brother get married. Eat. Drive to San Jose. Eat. Drive to Berkeley. Sleep. Try to buy tuba shipping case. Give up. Buy bubble wrap. Wrap sousaphone in bubble wrap. Get ride to airport. Fly to Amsterdam. Get on wrong train. Wander around train station of small town in Holland while carrying bubble wrapped sousaphone. Take train to The Hague. Carry bubble wrapped tuba to apartment. Fall asleep. Miss classes. Forget lab time.
This weekend, I’m thinking of going to Amsterdam to get my hair cut.
Um, anyway, my brother got married and I came back for it and went to the Bachelorette party (my first and last, I think). And I now have the worst tuba in Holland, I think. I didn’t worry about breaking it because who could tell. It sounds like a wounded cow. I want to use it to work out how to do some stuff which I will later do with a real tuba.
My stomach still hurts from the antibiotics that I took in July. This is ridiculous. I go offline to find a medical person to whine to.
Tags: ,

From Talk Like a Pirate Day

The Queen

Yesterday, there was some big queen-related festival. I speak not of the makes of Bohemian Rhapsody, but rather the head of state of The Netherlands. It’s a constitutional monarchy, so she actually wields power.
The capital of the country is Amsterdam. It says so in the constitution. But The Hague is the seat of government. That means that all the government buildings and meetings are in The Hague. It’s where the queen lives and where parliament meets. It’s as if the constitution of the United States listed New York City as the country’s capital, but all the government stuff was still in DC. Except for the museums. Anyway.
So yesterday was a sort of State of the Union kind of thing, where there is a procession from the queen’s residence (a palace?) to the parliament and then she addresses them and lays out her legislative agenda. She rides in a royal carriage. There were bands (and sousaphones) galore, people in uniforms on horseback. A gold-festooned carriage. A festival-like atmosphere filled the city center. I did not have a school holiday, but many elementary schools clearly did.
I thought it would be remis of me (thinking only of you, dear readers) if I didn’t at least try to get a glimpse of the queen. Alas, I was standing in the crowd on the wrong side of the palace-y thing. I saw her carriage, but only from a rather far distance. I was on my way to see her get into the parliament, but it was jammed with people. I did, however, see an image of her doing a very queenly wave on a TV screen. Which is almost like being right there.

Royal Spatialization

There was a lot of music associated with the festivities. Including the aforementioned marching bands (and sousaphones!) but also calliopes. These were quite involved, featuring female figures on the front who actually beat bells. Inside, were pipes and percussion. Several years ago, I saw a MIDI controlled calliope for sale on EBay. Next time I see one, I will not hesitate. Anyway.
I was walking home from school in the evening and heard more band music. I love a march, so I walked over to the source to see what was going on. In the square in the center of town, there were a bunch of bleachers set up. All full of people. The described a large square area where the marching bands were performing field shows.
A field show is that thing that marching bands do where they go out on a field of some kind and march in patterns. In the US, this is most often done at (American) football games during the halftime break. It is also sometimes sighted at competitions. The competitive aspect is strong. I’ve never heard of people just doing it for fun without competition somehow involved. And yet, here in The Hague, bands are marching around, playing marches and settings of pop songs and making formations. There were a couple of high school bands, but the others were all adults. Gray haired trumpet players.
Perhaps in honor of Talk Like a Pirate Day, one of the bands had pirate flags on it’s drums and did a show called legend of the seas. All in all, everybody looked like they were having more fun than I recall from my field show days. I got information about The Hague’s marching band Victory. They all had matching sousaphones, all in much better shape than mine. I’ve failed to locate a tuba shipping case and I could really do with a playable instrument.
A year or so ago, I did some marching with the Wesleyan Pep Band for a half time show put together by Neely Bruce. He, like Charles Ives, saw marching bands as a great way to do spatialization. I was reminded of this as the different instruments moved around and faced different parts of the Plein. People doing wavefront synthesis (a spatilization technique) talk about how everybody sitting in a different place will hear a different concert. This is true, but it’s also true for field shows. If the trombones are marching closer and closer to you and the saxophones are further away, you’re going to hear something different (obviously) then the people who have advancing saxes and retreating bones. The wave patterns you get from moving band instruments is way more complicated. Is anybody besides Neely working now to exploit this?
19th century technology still has something to say. yarr avast.Tags: ,

Yesterday

Back from France. I miss it and I miss living in the 10th arrondissement and walking to get cheese from the fromagerie and baguettes from the boulanger and produce from the little vegetable market around the corner. It had it’s stresses, certainly, but man, the food was better.
Nicole has learned how to roll a joint! huzzah!
Today, in class, we listed to All the Rage by Bob Ostertag (he has some free downloads on his website, you should look for this piece, in case it’s available). The recording we listened to was the Kronos Quartet playing with a tape that consisted of a guy talking about being called “queer,” getting gay bashed, his friends dying of AIDS and internalized homophobia. Intermingled with that were sounds from a riot. I asked the teacher if he knew if it was the White Night riot (I know KPFA recorded it) or Stonewall or something else, but he didn’t know. The piece is extremely powerful. It’s the sort of thing that you have to give your full attention to and then you spend the rest of the day and some of the next day thinking about it.
So after the student concert this afternoon, I was thinking about it and walking by the train station on the way home. A guy paused from rolling his joint to spare change me in Dutch. I said “sorry” (conveniently, a word in both languages) and a short guy next to him took it up again in English. I said sorry again, but he persisted and merged into sexual harassment. “Have you ever been with a man?” he asked. “You should try it at least once.” Gee, thanks for your offer, but no. Yeah, not exactly friendly when somebody is shouting it across the (bike) parking lot at you.
The Ostertag piece starts with (quoted from memory) “I remember the first time I heard somebody say ‘queer’ and knew they meant me.”
Yeah, French folks thought I was kind of weird and they got that across subtly, but I was in a little bubble of foreignness. I was the eccentric anglophone. Clearly not French. Old ladies gave me mildly disapproving looks on the metro once in a while. Men did not give me the eye. At all. Ever. I was more or less outside of the male gaze for a year. Nobody called me queer. Nobody laughed at me (except for my terrible language skills). Nobody refused to sell me clothes. The bathrooms were more or less gender neutral and the dressing rooms at clothing stores were explicitly gender neutral.
The Hague is a lot like home in some ways. I feel unfriendly male laughter following me around here. FWIW, this not coming from people who ‘look’ Dutch, but from people who might be other immigrants. I would type more about this, but Nicole’s joint rolling skills are starting to effect my typing.
Tags: ,