<< >>
justin = { main feed , music , code , askjf , pubkey };recent comments
[ present ... 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 ... past ]
August 27, 2007
freeform jam with newtonbryan

August 21, 2007
freeform jam with brenchr

August 15, 2007
freeform jam with brenchr

August 13, 2007
freeform jam with brennan and electronic and stupidness

July 30, 2007
freeform jam with brenchr
freeform jam with newtbidermanchrarasteve

July 26, 2007
REAPER stuff

We've had a crazy month of development--things like Advanced Themes and a multiband compressor have been added, as well as persistent Undo/Redo, and support for multiple redo paths (!!! This is huge in my mind, and once we build an even better UI for it it will be even more ridiculously awesome).. The mac version is coming along, too... Anyway..

I was able to give a quick (19 minute) presentation to a bunch of people at the TechBreakfast NorCal "Mixing In The Box" seminar. It was a lot of fun and definitely got a pretty good reception, especially considering the audience was mostly Pro Tools users... Here are some videos:

Part 1, Part 2 (YouTube, what gives with the 10 minute limit per file?!)

But with all of this work getting done, I still miss our cat friend...


July 25, 2007
freeform jam with chr

July 22, 2007
freeform jam with biderman

July 21, 2007
brenchrgermliquid - 1 -- [51:18]
brenchrgermliquid - 2 -- [18:52]
brenchrgermliquid - 3 -- [84:46]

July 11, 2007
brenchr - 1 -- [23:38]
brenchr - 2 -- [60:23]
freeform jam with brenchr3drums

July 10, 2007
freeform jam with biderman

July 9, 2007
chr-covers - 1 -- [20:26]
chr-covers - 2 -- [31:33]

July 3, 2007
one more


July 2, 2007
at a loss

We miss you, sweetest Kiki.


July 1, 2007
freeform jam with newtbiderman

June 20, 2007

June 19, 2007
brenchr - 1 -- [12:25]
brenchr - 2 -- [49:19]
brenchr - 3 -- [31:43]

June 16, 2007
freeform jam with kevchrnewsetup

June 14, 2007
brenbiderman - 1 -- [51:31]
brenbiderman - 2 -- [19:56]

June 8, 2007
freeform jam with brenchrnobass

June 6, 2007
newton - 1 -- [11:05]
newton - 2 -- [10:18]
newton - 3 -- [24:33]
newton - 4 -- [24:49]

June 2, 2007
freeform jam with brenchrfrancismig

May 30, 2007
brenchr - 1 -- [7:59]
brenchr - 2 -- [107:36]

May 29, 2007
I got a guitar amp that I LOVE

For those of you dedicated bored enough to listen to our Recordings, you may have noticed that the guitar sounds we've been getting have improved dramatically.

I attribute this to my newish custom built guitar amp, from Underhill. HOLY CRAP. This thing rocks. It's just so much more fun to play than anything else I've played on. It's similar to a JCM 800 with a bunch of goodies, and something special that comes from the love of being handmade by someone who really cares. Wow! Before this I thought playing using the CrusFX with modelling was adequate! No more (anybody want to buy a CrusFX? OK I should probably keep it even though it hasn't been powered on in ages)....

Here's a little clip with some clean and then some loud in the middle: Song about Flying Cars and Unicorns.


May 27, 2007
kevin - 1 -- [39:36]
kevin - 2 -- [19:59]
kevin - 3 -- [9:42]

May 25, 2007
REAPER in Sound On Sound

Martin Walker was nice enough to review REAPER in the UK magazine Sound On Sound.. I think it's a great review and am very proud to see it. Here's a quote from the end:

    ...unless you are 100 percent happy with your current MIDI + Audio sequencer, you'd be a fool not to give REAPER a try. Don't be fooled by the tiny 2MB download: this is a powerful application that does a huge amount, is being improved on a daily basis, and already does some things better than most of the competition.

I put this quote and some others on the REAPER Reviews Page. Woo.

May 25, 2007
you care a lot about your perception when it's all you got

Today I saw a Technology Review article on eJamming, which is a service for people to jam together online. I have tried eJamming a few times, and haven't been terribly impressed (and yes I am biassed towards NINJAM for obvious reasons), but I thought I'd just pick apart what bugs me about this article (and likewise the whole situation).

    First, the eJamming software decreases the file sizes sent over the network. To do this, the company's engineers developed their own compression and decompression algorithms that shrink the file size, yet still maintain an audio quality higher than MP3, a common compression scheme, says Glueckman.
OK so shrinking the size of data does help latency, but it's not the biggest part. What bugs me here is that A) they appear to be using Speex for their audio side, which is an open format, and doesn't scale to high qualities. Do they really need to claim that they developed their own codec? OK so maybe they did develop their own codec-- why isn't this news? If it's so much better than OGG or MP3 or AAC, how come we haven't heard of this?

    Second, each musician is directly connected with the other musicians in a jam session, instead of being routed through a server. This peer-to-peer configuration "results in a lower latency by routing the audio stream directly to your jam mates rather than, on average, doubling that transport latency by directing the audio stream through a remote server," says Bill Redmann, chief technology officer of eJamming.
Wow! Connecting clients to clients! Peer to peer! This is so unique!

But what the article fails to mention here is that while this approach does reduce latency, it also increases the amount of bandwidth requires by each host exponentially. Their stuff is limited to 4 people I believe, but if you have 4 people, each client needs to send its stream to EVERYBODY else, so if they run a 50kbps channel (though it appears they're using a much lower bitrate codec anywa), that'd be 150kbps of upstream for a 4 person jam. Which isn't that bad, but it doesnt scale well and definitely requires some decent broadband.

The following quote, however, is what really bugs me:

    The company is promising to reduce the delay experienced over the network to, at most, hundreds of milliseconds (depending on upload speed and geographic distance between musicians)--a delay to which, Glueckman says, most musicians can adjust with practice.

Hundreds of milliseconds?! Are you kidding me? This is unusable. Their patented "delay monitoring of the local signal to sync with the remote" even makes it worse. I tried it with Christophe, who is on the same ISP and less than 10 miles away, and the latency was very noticeable and made it difficult to play anything remotely complex.

Imagine trying to play synchronized with someone at the other end of a football field. ugh.

Granted NINJAM's solutions aren't perfect either, but I find the increased quality and overall experience to be far superior. And the newer voice chat and session modes are damn usable.

OK OK so I didn't mean to turn this into a big eJamming vs NINJAM thing.. I just am irritated with these people being all "look we're soo innovative" and having lofty claims, yet when we use their software it's miserable (and I didn't even go into how badly constructed their application is-- application development isn't an easy thing, and in this case it definitely shows).

May 25, 2007
mac poo

I hate Xcode. Too bad I have a ton to get done using it.


May 11, 2007

I mistakenly got a laptop (Lenovo X60) that didnt have a trackpad, but had one of those eraserhead pointing devices. At first I was upset, but then I realized how much I found myself despising the trackpad anyway, so I thought I'd give it a shot.. and I think I'm pretty much OK with it now. I must say it is very nice having a fast laptop again. I really love my old Sony TR3AP, but man, that 1ghz P-M was getting weak...

May 11, 2007
NINJAM Session Mode

ReaNINJAM in REAPER now supports something new called NINJAM session mode. This lets multiple users to work on projects, and when each person plays their own, they get to hear the other peoples too. This is the perfect sort of things for people who want to collaborate on recording and arrangement remotely. It works amazingly well-- exceeding my expectations by far.

Here's a little session we did early on.

Soo much fun.

May 11, 2007

It's feeling a little too late 90s.. I keep reading these articles about startups that piss me off.

Now there are some of companies that do interesting things and stuff that impress me. SOME. So this isn't an encompassing generalization, just a large one.

I don't know what my problem with it is.. Maybe because so many companies like to say just how important they are, or will be... Which in some cases is true, or rather WOULD be true _IF_ they succeed.. which is a big if.. But nobody seems to predict that very well, except certain VCs.. but then again when you start looking at those VCs, you start questioning the causality of it.

I think my problem really comes down to the fact that I'm jealous. The people running these companies, for the most part, have something I lack-- they can focus on the thing they're doing, acting as if it is the only thing important to them, and as if it is as important as they tell their investors it is. Oh, and they're willing to have an exit strategy, which I'm very much not..

But at least I think I'm having more fun...


May 8, 2007
freeform jam with brenchr

May 4, 2007
freeform jam with newtbiderman

May 2, 2007
freeform jam with chr

April 30, 2007
freeform jam with brenchr

April 25, 2007
brenchr - 1 -- [66:44]
brenchr - 2 -- [8:23]

April 21, 2007
NINJAM has been getting some love

Been updating NINJAM, after integrating it into REAPER. The REAPER version has a much revised UI, and now supports sending stereo streams, a low latency voice chat mode, and will soon get a fancy "Session mode" that will ease long distance collaboration on projects.

Also updated the NINJAM AutoSong program and web site.. Been listening to playlists of random songs cut, and they're getting very good! I improved the program that does the cutting/mixing last week too.. Uses smarter volume detection and mixing logic, also does nice fadeouts.

Been having fun improving various aspects of REAPER that have been lacking.. The biggest one coming that's almost done is making loop selections and playback and recording sub-sample accurate. In previous versions looping was only accurate to the audio block. Soon it will be VERY accurate..


April 12, 2007
brenchr - 1 -- [36:54]
brenchr - 2 -- [20:18]
brenchr - 3 -- [41:49]

April 8, 2007
awesome (IFF).. part 2

I'm doing a little guest hosting spot at GearSlutz for the next couple weeks..


April 4, 2007
awesome, I'm f*cking famous!

I knew *SOMETHING* good would come out of DRM...

Thanks to Apple and EMI doing DRM-less tracks, we got a kind mention from Eliot Van Buskirk being interviewed on an NPR show (it's arond 18 minutes in). The mention referenced NINJAM, as well as played a clip of a song I made with my friend David Wiener, A Little Pop Will Save Us All.

OK OK I know it's just NPR, and it's just a 10 second clip, and some of the details are wrong.. but hey, IT'S FUCKING NPR. OR WAIT, IT'S FUCKING PRI.

as in prime.


March 29, 2007
freeform jam with chr

March 27, 2007
freeform jam with brenchr
chr - 1 -- [7:59]
chr - 2 -- [10:58]

March 25, 2007
freeform jam with newtbider

March 24, 2007
brennewt - 1 -- [42:17]
brennewt - 2 -- [28:26]

March 14, 2007
freeform jam with brenchr

March 11, 2007
kevbiderman - 1 -- [22:49]
kevbiderman - 2 -- [59:50]

March 3, 2007
chrnewt - 1 -- [32:06]
chrnewt - 2 -- [6:14]
chrnewt - 3 -- [12:52]

March 1, 2007
brenchr_newamp - 1 -- [68:58]
brenchr_newamp - 2 -- [67:23]

February 21, 2007
freeform jam with brenchr

February 18, 2007

February 16, 2007

February 12, 2007

Two tasty things:

this little mention of REAPER was nice to read.

And, also, I just got a dual quad core xeon machine.. 8 2.33ghz cores. Wow. Insanely powerful. Quieter than I expected, too. Mmmm. Thank you, Dell (can I have my next one for free for that plug?).

REAPER hauls complete ass on this box. Amazingly fast, and it can use nearly all of the processing power available. I did some testing on my Athlon64x2, and it could do like 12 tracks of FX (reagate+reacomp+reafir+reaverb), and this thing can do over 50. Having flawless audio playback with 8 cores humming away at 95% of each used is a beautiful beautiful thing. Here's a screenshot.

Now when you can get one of these for $1500, then it will be insane. I'm guessing late 2008.


February 7, 2007
freeform jam with brenchr

January 31, 2007
brenchr - 1 -- [64:21]
brenchr - 2 -- [22:42]
brenchr - 3 -- [32:58]

January 29, 2007
freeform jam with chrdrum2

January 28, 2007
biderchrkev - 1 -- [75:10]
biderchrkev - 2 -- [52:29]

January 25, 2007
brennewt - 1 -- [36:59]
brennewt - 2 -- [27:09]
brennewt - 3 -- [3:27]
brennewt - 4 -- [9:39]

January 23, 2007
happy new year!

OK it's a little late...

Had an annoying day not too long ago where our firewall crapped out.. so I put IPCop on an old P3 server.. IPCop is a very small linux based firewall. It works pretty well, though there are a few annoying things-- the big thing is that there's a lot of things you'd want to do, that just aren't exposed via the web interface.. so you end up having to dig through the man pages for iptables, and so forth.. if they just let you do a lot of that, then it would be outstanding.. we'll see how it fares..

REAPER got some big performance upgrades in the last month. In all of the work I had done in the past, there was a lot of code that was focused on being correct, rather than fast. There were lists that were stored in random or worse order, that were searched linearly.. oops. Keeping the list sorted such that the most used items are at the beginning, took care of a lot. Also we had some instances where we'd check to see if an item was in the list, when it would usually not be, so we'd scan the whole list... anyway, dumbness, but some simple cleanups, and *bam*, usable at 32 sample latency, lower CPU use.. woot.. Also realized that FFT(a+b) = FFT(a)+FFT(b), which enabled some huge optimizations to ReaVerb (making the impulse length less relevant, just means more complex number multiplications)..

REAPER also got a new plug-in called ReaTune, which acts as a tuner, and a pitch corrector. It's not really done yet, but it's already pretty usable, and has automatic and manual modes, and the ability to send MIDI events on pitch detection, which is badass.

I'll omit my obligitory "I wish other companies would be better about support for software that's other than the total mainstream" rant... I guess that's the whole point of REAPER, anyway.. to help change that.. we'll give it time..

Here are a few songs from new years. The second two were live, the first one not:


January 22, 2007
freeform jam with brennewt

January 14, 2007
freeform jam with craigbrenjoshdanchr

January 11, 2007
freeform jam with brenchr

January 8, 2007
freeform jam with bidersteve

January 6, 2007
brenchr - 1 -- [4:12]
brenchr - 2 -- [111:27]

January 5, 2007
chr - 1 -- [25:43]
chr - 2 -- [24:14]

December 31, 2006
kevwienercraig - 1 -- [37:45]
kevwienercraig - 2 -- [9:51]
kevwienercraig - 3 -- [34:39]
kevwienercraig - 4 -- [13:46]

December 29, 2006

December 28, 2006
freeform jam with biderman

December 27, 2006
freeform jam with brenfritz

December 26, 2006

December 20, 2006
freeform jam with fritz

December 17, 2006
freeform jam with craig

December 16, 2006
freeform jam with kevin

December 15, 2006
porting frustration

(9/10 on the boring scale)

So I just spent the last day or two (I honestly can't remember) getting Jesusonic to run on OS X/x86. I already had it running on OS X/PPC, so I figured it would be easy. Wrooong...

Jesusonic works by compiling code on the fly into native assembly. It actually does this by glueing together stubs of functions (the most critical which are written in assembly for each platform) into code that it can execute. Overall the code it generates is not terribly optimized, but it's definitely not slow either.

So this is what I found in porting JS.

1) the compiler bitched about my assembly code trashing EBX. Turns out, EBX is used for position independent code (PIC) addressing. So I figured I should probably not be messing with EBX, and that the OS needed it. With a bit of additional work on the compile side I got it to not use EBX, but in the end it turned out that EBX only really needs to be preserved within functions that use it, and for my uses I really could use it. Oh well. Time wasted, but hey kinda useful. Stuff still wasnt working right.

2) Many of the assembly stubs for particular functions needed to call C code, whether it be a C library function like pow(), or some of our own code (FFTs, file reading, accessing memory, etc). Since GCC was generating my functions as PIC, the extended assembly syntax failed to assemble (ending up with assembly like "movl ((symbolname-$LABELBLAHBLAH(%ebx))), %edi", etc. So turns out MY compile step needs to actually go generate absolute addresses at runtime, instead of at compile time. Fair enough, that took an hour or so, and a bunch of testing/fixing to make sure that nothing broke.

3) And this was the big bitch, and it took me a long time to figure out. Turns out, and this is well documented, you have to keep the stack aligned to 16 bytes. I would call pow(), and it would end up trying to do an sse load/store at an unaligned address, and things would proceed to blow up. So I had to go update all of my stubs and functions to keep the stack nicely aligned, which is probably not a bad idea anyway. Once I finally got them all correct, I tried it out, and... IT still didn't work. So I ended up spending a lot of time with GDB (Xcode's debugger won't let me see registers, argh), and figured out that, indeed, the stack was aligned when I called my generated, code, but no, the stack wasn't aligned when it got to pow().

After changing some build settings, I found that with -O0, it did in fact work. So then I did some gcc -S -O0 file.c and gcc -S -O2 file.c and compared the generated code for the assembly stubs, and it seems that with -O2, gcc itself would let the stack get unaligned , as long as my stub wasn't obviously calling another function.

I looked for a long time to see if I could disable this in gcc, and I gave up, so on OS X/x86 Jesusonic will have this code for each stub:

pushl %ebp
movl %esp, %ebp
andl $-16, %esp

(run code)


that way, whenever I call out, I can ensure that the stack is aligned, no matter what kind of crap GCC is generating for the function.

The better way of dealing with this would probably be to write these functions in assembly directly, or improve the code that cuts up the stubs to have it filter out the stack frame setup that GCC produces anyway, but hell I'm too lazy and this works and it's reasonably fast enough as it is. And most importantly, I get to get back to the fast, satisfying building of UI and porting of easy things.


December 9, 2006
mac porting...

In August I began cleaning up REAPER's source code, and began separating the platform-specific code (mostly UI) from the mostly-portable code. Ten days ago, after 3 months of doing that while also adding new features and releasing new Windows versions every few days, I began spending a great deal of time actually writing a bunch of Cocoa code so that we could have it run on OS X.

It has gone very well, expect some preview version around Christmas.

I love it when this stuff goes faster than I had expected. I'm going to detail some of my experiences here.

There's a lot to like about programming on OS X, but there's also plenty of idiocy.

CAUTION-Boring programming discussion follows. These are mostly things that I have sort of, but not completely correctly, working.

For example, if you wish to draw text, there are countless ways to do it, and at least for what I wanted to do (emulate DrawText for our GDI emulation layer), I still haven't found a way that works as I want. The first way I tried was using CGContextShowText, which worked, except the only way I could find to measure the text before, or after drawing it didn't seem to work (using CGContextSetTextDrawingMode with kCGTextClip to modify the clip path, then get the bounding rectangle of that). So without any way to measure the rendered text, I had to find another way. I could use NSAttributedString to draw, but the first problem is that I wanted to supprot drawing to an arbitrary CGContext, which may or may not be the "active" context. Then, suggested to me, was to use Carbon's HIThemeDrawTextBox etc, which isn't really documented at all (other than in the header file and some examples). HIThemeDrawTextBox works, except the font I selected using CGContextSelectFont isn't used. It appears I could use some other API to set the font, but I havent spent that much time on that. Why can't there just a be a simple, working way?! At least win32's DrawText just works (though I hear the internals are a nightmare).

OK I won't go too much more into those sort of things. The good things are some things are just easier. Anytime you want to modify the behavior of something, it's WAY easier, since you can do a simple objective C subclass, rather than having to do the tricky hacks we do in Windows. Porting the customizable keyboard code to OS X took an hour or so. Getting it to work originally on Windows took many times that.

Rendering with Quartz just looks nice, too. The plain Windows GDI calls just look harsh and cruddy in comparison.

Here's an interesting challenge: on Windows, REAPER renders its play cursor (the line that moves constantly with playback) by using XOR drawing. It renders it by flipping all of the bits in the line, then when it needs to erase the cursor (in order to draw it in the new position), it can just XOR again. Win32 makes this available by using DrawFocusRect(). Anyway, on OS X this isn't possible, to my knowledge, because the system handles so much of the drawing process. I didn't want to be responsible for updating any of our track view at 30fps+, so I had to come up with another solution. After some experimentation, I found that you could create a new NSWindow, make it a child of the main window, and move it around as the play cursor. And it works, the system handles redrawing the track view, from its cached rendered version, so it's FAST, probably hardware accelerated, and you can do neat things with the alpha channel of the cursor. The verdict: while you can't do oldschool things like XOR drawing, you can do things sexier.

So to aid porting, I've created a new part of WDL (our general reusable code library, pronounced "whittle"), called SWELL (Small Windows Emulation Layer Library or something). So far it emulates (at an API level), portions of the Windows GDI, menu API, MessageBox, ini file (GetPrivateProfileString etc), and a bit more. Eventually we'll probably BSD license SWELL, too.

One interesting thing in SWELL is a set of macros and small functions that let us paste in menu definitions from a .rc into a C++ source file and have it generate a HMENU for it. Fun use of the C preprocessor, if you ask me.

Anyway, this is all challenging, and as a result, mostly fun.

December 9, 2006
programming style and process

I previously said I was planning on writing an article on coding style etc, and while I haven't gotten around to finishing it, I'll go ahead and discuss some of it.

1) If you program, and you're working on something that you expect to be working on for more than a couple hours, use version control. The benefits are countless. Safety, yes, but also, it gives you the ability to easily see everything you've done (if you're religious about checking your code in often), and even more importantly (to me), it lets you diff and review your changes before checking in. I do this all of the time, to make sure everything I did was everything I wanted, and that I didnt fuck anything up.

2) Don't be afraid to let things get messy. A very common (and valid) sentiment in programming is to avoid "premature optimization", where the programmer spends too much time too early on some part which may or may not even need it, introducing complexity for the sake of possible speed improvements etc. I don't hear people say this much, but I think you should take the same stance on organization. If you're programming software, and you need to add some new function for some task, don't be afraid to just toss it in near where you need it, and see what happens. Don't go creating tons of new files every time you need them. Moving code around for organization later is easy, and if you don't do it too soon, you'll a) stay focused, and b) save time in the event that the code you added wasn't used. Which brings us to the next point:

3) Don't be afraid to toss out code that you've written. Sometimes you have some problem and code a solution for it, and at the end of it, you just don't like it. If you don't like it, and think you could do it better the second time, do it the second time.

4) Going back to point #2, don't obsess from the beginning about reusability. Write code that you need, and once you're using it and see how you actually need to reuse it, then go make it reusable.

5) Finally, evolve your code. Getting something to the point of limping is the hardest part, so you should try to get to it as fast as possible. Once you're there, progress is much faster. It's like waiting for a minute to pass. If you look at a clock with a seconds hand, it goes quick, but if you just stare into space, it takes forever. Get to the point where you can see progress, then enjoy it (and test your work often).

More later, perhaps...

December 9, 2006
oh, and

I added a super simple thing to prevent spam on these comments, and it has worked perfectly. We'll see how long that lasts...


December 5, 2006
brenchr - 1 -- [105:47]
brenchr - 2 -- [20:47]

November 25, 2006
freeform jam with brenjoshshawnjoncraignewt

November 20, 2006
freeform jam with brenchr

November 18, 2006

I wish I could say that this whole time was spent on vacation, but unfortunately it wasn't. We did have a fantastic time in England for our friends Jonathan (ha) and Catherine's (ha ha) wedding, but when we got back, after a few days rest, I got hit by a nasty something, so I've been out of commission this past week. I seem to be coming back to normal, finally...

It's been nearly a week (if I get through tomorrow it will be a full week) since I've had coffee. What should I do? I like coffee so much, but I often feel so at its mercy. It also pains me that one of the top coffee establishments in the city moved into our block. I can't live here and not get their delicious nectar! Can I?

A year ago today I started at full speed on REAPER. I had done about 5 hours worth of stuff a couple months before, but decided at this point last year that it was time. Whee. It keeps getting better and better. We'll have to do something special sometime, maybe around Christmas since that was the first public release.

Umm what else? I should update this more. Oh yes my coding guide, well, I may just do a little chapter at a time, cause I wrote a bunch of it and it's all pretty incoherent and wordy, so I better spread it out a lot. Maybe I'll do the first paragraph in a post soon.


November 12, 2006

November 11, 2006
freeform jam with brennewtshort

November 8, 2006
brenchrnewt - 1 -- [15:00]
brenchrnewt - 2 -- [44:46]
brenchrnewt - 3 -- [7:23]

November 7, 2006
freeform jam with kevin

October 30, 2006
the real vacation

...begins. Hand feeling a lot better, yay.

When I get back, I'll likely finish and post an article on coding style and methodology that someone convinced me to start...


[ present ... 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 ... past ]
search : rss : recent comments : Copyright © 2021 Justin Frankel