/**
* RandomChordServlet.java
*
* This is the web interface to the application which
* performs algorithmic composition and generates MIDI files.
* interactively from user input via html form.
* It performs the following for each http request:
* 1. receives and validates all inpurt fields
* 2. instatiates chordComposer and passes validaed input fields
* 3. invokes chordComposer class methods to create and save MIDI file
* 4. outputs html to http response including a link to the MIDI file
*
* This module is part of Karl Brown's MIDI programming project.
*
*/
package MidiApps;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.Enumeration;
import javax.sound.midi.*;
/**
*
* @author Karl Brown
* @version 1.0
* last updated 2/16/2003
*/
public class RandomChordServlet extends HttpServlet {
tracer tr;
//Global variables
String namestring;
String divstring;
Integer divint;
String beatLengthString;
Long beatLengthLong;
String numGroupsString;
Integer numGroupsInt;
String dirname;
//Player group global variables
String isOnString;
Integer isOnInt;
String patchstring;
Integer patchint;
String percentRestString;
Integer percentRestInt;
String minOctaveString;
Integer minOctaveInt;
String maxOctaveString;
Integer maxOctaveInt;
String minVelOnString;
Integer minVelOnInt;
String maxVelOnString;
Integer maxVelOnInt;
String minVelOffString;
Integer minVelOffInt;
String maxVelOffString;
Integer maxVelOffInt;
String minNotesString;
Integer minNotesInt;
String maxNotesString;
Integer maxNotesInt;
String minNoteLenString;
Integer minNoteLenInt;
String maxNoteLenString;
Integer maxNoteLenInt;
/** Initializes the servlet.
*/
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
/** Destroys the servlet.
*/
public void destroy() {
}
/** Processes requests for both HTTP GET
and POST
methods.
* @param request servlet request
* @param response servlet response
*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, java.io.IOException {
tr = new tracer();
java.io.PrintWriter out = response.getWriter();
tr.setPrintWriter(out);
response.setContentType("text/html");
tr.print("");
tr.print("
"); // tr.trace("instatiating chordComposer.."); chordComposer cc = new chordComposer(); composer c = (composer)cc; // tr.trace("executing chordComposer.compose()..."); cc.setNumDivisions(divint.intValue()); c.setDirectory(dirname); c.setFileName(namestring); c.setTracer(tr); //******** BEGIN HARD-CODED VALUES ******** c.setResolution(96); cc.setNumDrumGroups(0); cc.setBaseMidiPitch((byte)composer.C_DOWN_3); cc.setNumOctaves(7); //******** END HARD-CODED VALUES ******** cc.setBeatLength((long)beatLengthLong.longValue()); cc.setNumGroups((int)numGroupsInt.intValue()); for (int i = 0; i < numGroupsInt.intValue(); i++) { doPlayGroup(request, cc, i); } c.compose(); // tr.trace("returned from c.compose()"); // tr.trace("executing chordComposer.writeMidiFile()..."); c.writeMidiFile(); // tr.trace("returned from chordComposer.writeMidiFile()"); String finalName = c.getFileNameFinal(); out.println("
Here is your MIDI file:
" + finalName + "
");
tr.print("Try this servlet again
");
tr.print("Midi Servlet home page");
tr.print("
");
tr.print("");
tr.print("");
out.close();
System.gc();
}
/** Handles the HTTP GET
method.
* @param request servlet request
* @param response servlet response
*/
protected void doPlayGroup(HttpServletRequest request,
chordComposer cc, int groupIndex)
{
try
{
isOnString = request.getParameter("ison" + groupIndex);
// tr.trace("isOnString: " + isOnString);
isOnInt = new Integer(isOnString);
patchstring = request.getParameter("patch" + groupIndex);
// tr.trace("patchstring: " + patchstring);
patchint = new Integer(patchstring);
percentRestString = request.getParameter("percentrest" + groupIndex);
// tr.trace("percentRestString: " + percentRestString);
percentRestInt = new Integer(percentRestString);
minOctaveString = request.getParameter("minoctave" + groupIndex);
// tr.trace("minOctaveString: " + minOctaveString);
minOctaveInt = new Integer(minOctaveString);
maxOctaveString = request.getParameter("maxoctave" + groupIndex);
// tr.trace("maxOctaveString: " + maxOctaveString);
maxOctaveInt = new Integer(maxOctaveString);
minVelOnString = request.getParameter("minvelon" + groupIndex);
// tr.trace("minVelOnString: " + minVelOnString);
minVelOnInt = new Integer(minVelOnString);
maxVelOnString = request.getParameter("maxvelon" + groupIndex);
// tr.trace("maxVelOnString: " + maxVelOnString);
maxVelOnInt = new Integer(maxVelOnString);
minVelOffString = request.getParameter("minveloff" + groupIndex);
// tr.trace("minVelOffString: " + minVelOffString);
minVelOffInt = new Integer(minVelOffString);
maxVelOffString = request.getParameter("maxveloff" + groupIndex);
// tr.trace("maxVelOffString: " + maxVelOffString);
maxVelOffInt = new Integer(maxVelOffString);
minNotesString = request.getParameter("minnotes" + groupIndex);
// tr.trace("minNotesString: " + minNotesString);
minNotesInt = new Integer(minNotesString);
maxNotesString = request.getParameter("maxnotes" + groupIndex);
// tr.trace("maxNotesString: " + maxNotesString);
maxNotesInt = new Integer(maxNotesString);
minNoteLenString = request.getParameter("minlen" + groupIndex);
// tr.trace("minNoteLenString: " + minNoteLenString);
minNoteLenInt = new Integer(minNoteLenString);
maxNoteLenString = request.getParameter("maxlen" + groupIndex);
// tr.trace("maxNoteLenString: " + maxNoteLenString);
maxNoteLenInt = new Integer(maxNoteLenString);
cc.setIsOn(isOnInt.intValue(), groupIndex);
cc.setPatch((byte)patchint.intValue(), groupIndex);
cc.setPercentChanceRest(percentRestInt.intValue(),groupIndex);
cc.setMinOctave(minOctaveInt.intValue(),groupIndex);
cc.setMaxOctave(maxOctaveInt.intValue(),groupIndex);
cc.setMinVelOn((byte)minVelOnInt.intValue(),groupIndex);
cc.setMaxVelOn((byte)maxVelOnInt.intValue(),groupIndex);
cc.setMinVelOff((byte)minVelOnInt.intValue(),groupIndex);
cc.setMaxVelOff((byte)maxVelOffInt.intValue(),groupIndex);
cc.setMinNoteLength(minNoteLenInt.intValue(),groupIndex);
cc.setMaxNoteLength(maxNoteLenInt.intValue(),groupIndex);
cc.setMinNumPitches(minNotesInt.intValue(),groupIndex);
cc.setMaxNumPitches(maxNotesInt.intValue(),groupIndex);
}
catch(Exception e)
{
tr.trace("RandomChordServlet.doPlayGroup() exception: " + e.toString());
}
}
/** Handles the HTTP GET
method.
* @param request servlet request
* @param response servlet response
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, java.io.IOException {
processRequest(request, response);
}
/** Handles the HTTP POST
method.
* @param request servlet request
* @param response servlet response
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, java.io.IOException {
processRequest(request, response);
}
/** Returns a short description of the servlet.
*/
public String getServletInfo() {
return "Creates a free jazz style MIDI composition using equal tempered scales.";
}
}