Jump to content

256a-fall-2017/hw1

From CCRMA Wiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Homework #1: Cookin' with Low-level Audio

Due date: 2017.10.3 11:59:59pm, Tuesday.

Let's get cookin'.

Specification (part 1 of 4): Real-time Audio

  • create a program that is capable of real-time audio input/output
  • give it name (e.g., sig-gen; creative names are always welcome)
    • start with this basic boilerplate: [1]
  • next, add real-time audio support, using the RtAudio Library (version 4.0.10 or later, included in the boilerplate)
    • even though it's useful to briefly look through the package, the only files you'll need are:
      • RtAudio.h (the header file for RtAudio, it contains the class definitions)
      • RtAudio.cpp (the implementation)
      • RtError.h (header containing various error handling constructs for RtAudio)
    • it may be useful to browse the RtAudio documentation and the example programs in the RtAudio distribution
  • implement the callback function to generate the expect number of samples per call for a sine wave at 440Hz
  • the overall behavior when you run the program should be a continuous sine tone at 440hz...
  • to quit: press enter

Specification (part 2 of 4): Waveforms

  • modify your program to take command line arguments and generate different signals, depending on the command line flag you specify:
    sig-gen [type] [frequency] [width]
        [type]: --sine |  --noise | --impulse | --pulse
        [frequency]: (a number > 0, not applicable to noise)
        [width]: pulse width (only applicable to pulse)
  • where the flags correspond to the following signals:
    • --sine : sine wave
    • --noise : white noise
    • --impulse : impluse train, the frequency should determine the impulse train's fundamental period
    • --pulse : rectangular pulse wave, the width ([0.0-1.0]) controls the pulse width (e.g., width=.5 should result in a square wave)
  • it might be a good idea to output the usage (as show above), if insufficient or incorrect parameters are given
  • you'll need to implement a simple command line parser, with basic error checking (e.g., what to do when invalid/irrelevant parameters are provided?)
  • you'll also need to organize your code a bit, to selectively generate the request signal

See Signal generator hints if needed.

Specification (part 3 of 4): One Ring to Modulate Them All

  • Next, add another command line flag:
    • --input : mic/line input (make sure input is enabled in the RtAudio initialization)
  • if specified, this flag tells the program to take the mic/line input and and multiply it against the signal being generated, and output the result;
  • test it by talking into it and listening to the result...

Specification (part 4 of 4): add ChucK!

  • Lastly, add ChucK as a module to your program
  • download charles boilerplate project that includes ChucK as library and API
  • in host/charles.cpp, add in your existing code from earlier parts
  • study chuck.h in core/ -- it contains the chuck API you'll use to add ChucK as a module
  • make the following modifications to charles.cpp (after you've brought in your code, and verified it still compiles/works):
    • instantiate a ChucK object
    • set parameters
    • initialize the ChucK object (init())
    • compile a chuck program (created as a string, according to the specification from the command line)
    • start ChucK
    • very importantly, drive chuck from your callback function
  • add the --chuck flag to your program. when it is passed in, you should generate and use a chuck program for the sig-gen functionality, rather than instead of what you wrote in earlier parts
    • sine
    • pulse wave
    • white noise
    • impulse train
    • ring modulating

Note

  • have fun with it!!!
  • comment your code!
  • choose your own coding conventions - but be consistent
  • you are welcome to work together, but you must do/turn in your own work (you'll likely get more out of it this way)
  • some considerations:
    • how to organize the code for the various types of signals?
    • how much error-checking and error-reporting on the command line arguments?

Hints for ChucK Code

ChucK code for reference

You may want to use a stringstream or other string formatting techniques to construct ChucK programs on-the-fly

Deliverables

turn in all files + readme through coursework

  • 1) Create a zip/tar file and put all the files in there. The required files are:
    • source code to the project (*.h, *.cpp, makefile, etc.)
    • a short README text section that:
      • instructions on building the project (for example, anyone in the class should be able to download
      • conveys your ideas/comments in constructing each program
      • describes any difficulties you encountered in the process
      • lists any collaborators
  • 2) upload zip/tar file to Canvas!