This blog is usually a log of new features etc. in agileBase and there’s plenty that I need to get round to writing about in that area. However, with this post I’ll take the opportunity to briefly write about a little personal project.

Data visualisation is a big topic at the moment – with WebGL allowing impressive 3D visuals in the browser, libraries, toolkits and importantly thinking evolving to make data browsing a friendly and productive experience.

As a musician though, I’ve long wondered what can be done in the field of ‘audiolisation’ – turning data into sound. There seems to be very little work in this area. For business use visualisation obviously allows a large amount of data to be taken in very quickly, but as an interesting concept audiolisation (my word) surely has it’s place.

Finally I’ve got round to trying out an idea – the first stab if you like and some code is up on the web. The basic premise is to use the letters in any text source to define notes. Rather than simply give each letter a note of the scale and cycle them round, I used the overtone series. As this is the basis of all music, the hope is that the results will be a bit more harmonious to the ear, although the goal is not to produce music, just interesting sound.

So

A = the root note
B = first overtone, double the frequency, one octave above
C = triple the frequency, an octave plus a fifth above the root
D = x4 frequency, two octaves up
E = x5, two octaves plus a third
etc.

Notes that go into higher octaves are normalised down to fit in a reasonable range and ensure there are intermediate notes in the lower octaves. Spaces are rests and punctuation can affect tempo.

There’s a lot more work to be done – in particular, it would be interesting to use pure sine waves rather than a MIDI piano sound, controlling volume and other things as well as pitch and speed. However, here are some preliminary examples. Try and follow along as they play!

Play sonnet sound file

Happy ye leaves! whenas those lily hands,
Which hold my life in their dead doing might,
Shall handle you, and hold in love’s soft bands,
Like captives trembling at the victor’s sight.
And happy lines on which, with starry light,
Those lamping eyes will deign sometimes to look,
And read the sorrows of my dying sprite,
Written with tears in heart’s close bleeding book.
And happy rhymes! bathed in the sacred brook
Of Helicon, whence she derived is,
When ye behold that angel’s blessed look,
My soul’s long lacked food, my heaven’s bliss.
Leaves, lines, and rhymes seek her to please alone,
Whom if ye please, I care for other none.

Play stack trace (server crash log) Рthis is quite a nice one Рit starts out sounding like jangly noise but your ear gradually starts to detect repeating patterns.

– Stack trace:
com.gtwm.pb.model.manageSchema.ReportCalcFieldDefn.setCalculationSQL(Unknown Source)
com.gtwm.pb.model.manageSchema.ReportCalcFieldDefn.<init>(Unknown Source)
com.gtwm.pb.servlets.ServletSchemaMethods.addCalculationToReport(Unknown Source)
com.gtwm.pb.servlets.AppController.carryOutAppActions(Unknown Source)
com.gtwm.pb.servlets.AppController.handleRequest(Unknown Source)
org.apache.velocity.tools.view.VelocityViewServlet.doRequest(VelocityViewServlet.java:217)
org.apache.velocity.tools.view.VelocityViewServlet.doPost(VelocityViewServlet.java:192)
javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:157)
net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:131)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:581)
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
– Stack trace:
com.gtwm.pb.servlets.ServletSchemaMethods.addCalculationToReport(Unknown Source)
com.gtwm.pb.servlets.AppController.carryOutAppActions(Unknown Source)
com.gtwm.pb.servlets.AppController.handleRequest(Unknown Source)
org.apache.velocity.tools.view.VelocityViewServlet.doRequest(VelocityViewServlet.java:217)
org.apache.velocity.tools.view.VelocityViewServlet.doPost(VelocityViewServlet.java:192)
javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:157)
net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:131)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:581)
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)

Play kernel log file

Mar 18 10:42:18 smedia001 kernel[0]: vmnet: bridge-en1: filter detached
Mar 18 10:42:18 smedia001 kernel[0]: vmnet: bridge-en1: down
Mar 18 10:42:18 smedia001 kernel[0]: vmnet: bridge-en1: detached
Mar 18 10:42:18 smedia001 kernel[0]: vmnet: Freeing hub at 0xffffff806535b000.
Mar 18 10:42:23 smedia001 kernel[0]: MacAuthEvent en1 Auth result for: 00:18:84:40:03:a1 MAC AUTH succeeded
Mar 18 10:42:23 smedia001 kernel[0]: wlEvent: en1 en1 Link UP
Mar 18 10:42:23 smedia001 kernel[0]: AirPort: Link Up on en1
Mar 18 10:42:23 smedia001 kernel[0]: en1: BSSID changed to 00:18:84:40:03:a1
Mar 18 10:42:26 smedia001 kernel[0]: vmnet: VNetUserIf_Create: created userIf at 0xffffff8015dd8e00.
Mar 18 10:42:26 smedia001 kernel[0]: vmnet: VMNetConnect: returning port 0xffffff8015dd8e00
Mar 18 10:42:26 smedia001 kernel[0]: vmnet: Hub 0 does not exist, allocating memory.
Mar 18 10:42:26 smedia001 kernel[0]: vmnet: Allocated hub 0xffffff80654f8000 for hubNum 0.
Mar 18 10:42:26 smedia001 kernel[0]: vmnet: Setting peer info for hub: 0, port: 0, rcv: TRUE, flags: 64
Mar 18 10:42:26 smedia001 kernel[0]: vmnet: VMNET_SO_BINDTOHUB: port: paddr 00:50:56:f5:58:f1
Mar 18 10:42:26 smedia001 kernel[0]: vmnet: Hub 0
Mar 18 10:42:26 smedia001 kernel[0]: vmnet: Port 0
Mar 18 10:42:26 smedia001 kernel[0]: vmnet: bridge-en1: media 80 dev 0xffffff800ba950f8 family 2
Mar 18 10:42:26 smedia001 kernel[0]: vmnet: bridge-en1: wireless interface detected.
Mar 18 10:42:26 smedia001 kernel[0]: vmnet: bridge-en1: up
Mar 18 10:42:26 smedia001 kernel[0]: vmnet: bridge-en1: attached
Mar 18 10:42:26 smedia001 kernel[0]: vmnet: Invalidating peer info for hub: 0, port: 0
Mar 18 10:42:26 smedia001 kernel[0]: vmnet: VNetUserIfFree: freeing userIf at 0xffffff8015dd8e00.
Mar 18 10:42:50 smedia001 kernel[0]: nspace-handler-set-snapshot-time: 1332067371

Play part of one of the agileBase log tables

18/03/2012 21:44:24.66 | Think Drinks | john | xuripvmwnap5qar3x | | 2226815
18/03/2012 21:44:21.821 | Think Drinks | john | xuripvmwnap5qar3x | | 2226814
18/03/2012 21:44:20.206 | Think Drinks | john | xuripvmwnap5qar3x | | 2226813
18/03/2012 21:44:18.595 | Think Drinks | john | xuripvmwnap5qar3x | | 2226812
18/03/2012 21:42:55.155 | Castell Howell | philg | zo3gdl1g00zdxmwax | Session filters = {Code=fff021} | 2226811
18/03/2012 21:42:55.038 | Castell Howell | philg | zo3gdl1g00zdxmwax | Session filters = {Code=fff02} | 2226810
18/03/2012 21:42:54.828 | Castell Howell | philg | zo3gdl1g00zdxmwax | Session filters = {Code=fff0} | 2226809
18/03/2012 21:42:54.486 | Castell Howell | philg | zo3gdl1g00zdxmwax | Session filters = {Code=fff} | 2226808
18/03/2012 21:42:54.191 | Castell Howell | philg | zo3gdl1g00zdxmwax | Session filters = {Code=f} | 2226807
18/03/2012 21:42:51.182 | Castell Howell | philg | zo3gdl1g00zdxmwax | | 2226806

In the long run, it might be nice to have the server logs streaming to a hifi in the background as we work (if the sound can be made pleasant enough). You should be able to pick out events by ear after a while, such as ‘Ah, John’s just logged in’, ‘lots of people are looking at the website’ or even ‘someone’s having a problem with the application, sounds like they’re trying to look at a report they haven’t got permissions to view’! Roll on…

Advertisements