Category Archives: blather

jack

From time to time, Jack winces at the thought, “Jack of all trades, master of none.”

A love of learning keeps Jack motivated. A lot of shiny toys make it hard to hold Jack’s attention for long. Jack accrues skills over time, revisiting points of interest in an iterative fashion. Given enough time Jack should become a master in all fields, but time and progress wait for no man.

At times, the sheer amount of stuff to learn makes Jack depressed. During such times a little voice in the back of Jack’s mind whispers, “focus”. “Specialization is dangerous,” he argues, “look at the Panda bear! Look at the Cheetah! Specialization is great for short-term gains. Over the long-term, it’s detrimental.”  ”Yes”, whispers the voice, “but your life is half over. You will never be a success unless you focus on the one”. Jack resists, Jack is stubborn.

Eventually, Jack submits, “But what to focus on? How can I commit to just one thing? What if I choose to eat nothing but Bamboo and I’m faced with deforestation? What if I choose to run fast and prey can still outpace me?” The voice whispers back, “Jack of all trades, master of one.”

live drummers vs. drum machines

I hear the following statement from time to time: “Live drummers sound better than drum machines.” And I have to agree, a live drummer certainly has a feeling that isn’t easily replicated. However,  I also realize that machines will eventually outperform humans in every endeavour.

So why do live drummers currently sound better than drum machines? Is it because they’re slightly off-time? If this were true, I think a lot more people would sound like world-class drummers. Professional drummers spend countless hours training muscle memory for millisecond accuracy. Of course, nothing is perfect and professional drummers are, on occasion, slightly off. So, it wouldn’t hurt if drum machines were slightly off as well.  For example, one could using the following algorithm:

  • First, determine if a note should be slightly off-time by generating a random number between 0 and 1. If the variable is greater than a user-defined value (ie. 0.95) the note’s timing will be slightly off.
  • If the note’s timing is going to be slightly off, will it be pushed forward or back? Have another user-defined setting with three possible values:
    • Forward
    • Random
    • Back
  • How far will the note be pushed? Once again, a user-defined setting. This one defines an upper limit or the maximum distance that a note can be pushed off time without sounding bad. The sequencer will then choose a random distance between the upper bound and it’s original placement (where the user entered the note value in the first place).

I don’t think being off-time is highly desirable and has only a minor impact on imparting feel. I believe the real difference between live drummers and drum machines are frequency dynamics. For example, a number of things happen every time a live drummer taps a ride cymbal or hits a drum:

  • Change in velocity.
    • Most beginners enter all note values at 127. Only later do they discover the impact of accents and fluctuating velocities. However, adjusting velocities can be tedious work and few users take the time to really sculpt velocity nuances.
    • A drum machine could have a list of velocity templates or curves (one per pitch) that users could apply to the entire sequence. At the very least it’s a starting point for further refinement. Perhaps it’s even possible to:
      • offset a template or curve by entering a phase value, which results in a change of note accents
      • layer templates or curves and perform simple operations on them like intersection, addition, or subtraction.
    • Changes in volume are not enough. Each drum sound must be multisampled, so that a change in velocity results in a subtle change of the sound.
  • Change in physical location.
    • Hitting a drum in a different location results in a different sound. Physical modeling or multisampling can be used to accomplish this to various degrees.
  • Change in frequency.
    • A previous hit affects the current hit. For example, tapping a ride cymbal that is already vibrating is going to give you a slightly different sound.
    • Drum kit components are in constant fluctuation – causing constructive and destructive interference patterns – which provide you with a rich dynamic texture. On the other hand, most drum machines use static samples – there’s no change in sound from one hit to the next.

Again, I think frequency dynamics and subtle variations in performance are what really differentiate live drummers from drum machines. If drum machines want to compete, they need to become less rigid.

broken threads

I broke my robots arm today. How? I set him down on his belly with the power on. He was in a one arm push-up for a moment before I toggled the power off. Apparently there was enough weight on the servo to break two threads on a cog wheel. Each cog wheel is made of plastic, not metal.

I’ll be evaluating internal components for practical load requirements with my next purchase – lesson learned.

bias

Programming is a basic skill, like reading and writing. It’s something you should possess if you’re going to successfully navigate the information age. I can’t imagine living in a world of computers and not knowing how to program – it’s absurd. Programming is sheer power and with it you can implement your ideas.

To some, programming is perceived as purely technical, there’s no art to writing a program. Of course, nothing could be further from the truth. Programmers create software by designing (and implementing) architectures of interweaving patterns of abstract concepts. However, before you get to that level of skill, you first have to master the technical. And like any other discipline, be it painter or craftsman, mastery of the technical can take years before you are able to express yourself.

opengl != directx

In forums you frequently see flame wars over OpenGL vs. DirectX or C++ vs. C#. The language or API in question is irrelevant. These threads are typically started by n00bs trying to decide which one to learn. Although most of these threads are quickly shutdown, it remains a legitimate question.

API consideration is important because nobody wants to make a serious investment in time and resources pursuing a language or API that is destined for obsolescence. A common occurence in ”versus threads” is a post about how it doesn’t matter which language/API you use because you can accomplish the same result with either one. It suggests they are equal and such statements are misleading. Common functionality between languages/APIs is not equivalence.

Common functionality between a language/API isn’t suprising because both are attempting solutions for the same problem domain. Yes, both APIs can render a triangle just like two audio APIs can play a sound. Even if both APIs have equivalent functionality they would still be unequal. Why? Design. Each API approaches the problem with a different solution. Both are valid solutions and both expose their solutions to the client. However, one solution is better than the other if it has better design. In other words, how complicated is it to render a triangle or play a sound? Is it client friendly? Modular? Extensible? Flexible?

So which language/API is better? It’s up to each developer to do a quantitave and qualitattive assessment. The set of tests are determined by your goals. They’re individual, customizable, and ultimately arbitrary. Once you”ve made your decision you make a vote by using a given language/API in the development of your application. Not all votes are equal. Its strength depends on the success of your application in the marketplace and/or participation in the community.

tomes

Few programming books offer substance. Most are re-hashed documentation. They are filled with tables detailing API methods, parameters, bit flags, and so forth. It’s an exercise in tedium to wade through such material. Perhaps the marketing department demands that books be of a certain size and weight. A customer is not going to spend $40 to $100 dollars on a thin book. Every fool knows a books value is proportional to its weight.

frankenstein

C++ is an object-oriented extension to the C language – two languages in one. With template metaprogramming, you can bump that number up to three. Add managed extensions into the mix and you end up with a Frankenstein monster. C++/CLI is four languages in one. And yet, just like a pug, you can’t help but find it cute.

breakbeat

Breakbeat originated from the sampling of old funk and jazz records. The music breaks down to make room for the beat – and with the advent of sampling technology – provides a window of opportunity for capturing clean drum samples. The rhythmic structure of drumming lays the foundation for most musical genres. It’s no surprise then, that breakbeat samples have spawned several new genres of music, most notably: hip hop, jungle, and drum ‘n bass.

Jungle and drum ‘n bass are littered with two famous samples:

  • Amen
  • Funky Drummer

The Amen break is from the B-side of a single called ”Color me father” by a Soul/RnB group called The Winstons. The Funky Drummer break was originally played by Clyde Stubblefield from a James Brown record.

I implore anyone reading this, never to use these samples. I believe one of the precepts of a genre like drum ‘n bass is to explore new and interesting drum patterns; not to fatigue the user by recycling the same break with a myriad of slight alterations. The saturation point for these two breaks (and many others) was hit a long time ago. Reuse in this context, has limits.

a little programming history

I remember the first book I ever read on programming:

  • Publisher: Macmillan Digital Publishing (September, 1995)
  • ISBN: 1568302371

I was intent on programming and read this book twice. It was a little difficult to understand because I didn’t own a computer at the time. Eventually, I managed to get my hands on an Apple Macintosh 9800 and a copy of CodeWarrior. After that I quickly moved on to this book:

  • Publisher: Wiley Publishing; Book & CD edition (December 20, 1995)
  • ISBN: 1568843496

I’m not sure how many times I tried pushing my way through this book. It was very difficult because I was trying to build applications using the Mac Toolbox before I knew a programming language! I look back on myself and laugh. It was quite fun to deduce fundamental programming constructs in realtime.

on laying concrete

Substantial applications require a solid infrastructure. An infrastructure or framework dictates the organization and interaction of core components. The design of a framework and the derivative applications to follow is an expression of art.

Software is built in small incremental steps, layer upon layer. The layout and modularity of these layers or building blocks will affect every facet of development from that point on. Careful consideration must be given to laying a solid foundation. The underpinnings of your architecture can ease further development or hinder it. Think about it. The way in which you structure your application today may grind development to a halt tomorrow. It may become too costly to extend the system. Even worse, the system may become completely unusable beyond a certain point.

Unfortunately, doing things the wrong way is often the case. This is expected because the problem domain is fuzzy. As development continues the picture becomes clearer and the problem crystallizes. A well-defined problem reveals a well-defined solution. Code must constantly be refactored as new insights are brought into the fold. Charge off into the unknown. Just make sure you come back and refactor what you’ve learned into an elegant solution.