Learning Core Audio

CocoaConf Boston

I went to CocoaConf Boston this past weekend. I feel very fortunate to have been able to attend this event. I won a ticket to the conference and I had a lot of help just being able to get there.

This was a life-changing weekend for me. I spent a day doing the Core Audio workshop with Chris Adamson. This workshop was one of the first times that I got into the flow with programming.

Don’t get me wrong. I really like to code. I have just noticed over the last few years that I wasn’t getting the same “high” I was getting when I understood concepts before. I would spend a while debugging a huge project and when I got it debugged and working I never felt like “Yes! I got it to work! I am amazing!” I always just felt like, “Okay, that’s done. On to the next thing.” While the project isn’t working I feel miserable and unhappy because I didn’t get it perfect yet. I started to feel like a masochist because I was going through all the pain but never got the emotional payoff at the end.

This past weekend was different. When I grasped concepts with Core Audio that I hadn’t known before I felt my mind expand. The sky opened and the rapture came. I was so high off of learning this code that I could not sleep for almost a week. I was completely wired.

I want to briefly explain my interest in Core Audio. One of my self-appointed titles is “High Priestess of Audio Programming.” I am not saying that because I think that I know more than most experts on the topic. Far from it. I am a beginner and I have a lot to learn.

I love sound. I want to fully understand it and get as close to merging with it as I possibly can. The best analogy I can come up with is that for me learning audio programming is like a hard core Christian learning Aramaic so that they can read the Bible in the original language. They want to get the direct words and meanings without being passed through the filter of a translator who might have their own agenda.

I know giving myself that title is probably flaky and arrogant. I will probably have to drop it at some point in the near future but I would love it if I can keep it with people knowing the reason behind it.

I was exposed to a lot of ideas this past weekend. I was exposed to the idea of writing a book and speaking at conferences. I got distracted by a lot of shiny objects and I got seduced by the idea that I am where I will probably be in a few years, but I am not there quite yet.

My goal is to be a hard-core, bit eating programmer. I want to master the hardest things I can find. I want to get as close to the metal as I can. I want to be the person who writes a language or a framework that everyone uses. I want to be Linus Torvalds or Ada Lovelace. I do not want to be the token female programmer who got hired for diversity reasons.

Woman Programmers vs Women Who Code

I may or may not have complained about this already (probably have), but I am annoyed by the recent women’s programming outreach programs. I like the idea in theory, but all of them are along the lines of, “Here! We can teach you Ruby in three weeks and you are now a programmer! Yay!”

You can’t master programming in three weeks. Sorry, but no. I don’t like things where you type in one line of code then lots of magical voodoo happens. I love C for heaven’s sake! I want to learn some Assembler and kernel programming. I want to learn more Linux and shell scripting and regular expressions. At some point in the future I want to learn the math that is being done by my computer for DSP so that I can understand the language of sound.

I wish that these programs would focus on longer-term goals. I wish that they would tell women, “Hey, this stuff is hard. Take 2-3 years and really focus on understanding difficult concepts.” Support them when they think they aren’t good enough because they don’t understand something the first time. No one does. I usually have to expose myself to something about three times before I begin to process it. I can seriously feel my brain rewiring when I am learning a new skill. It takes time. Throwing someone into a week-long workshop to train them to be a code monkey doesn’t count.

My First Real App

That being said, I am laying out my plans for my app. I know that it is one thing to say I want to be a hard-core programming geek, it is another to actually be one.

I want to make a synthesizer. I want to program custom audio units and put together a huge, complex graph of audio effects. I am not there yet!

I am trying to come up with a project that will take about two months to complete that is impressive enough to get me my first job. I need to make the scope small enough that I can get it done in a reasonable amount of time but also impressive enough to capture someone’s attention.

My plan is to make an app that is a sound recorder. When the user pushes the record button a modal view pops up that has a user interface that shows audio level metering and the amount of time being recorded. If you look at Logic, when you begin recording there is a green bar that shows the amount of time being recorded. I want it to look like that. This user interface is the most difficult part of my project and it will be done last.

After the user records their voice and dismisses the modal view they will be able to play their voice back with some effects. I have two sliders, one that controls pitch and one that controls speed. I also have three buttons that will be mapped to various audio unit effects. I am thinking about having a distortion unit, a reverb unit, and I need to determine the last one. I am going to look through the audio unit properties header file for something that looks like it will fit into the rest of the project.

I started getting all confused and turned around. Where do I start? How do I store my data? How do I make my user interface? There is a level meter parameter in Audio Queues, how do I map that to an animation? Do I need to learn Core Animation?

I spoke to my teacher Eric Knapp. He was imminently practical. He told me to start at the beginning. Make an app that records a sound. The next step is to play it back. Then go from there. When he puts it that way…

Systems, apps, and games need to start simple and then get more complex. You need to make sure that the simple things work first and then you add complexity. You can’t immediately set out to create a complex system or else it will fail.

Finally, after I get everything coded I want to try to design the user interface. I have a degree in video production and graphic design. I have not used these skills in a very long time because I honestly don’t want to be a designer as a living. I am a fairly sensitive person and when you are doing something creative you will deal with rejection a lot. I don’t love design enough to persevere through the vast amounts of rejection my work will probably receive. I know that design is a matter of taste and that if someone doesn’t like my work it doesn’t necessarily indicate that I am bad at what I do.

I do know enough about design that I can hopefully make my project look like I didn’t ship it with developer art.

I will keep updating my progress on this application. My biggest enemy is lack of focus. I keep hearing from a lot of different places that whatever I happen to be working on at any given point is wrong. I start worrying about hedging my bets and learning a few “safety skills” in case this whole iOS thing does not work out.

I can’t do that anymore. I have to put all of my effort behind one thing and have faith that it will work out. Doing a few things badly is worse than doing one thing really well.

Moving forward. Not looking back.