Saturday, September 25, 2010

Compose a piece of music using analog synthesizer techniques

Objective

This project will give you the opportunity to begin designing sounds in LabVIEW. You will create two subVIs: one to implement an ADSR-style envelope generator and the other to create a multi-voice sound source. You will then create a top-level application VI to render a simple musical composition as an audio file.

Prerequisite Modules

If you have not done so already, please study the prerequisite module Analog Synthesis Modules. If you are relatively new to LabVIEW, consider taking the course LabVIEW Techniques for Audio Signal Processing, which provides the foundation you need to complete this mini-project activity, including working with arrays, creating subVIs, playing an array to the soundcard, and saving an array as a .wav sound file.

Deliverables

  • All LabVIEW code that you develop (block diagrams and front panels)
  • All generated sounds in .wav format
  • Any plots or diagrams requested
  • Summary write-up of your results

Part 1: ADSR Envelope

Create the subVI ADSR.vi to generate the ADSR-style envelope specified in Figure 1; recall that ADSR stands for "Attack Decay Sustain Release."
Figure 1: Specifications for the ADSR-style envelope
Figure 1 (asyn_MP-compose-adsr-spec.png)
The envelope shape is defined over a normalized time interval of 0 to 1; the envelope stretches or compresses to match the actual duration requested. The three time intervals are likewise expressed in normalized units, so an attack duration (tA) of 0.2 indicates that the attack time is 20% of the entire envelope duration. The envelope values range from 0 dB (full sound intensity) to -40 dB (close to silence). Once you have defined the envelope shape in terms of straight-line segments, you can create the envelope amplitude waveform by undoing the decibels operation; recall that an amplitude "A" expressed in dB is 20 log10(A).
The subVI requires the following controls as input parameters (units specified in brackets):
  1. duration [s] - total duration of envelope
  2. fs [Hz] - system-wide sampling frequency
  3. t values - three-value array containing attack (A) interval, decay (D) interval, and release (R) interval. All three values are in the range 0 to 1, so the intervals are to be treated as fractions of the total duration of the envelope. For example, A=0.3 indicates the attack interval is 30% of the envelope's duration.
  4. e values - two-value array containing the envelope value at the beginning of the sustain interval (eS in the diagram above) and the envelope value at the beginning of the release interval (eR).
The subVI requires the single indicator (output) envelope, an array with values in the range 0 to 1.
Show that your ADSR VI functions properly by plotting the envelope for at least two distinct cases. Plot both the dB form of the envelope as well as its non-dB form.
The following screencast video provides coding tips and other suggestions to help you develop your subVI.
Figure 2: [video] Coding tips and suggestions for ADSR.vi
Figure 2 (asyn_MP-compose-part1.html)

Part 2: Sound Generator

Make a subVI called SoundGen.vi that combines a signal source with the ADSR envelope generator. Use a case structure with an enumerated data type control that allows you to choose one of several different "voices" or "instruments." The case structure then defines the ADSR input parameters to choose the type of signal source (or noise source for a percussive instrument).
The subVI requires the following controls as input parameters (units specified in brackets):
  1. duration [s] - total duration of note
  2. fs [Hz] - system-wide sampling frequency
  3. fref [Hz] - reference frequency
  4. note - note frequency as described by an integer value that denotes the number of semitone intervals from the reference frequency; note can be a negative, zero, or positive value
  5. instrument - enumerated data type with values of your choice; your SoundGen.vi should have at least three different tone-type sounds and at least two different percussive sounds. Use a variety of envelope shapes.
If the discussion in Item 4 for the note control seems mysterious, review the module [INSERT NAME AND MODULE LINK] to learn how to calculate the frequency of a semitone interval usingequal temperament.
Show that your sound generator VI functions properly by developing a top-level VI that plays a chromatic scale. Vary the duration of the notes. Plot the waveform to ensure that the envelope shape makes sense. Save your generated sound to a .wav file to be included with your deliverables.
The screencast video of Figure 3 offers coding tips and other suggestions to help you develop your subVI.
Figure 3: [video] Coding tips and suggestions for SoundGen.vi
Figure 3 (asyn_MP-compose-part2.html)

Part 3: Multi-Voice Composition

Compose a simple piece of music using analog synthesis techniques of your choice. Better compositions will include variety, e.g., different envelope parameters at different times, multiple channels (chords), stereo, percussive sounds, and so on. Write a paragraph or two that describes your compositional technique. Better compositions are click-free, i.e., joining the notes together does not produce any pops or clicks.

Hints:

  • You may wish to use a familiar melody (remember, you've got an equation that converts a note from the equal-tempered scale into frequency), or you may want to use a musical "experiment" based on an algorithm as the basis for your composition.
  • Operate multiple instances of SoundGen.vi in parallel (each with a different instrument setting) and add their outputs together.
  • Import multiple spreadsheets to define your note lists (use "File IO | Read Spreadsheet"). Spreadsheets are the easiest way to hand-edit the contents of arrays.
  • Remember to normalize your finished output before saving it to a .wav file. Use QuickScale ("Signal Processing | Signal Operation | Quick Scale") for this purpose.
  • View your finished composition as a waveform plot. Confirm that the envelope shapes make sense, that the waveform is symmetrical about the zero axis (it should not contain any constant offset), and that the waveform fits within the +/- 1 range.

Alternative Part 3: Multi-Voice Composition Using MIDI File

The overall objectives of this alternative Part 3 are the same as described above, but the technical approach is different.
LabVIEW.png Go to MIDI JamSession to learn all about a LabVIEW application VI of the same name that reads a standard MIDI file (.mid format) and renders it to an audio file (.wav format) using "instrument" subVIs of your own design. You have already done all of the work necessary to create your own instruments, and it is a simple matter to place them inside a standard subVI wrapper (or "Virtual Musical Instrument," VMI) that MIDI JamSession can use.

Content actions

GIVE FEEDBACK:

No comments:

Post a Comment

Related Posts Plugin for WordPress, Blogger...

Popular Projects

My Blog List

Give support

Give support
Encourage Me through Comments & Followers

Followers