|
CSE Home |
Homework 1 - Sound Blaster!Assigned: Tuesday, March 30Due: Thursday, April 8
Make sure you go through General Policies, Grading Policies and Programming Guidelines before you begin working on the project. In particular, note that the writeup you turn in is worth a substantial portion of the grade! Also note that for this assignment it is COMPLETELY allowable to help another student with these tasks: setting up Java or Eclipse, learning how to use Eclipse, setting up or learning how to use sox. I would encourage you to try using Eclipse, but do not let figuring out Eclipse prevent you from completing the assignment. There are some Java Doc comments in DStack.java. You are welcome to try out Java Doc as well, but this is also not required (it is fine to use regular comments). OutlineIntroductionThe purpose of this project is to implement a Stack ADT in the two most common ways, an array and a linked list.
Your Stack implementation will be used to do sound manipulation, namely
reversing a sound clip. This process, called "backmasking," was
used by musicians including the Beatles, Jimi Hendrix and Ozzy Ozbourne,
although it seems to have fallen out of favor in recent years. The AssignmentYou will write a program that reads a sound file in the .dat format (explained below), and writes another .dat sound file which is the reverse of the first. We provide you with a class Reverse whose main method reads in a .dat sound file, puts the sounds values on a stack, pops them off in reverse order, and puts these reversed values in a new .dat sound file. We've also provided you with a DStack interface, which defines a stack that holds double values. Your first job is to look over these files and become familiar with them. You need to provide two stack implementations, one using an array and the other using a linked list. They should be called ArrayStack and ListStack, respectively. They should implement the interface DStack, which we provide to you. Once you provide these implementations, Reverse should work and create backwards sound files. It shouldn't take more than a page or two of code to provide the implementation. Your array implementation should hold around a million elements. You may assume that the array won't fill completely (although we'll discuss what happens in that case in the writeup questions). Both ArrayStack and ListStack should throw an EmptyStackException if pop() or peek() is called when the stack is empty. To use EmptyStackException, add the following line to your file:
The Reverse program takes 3 arguments (aka "command line arguments"). The first is the word array or list, and specifies which implementation to use. The next two are the input and output .dat file names (you need to include the .dat extension). Running the program will depend on your system; from a command line it will look something like the following. java Reverse list in.dat out.dat In an IDE there is usually a dialog for setting program parameters which contains a field for the program arguments. (e.g. in jGRASP select Build->Run Arguments and a bar will appear at the top of the screen that allows you to type in the arguments.) Read the section on Digital Sound to learn how to create a .dat file. To get you started, we've created a .dat file here. For details on what to turn in for this assignment and how, read the section on Logistics. For a quick reminder of how interfaces work in Java, see Java Reminder. In addition, answer the following questions and provide the answer in your writeup. Writeup Questions
Going Above and BeyondThe following list of suggestions are meant for you to try if you finish the requirements early. Recall that any extra-credit points you earn for these are kept separate from your assignment score and will be used to adjust your grade at the end of the quarter, as detailed in the course grading policy.
Logistics for Homework 1
It may be useful for you to create some short .dat files by hand to aid testing.
Electronic turnin should be done via the online dropbox linked at the top of this page. Note that you should not turn in either Reverse.java or DStack.java. This means you shouldn't change them, either--your code must work with the original, unmodified versions. Your extra credit may include a modifed Reverse.java, but because you've included it in a separate directory we'll be able to compile & grade your regular assignment without touching your extra credit. If you don't segregate your extra credit you may not receive credit for it.
How Digital Sound WorksWe will view sound as a continuous function of time from the positive real numbers (time) to the interval [-1.0, 1.0] (amplitude). Since a computer can't "hold" a function defined on the reals, we have to approximate the function. We do this by measuring (or "sampling ") the sound several thousand times per second.
This process is called "Analog to Digital Conversion", or ADC. The number of times per second the sound is sampled is called the sample rate and is measured in Hertz. For example, CDs are recorded at 44100 samples per second, or 44.1kHz. Wait a minute! Is this the right class? I thought this was CSE373. SoxThe only sound file format you need to know about is the .dat format described below. You don't even have to know very much about that either, as we're giving you the code that reads and writes that format. In order to play sounds you produce, you need a way to convert the .dat file into a format that common media players (Windows Media Player, winamp, RealPlayer, etc.) understand. We'll describe one way to do it below; however, you're free to use any converter you can find. sox is a UNIX command-line utility whose name stands for "SOund eXchange". It allows you to convert between many different sound formats including .wav, .au, etc. In particular, sox allows you to convert to and from .dat sound files. .dat files are useful because they are human-readable, text-based, sound files. Note that you will need to perform this conversion to answer one of the writeup questions.
There is a windows version of The general strategy for using
That's all there is to it! The .dat File FormatThe .dat file format starts with one line describing the sample rate of the sound file. This line is required. The rest of the file is composed of two columns of numbers. The first column consists of the time (measured in seconds) when the sample was recorded, and the second column contains the value of the sample, between -1.0 and 1.0. This is the beginning of a sample .dat file. Notice that the numbers in the first column increase by 1/44100 each step. This is because the sample rate is 44.1kHz.
Here is the same file, a little deeper on:
Note that for this assignment, you shouldn't have to deal much with the .dat file yourself, as the provided Reverse.java does all the lifting for you. All you have to do is implement the stacks. We are explaining the format because it will be helpful for you if you want to write a short file by hand to run, to verify if your program works. Java ReminderFor this assignment you will need to instantiate an interface, DStack, in two different ways. The DStack interface defines a simple stack:
An actual interface includes comments, including a description of how
The ListStack class should be defined similarly. You should include appropriate comments as needed. In particular, each file should begin with a comment that describes the class in the file, and includes your name and other identifying information. Feeling rusty on Java? You may also find it useful to refer to these slides from cse143 on arrays, list nodes, and linked lists. In general you may find it useful to review a bit of the material from cse143. The resources found here may be helpful. Working with EclipseWe encourage you to try working on your project in Eclipse, a powerful environment for Java and a number of other languages. Eclipse may seem like overkill for this assignment - probably because it is! But as the projects get larger, having an integrated development environment with lots of features will come in handy, so you should consider trying it out now. You can use Eclipse in the lab, or download it to your personal machine. The download site offers a number of different versions; you'll want 'Eclipse IDE for Java Developers.' (NOT the similar sounding 'Eclipse IDE for Jave EE Developers'). First, be sure to check out this Eclipse tutorial from CSE 143. I would also encourage you to write and run a simple "Hello World" program using Eclipse before starting on the project. This is just a program that does nothing more than print out the string "Hello World". Once you have mastered "Hello World", you might try something with multiple files, or re-doing one of your projects from cse143. Here are some starter instructions for opening the project in Eclipse.
Running Your Program from EclipseWhen you've reached a point at which you want to try using your stack code with the Reverse.java program, you'll need to do a bit of extra work in order to pass command-line arguments to the program:
When you've finished the project and want to turn in ArrayStack.java and ListStack.java, an easy way to get the individual files is to click on each one in Eclipse's left-hand window and drag to the Desktop. This copies the file from the Eclipse workspace to your desktop. AcknowledgmentsLike many assignments, this has been passed down to us through the vaporous mists of time. Among all our fore-bearers, we would especially like to thank Ashish Sabharwal, and Adrien Treuille and his Data Structures professor, Timothy Snyder. |
Computer Science & Engineering University of Washington Box 352350 Seattle, WA 98195-2350 (206) 543-1695 voice, (206) 543-2969 FAX [comments to rea] |