source code 03-23-2009

Source code for io 0.0.1 beta (rev. March 23rd 2009) [86kB zip file]. Significant revisions since 07-03-2004 as detailed below.

io:io_config

 MOD: HeP 11-09-08 Make io_min_pulse and io_max_pulse dependent on
                   io_rtc_rate.
 MOD: HeP 03-22-09 Setting of rtc.rate! and time-advance moved to io_glob.

io:io_glob

 MOD: HeP 03-22-09 Setting of rtc.rate! and time-advance moved from
                   io_config.
                   Add (MODIFY.TIME.ADVANCE) called by the meta-alert-matrix.
                   See: io_matrix.

io:modules:io_interp_table

 MOD: HeP 10-26-08 Add the io_interp_table component.
 MOD: HeP 11-04-08 Make the pitch tables 4 bytes wide because they need
                   to contain signed data.
 MOD: HeP 11-05-08 Provisional test of the table lookup version of hp->midi
                   suggests that it is almost twice as fast as the old
                   version (12725 msec for 10,000,000 conversions in
                   comparison to 20413 msec).
 MOD: HeP 11-06-08 Use !BYTES.
 MOD: HeP 11-07-08 hp_ conversion words (e.g. HP->MIDI ) now reside in
                   io:mobules:io_interp_table.
 MOD: HeP 11-08-08 Add words to be called from io_matrix.
 MOD: HeP 11-09-08 Add tables for output pulse generator.
                   Initial (klugy) version of the exponential curve.

io:modules:io_interp

 MOD: HeP 11-05-08 Provisional test of the table lookup version of hp->midi
                   (see io:modules:io_interp_table for more details).
 MOD: HeP 11-07-08 hp_ conversion words (e.g. HP->MIDI ) now reside in
                   io:mobules:io_interp_table.
 MOD: HeP 03-22-09 Add (MODIFY.INTERP) stub called by the meta-alert-matrix.
                   See: io_matrix.

io:modules:io_patches

 MOD: HeP 04-26-06 Slightly broaden out the note ranges of the vl patches.
 MOD: HeP 11-09-08 Reduce to two vl patches: ob.vl.patch Floboe and SoprSax!
 MOD: HeP 03-19-09 Double the those vl patches with variant damping and
                   absorption. Note that vales of 0 seem to cause problems.
                   (Based on experiements with Bruce Coates.)

io:io_matrix

 MOD: HeP 11-08-08 Call words to alter the conversion of hp_ coordinates to
                   midi. See the file modules:io_interp_table for more info.
 MOD: HeP 03-21-09 Add meta-alert-matrix.

io:io_input

 MOD: HeP 03-20-09 Add meta-blyzer. We have an alert for alerts. ToDo: Need
                   someway of triggering changes of patch, interp-tables and
                   time-advance values from this.
 MOD: HeP 03-21-09 See: io_matrix for details on what the meta-blyzer
                   triggers.

io:io_output

 MOD: HeP 11-09-08 Use table lookup to derive new pulse and pulse groupings.
 MOD: HeP 03-21-09 Add (MODIFY.PATCH) called by the meta-alert-matrix. See:
                   io_matrix.
Posted in construction, software | Tagged , , , , | Comments closed

beta test 12-08-08: audio recordings

I will be returning with more detailed reports shortly, but, in the meantime, here is the (not yet annotated) audio documentation of the io++ beta test with Bruce Coates on December 8th 2008.

beta test 12-08-08_00 [mp3″]

beta test 12-08-08_01 [mp3″]

beta test 12-08-08_02 [mp3″]

beta test 12-08-08_03 [mp3″]

beta test 12-08-08_04 [mp3″]

beta test 12-08-08_05 [mp3″]

beta test 12-08-08_06 [mp3″]

beta test 12-08-08_07 [mp3″]

Performers are io 0.0.1 beta++ (itself), Bruce Coates (saxophone) and Han-earl Park (guitar).

Thanks to the Arts Council of Ireland for supporting this project, to the UCC Department of Music for providing a space in which to carry out this work, and to Bruce for his time and labor in support of this project.

io001b.com

Posted in audio recordings, beta test, construction, hardware, performance, software | Tagged , , , , , , , , , , , , | Comments closed

beta test 11-10-08: preamble

frankenmusic(s)

Almost eight years ago, when io-to-be was a bunch of discorporate code fragments, Sara Roberts remarked that the enterprise of constructing a machine improvisers wasn’t so much megalomanic as Frankensteinian.

Fifteen days ago, during the break between beta test sessions, Franziska Schroeder asked a pithy question that cut to the core of this enterprise: what do I hope to achieve? My answer surprised me even as it reminded me of Sara’s observation: my goal with io (and io++) is to encapsulate my take on improvisation—its mechanisms, its sociality, its significance. As I’ve written elsewhere,

improvisation is performance; it is an act; it is something you do. In order to make an artifact behave analogously to an improviser, I need to ascertain what might pass for, or what might function in the place of, improvisation. To venture into the construction of an improviser is to ask what is improvisation.

I’d anticipated that consulting with other improvisers with different backgrounds, practices and histories would be helpful to this construction, but I hadn’t guessed that it would bring into relief issues that lie at the kernel of this enterprise.

the techno-musical is political? personal?

This is the first time I’ve embodied the role of (techno-musical) project leader. That’s a problematic enough… but the interrogation and problematization of the technical construction was an interrogation and problematization of Han the constructor, improviser and, for lack of better word, theorist.

As I’ve stated elsewhere, I am reminded that this exploding—this interrogation and problematization—is how improvisers evolve, and the conditions under which practices and approaches mutate.

the machine that once could

In a sense io is stuck as a un-mutant improviser. It encapsulates what I though of improvisation seven years ago. Fine then; not now.

In my report to the Arts Council I wrote that

in exploring improvisation… and in the collision with other approaches and sensibilities, I have learned that this enterprise is ever-evolving as it adapts to new situations and contexts.

Although, io 0.0.1 beta++ as a funded project has a (bureaucratically necessary) end, perhaps it, as an entity, and as a focal point of practice and performance, is—road movie-like—a much more open ended enterprise.

Posted in beta test, construction, theory | Tagged , , , , , , , | Comments closed

io + I met

On the 10th of November 2008 I had the great pleasure to meet io.
She seemed a rather calm, clandestine creature, not saying much… not moving much, in fact not engaging with me much at all. However, she appeared to be a ‘saxophonistic’ persona – shiny, slightly shimmering in the sunlit surroundings.

But who is io? What does she sound like? How would she react to me? Would she respond? Would she challenge me (musically, that is). In other words, would she adopt sensitively to changes, make creative contributions and develop musical ideas suggested by me?

All sorts of questions went through my head before I even had played a note.
I was not told much about io in advance, in order to engage with her without any preconceptions.

I played and I listened…. io’s steady, breathy and rather regular sighs reminded me of a machinic engagement I had in 2000 when working on a piece entitled “Aquas Liberas”. That piece was based on recordings made in the Águas Livres Aqueduct, in Lisbon/Portugal. I had visited several machine rooms where water was pumped across pipes and the breathy machinic air sounds from the Lisbon site were reminiscent of io’s, at times, dis-engaged, de-contextualised replies.

I stopped. We talked. I played again and listened. I had found out a bit more about io and the next time I tried to ‘please’ her. I tried to soothe her into a calm, less hasty, more spacious musical dialogue. We engaged a little better.

I stopped. We talked. I played again. I wanted her to listen. This time she would need to be ‘with’ me. If the musical ideas dried up and we needed to stop she would need to listen. But she ignored me. The musical journey seemed to come to a halt (from my point of listening).
io carried on. I went along, trying to get her to conclude, to find a musical ending. io carried on. Why won’t she listen? Why won’t she acknowledge that we need to finish? io carried on. No surprises. No quest for anything new. No fresh ideas. No aspirations. No ending…

Improvisation, as George Lewis notes, shall become “not so much a practice, but an aspiration toward freedom…” …

with io there is not yet in sight this “dangerous hybrid formed by agency and indeterminacy whose ultimate outcome is a continuous transformation of both Other and Self” (Lewis, 2007:Parallax, p.120).

io, we will meet again. I will transform you. You will transform me. Maybe.


Posted in beta test, performance, theory | Tagged , , , , , , | Comments closed

beta test 11-10-08: audio recordings

I will be returning with more detailed reports within the coming days, but, in the meantime, here is the audio documentation of the io++ beta test with Franziska Schroeder on November 10th 2008.

beta test 11-10-08_00 [mp3″]

beta test 11-10-08_01 [mp3″]

beta test 11-10-08_02 [mp3″]

beta test 11-10-08_03 [mp3″]

beta test 11-10-08_04 [mp3″]

beta test 11-10-08_05 [mp3″]

Performers are io 0.0.1 beta++ (itself), Franziska Schroeder (saxophone) and Han-earl Park (guitar).

Thanks again to the Arts Council of Ireland for supporting this project, to the UCC Department of Music for providing a space in which to carry out this work, and to Franziska for lending her time and expertise to this enterprise.

Posted in audio recordings, beta test, construction, hardware, performance, schedule, software, theory, website | Tagged , , , , , , , , , , , , | Comments closed

hp->midi initial test

Proof of concept of the table lookup version of the hp->midi, hp->pan and hp->cent words.

hp->midi test 11-08-08_00 [mp3″]

linear-table  ctrl-table !
linear-table  pan-table !

linear-1200-cent-table  cent-table !

hp->midi test 11-08-08_01 [mp3″]

scurve-table  ctrl-table !
scurve-table  pan-table !

linear-1200-cent-table  cent-table !

hp->midi test 11-08-08_02 [mp3″]

scurve-table  ctrl-table !
scurve-table  pan-table !

scurve-1200-cent-table  cent-table !

Notes: The ctrl-table variable holds the address to the table used for the MIDI controllers except pan; pan-table, for pan control; and cent-table, for the pitch output.

linear-table and scurve-1200-cent-table are linear functions, and scurve-table and scurve-1200-cent-table are sigmoid curves. Tables with the infix -1200-cent- have a range of one octave.

Posted in audio recordings, construction, software | Tagged , , , , , , | Comments closed

hp->midi early report

One area in which I’ve been concerned with the question of optimization vs. elegance is in the hp->midi word (a ‘word’ is Forth parlance for function / procedure / subroutine). This word takes the hp_ values (with a range of -hp_range/2 to hp_range/2), which io’s cognitive innards generate, and translates them into legal MIDI control values (0–127). hp->midi is called hundreds of times a second by io 0.0.1 beta (and perhaps will be called a greater number in io 0.0.1 beta++) so, if it hogs the system, the system may slow down unacceptably. (This was one of the words that I hand optimized when moving to floating point calculations of the hp_ coordinates.)

One of the changes I want to introduce in the move from io 0.0.1 beta to io 0.0.1 beta++ is a greater variability in its output character. A simple way to achieve this without changing the generative process at io’s core is to introduce different ways of deriving MIDI from the hp_ values. (I’ll write on this in more details in a future post.)

I’ve rewritten hp->midi to carry this out, and a quick (and very rough) benchmark suggests that, contrary to my initial fears, the new word is almost twice as fast as the old. Using the new version of hp->midi, the following code

0  hp->midi  drop

took about 0.00127 milliseconds to execute, while using the new version, it takes about 0.00204 milliseconds.

Now you don’t get something for nothing and in this case the speed increase is offset by the time it takes for io++ to initialize (lots of slow floating point calculations), and greater memory usage. Basically, instead of doing these calculations on the fly as the old word did, io++ creates lookup tables during initialization. Thus hp->midi no longer calculates the MIDI values, but instead is a lookup routine, finding the corresponding value in an array with hp_range bytes.

More on this in the coming days…

(Incidentally, hp_ is short for Henri Poincaré, and if you’re curious why, then you might find clues in my LEA article.)

Posted in construction, software | Tagged , , , , , , | Comments closed

beta test 11-10-08 with Franziska Schroeder

The first beta test (which, in some respects, is more of an alpha test) is scheduled to start on Monday, November 10th 2008. Saxophonist, improviser, theorist and veteran of technological arts, Franziska Schroeder will be working with io++ (or components that will make up that machine), and we’ll see more clearly what work needs to be done.

Thanks to the Arts Council of Ireland for supporting this project, the UCC Department of Music for providing a space in which to carry out this work, and to Franziska for taking time to do this.

More documentation will be forthcoming in the coming days…

Incidentally, Franziska and I will also be performing at Stet Lab that evening. [Details…]

Posted in beta test, construction, hardware, performance, software, theory | Tagged , , , , | Comments closed

software optimization vs. elegance

When started writing what became io 0.0.1 beta in ’99, having thrown out a whole bunch of old material, I made an effort to write elegant code. This was partly because of the complexity of this project (which would end up in the region of 25,000 lines of code), but also a reaction to the tools that, as apprentice computer music artist-engineers, we’d inherited in the late ’90s which sacrificed conceptual and theoretical elegance for expediency or to the dogma of ‘ease-of-use’.

io was written in HMSL (Hierarchical Music Specification Language) which was, despite everything, a significantly more elegant (and conceptually more robust) system than many of the other interactive real-time computer music system at the time. Still, much of HMSL dates back to the second-half of the 1980s, and in order to get the system to run on extremely modest environments (say, the Mac Plus) the designers had to make many compromises. As Phil Burk later told me, one of the side effects of this was, for example, the uneasy mix of traditional Forth code and object-oriented programming.

However, when it came to writing io, if there was a conflict between elegance and speed, I would generally err on the side of elegance; attempting to write code that would be easy to maintain and extend (and I would, on occasion, rewrite some of HMSL’s core modules).

However, when I shifted io from scaled fixed point to floating point code in 2004, I ran into major obstacles. The processor (a sans-FPU 33MHz 68LC040 which I guesstimate does around 30MIPS) began to creak, and to prevent the system from falling-behind, I hand optimized code and sacrificed a degree of elegance to speed.

io 0.0.1 beta++, which may be significantly more expensive computationally than io 0.0.1 beta, will still run on this antiquated 68k machine. Thus, I’ll have to deal with many of the issues, and make some of the compromises, that Phil and the others dealt with in the late 80’s….

Posted in construction, software | Tagged , , , , , , , | Comments closed

source code 07-03-2004

For the record: source code for io 0.0.1 beta (rev. July 3rd 2004) [91kB zip file] and supporting components [198kB zip file]. Note that I have not differentiated components used by io and those that are not; I have included every file from the MyTools folder. Significant revisions since io 0.0.1 beta as detailed below.

From io:io_hp

 MOD: HeP 03-19-04 First experiments with floating point calculations.
 MOD: HeP 03-21-04 Speedup floating point code. Old floating point would drag
                   the system by 30% (35 ticks or so instead of the 26 ticks
                   set by hp_dur). New code gets us back to speed.

From io:io_input

 MOD: HeP 03-21-04 Use return stack version of CONFIGURE.BANALYZER.
                   Working version of POLY.DENSITY.FUNC using the updated
                   polyphonic parser classes. Experiment with calling these
                   during note on or off.
 MOD: HeP 03-21-04 Experiments with revised pulse.tracker.

From io:io_output

 MOD: HeP 03-23-04 Experimental changes to IO.DUR.FUNC.
 MOD: HeP 03-24-04 Players EXECUTE: ALERT-MATRIX less often (the use of
                   ob.fpgravity means that io's chaos is "smoother" and we
                   don't need that extra interest injection).
 MOD: HeP 04-09-04 Set instrument/channel volume via the PUT.VOLUME: method.
                   FADE.OUT also uses the PUT.VOLUME: method.
 MOD: HeP 04-11-04 Current reverb and pan settings are stored in variables.
                   The reverb enable/bypass is done via the instrument's
                   open function.
                   Set device id# for MIDI output.
 MOD: HeP 05-19-04 Experimental "muti-tasking" version of FADE.OUT which
                   keeps output activity alive while executing the fade.
                   See modules:io_interp.
 MOD: HeP 05-23-04 The new version of FADE.OUT (in modules:io_interp) results
                   in having to reset channel volume in IO.OUTPUT.STANDBY
                   instead of at end of IO.OUTPUT.STOP.
Posted in construction, software | Tagged , , , | Comments closed

source code: io 0.0.1 beta

For the record: source code for io 0.0.1 beta [68kB zip file].

Note that this is only the io 0.0.1 beta specific files, I haven not included the auxiliary code in this archive.

 io

 load_io
 directory assignment and load file for io.

 see the file io_top for more information.

 Code: Han-earl Park
 Copyright 2000 Buster & Friends C-ALTO Labs
 (Edinburgh, November 1996 -
 (London, August 1997 -
 (Den Haag, October 1997 -
 (Valencia, March 1999 -
 (Southampton, May 2000 -
   REV: 0.0.1 alpha (Southampton, October  2000)
   REV: 0.0.1 beta  (Southampton, November 2000)

 MOD: HeP 03/05/99 Started project afresh!
                   This version keeps most of the "intelligence" in the
                   objects, while the piece specific elements are kept to a
                   minimum. It is also a test for the "laurie" project.
 MOD: HeP 01/22/00 Trash the file io_util.
 MOD: HeP 01/26/00 Only load objects:io_patches if io_vl70m is true.
 MOD: HeP 02/07/00 Get rid of conditional compilation of the multiple
                   instrument objects -- they all get compiled now.
                   Same goes for the input parsers.
                   Rename the io:objects: directory as io:modules:
 MOD: HeP 04/09/00 Load the file myt:parser_list.
 MOD: HeP 04/16/00 Load the file myt:ctrl_interpreter.
 MOD: HeP 04/17/00 Add the modules:io_interp component.
                   Load io_config before the modules.
 MOD: HeP 04/18/00 Change load order of the major io components.
 MOD: HeP 04/19/00 Add modules:io_particle component.
 MOD: HeP 04/26/00 No longer load myt:hp_input_particle since we define an
                   equivalent class in io_particle.
                   Add modules:io_player component.
 MOD: HeP 06/01/00 modules:io_script may be loaded. See file io_screen.
 MOD: HeP 06/07/00 io_glob loads before modules.
 MOD: HeP 06/20/00 Split off io_ui from io_screen and io_input.
 MOD: HeP 10/02/00 Load file myt:ctrl_numeric+.
 REV: 0.0.1 alpha  __________________________________________________________
 MOD: HeP 11/02/00 Load the file myt:mono_parser+.
 REV: 0.0.1 beta   __________________________________________________________

assign  io:   hmsl:io

.NEED  LI

    : LI    " io:load_io"  $include ;

.THEN

 device classes

include?  task-device           myt:device
include?  task-midi_device      myt:midi_device
include?  task-interpreter      myt:interpreter
include?  task-ctrl_interpreter myt:ctrl_interpreter
include?  task-fan_out          myt:fan_out

 input components

include?  task-parser         myt:parser
include?  task-mono_parser    myt:mono_parser
include?  task-mono_parser+   myt:mono_parser+
include?  task-poly_parser    myt:poly_parser
include?  task-guitar_parser  myt:guitar_parser

include?  task-parser_list    myt:parser_list

include?  task-pulse_tracker  myt:pulse_tracker
include?  task-pulse_tracker+ myt:pulse_tracker+

include?  task-banalyzer      myt:banalyzer
include?  task-banalyzer+     myt:banalyzer+

 output components

include?  task-midi_plus     myt:midi_plus

include?  task-gm_instrument myt:gm_instrument
include?  task-gm_drumkit    myt:gm_drumkit
include?  task-gm_patch      myt:gm_patch

include?  task-vl_sysex      myt:vl_sysex
include?  task-vl_instrument myt:vl_instrument
include?  task-vl_patch      myt:vl_patch

 "henri poincare"

include?  task-hp_util            myt:hp_util
include?  task-hp_particle        myt:hp_particle
include?  task-hp_force           myt:hp_force
include?  task-hp_space           myt:hp_space
include?  task-hp_gravity         myt:hp_gravity
include?  task-hp_particle_player myt:hp_particle_player

 graphics

include?  task-graph_plus    myt:graph_plus
include?  task-gr_view       myt:gr_view
include?  task-screen+       myt:screen+
include?  task-ctrl_numeric+ myt:ctrl_numeric+

 io

include?  task-io_config   io:io_config
include?  task-io_glob     io:io_glob

include?  task-io_interp   io:modules:io_interp
include?  task-io_player   io:modules:io_player
include?  task-io_particle io:modules:io_particle
include?  task-io_space    io:modules:io_space
include?  task-io_patches  io:modules:io_patches

include?  task-io_hp       io:io_hp
include?  task-io_matrix   io:io_matrix
include?  task-io_input    io:io_input
include?  task-io_output   io:io_output

include?  task-io_ui       io:io_ui
include?  task-io_screen   io:io_screen

include?  task-io_top      io:io_top
Posted in construction, software | Tagged , , , | Comments closed

rack wiring: 8-pin mini DIN angst

Almost completed the wiring of the rack (except the patch panel foot switch connectors which I am leaving for the moment). No problem with the XLR connectors, quarter inch phones, MIDI cables, barrel connectors… then I hit a major snag with the 8-pin mini DIN panel socket for the Mac serial connector. Too small, too fragile, too many wires, too much… arghhh.

Well, I needed to rethink this, and since I don’t want to spend too much more time on it, I went and purchased a Mac serial extension cable instead. Life is far too short, and my time is better spent elsewhere.

Posted in construction, hardware | Tagged , , , , | Comments closed