You are on page 1of 29

Minor Project Report

on
Groove Studio

Northern India Engineering College


FC-26, Shastri Park,
New Delhi- 110053

Submitted to: Submitted by:


Mr. Prashant K Gupta Anand Marwaha(0621563107)
(Lecturer, Department of IT) Apurv Mehta(0651563107)
Aditya Bharti(0761563107)

1
ACKNOWLEDGEMENT

It gives us immense pleasure to take this opportunity to acknowledge our obligation to our
project guide Mr. Prashant Gupta of Northern India Engineering College, who not only was kind
enough to permit us undertake the project work (which is essential for partial fulfillment of our
Bachelor of Technology(Information Technology) Degree, but also took great effort in making
the project a success. We thank to our guide, as it would have been a tough job for us to
complete this project without his keen interest, moral support, suggestion and valuable guidance
in completion of the project.

We would also like to thank to Mr. Rajesh Yadav (H.O.D. of I.T. department) , for his timely
help and guidance.

We would also like to thank to IT Department teachers of Northern India Engineering College.

We sincerely thank to all the people who have been directly or indirectly involved in making the
project a great success.

Anand Marwaha(0621563107)

Apurv Mehta(0651563107)

Aditya Bharti(0761563107)

2
Index

S. No. Topic Page No.

1 Introduction 4
2 Use Case Diagram 5
3 Software Development Approach 7
4 Design Descriptions 9
5 Implementation 10
6 Testing Strategies 24
7 Screenshots 27
8 Conclusion 28
9 References 28

Introduction
3
Groove Studio is a Java application in which users use a 16x16 Grid of checkboxes to create a
beat with various percussion instruments. Beats can be saved and loaded easily. The entire
application is as intuitive and user-friendly as possible. BeatBox is primitive devices that plays
rigid patterns of notes using a grid of 16 buttons, or steps, each step being 1/16th of a measure.
These patterns of notes are then chained together to form longer compositions.

1.1 Function
This document will present a detailed description of a Musical Jukebox “Groove Studio”. It will
explain the purpose and features of the system, the constraints it must operate under. This
document is intended for developers and stakeholders of the system.

1.2 Scope
This software will be a Musical Jukebox to allow entertaining self created music for the users.
Using this application user can include various instruments and create a self composed musical
piece. In addition to the above feature the user can chat with other users on the chat server and
share tunes with them using the chat module. Features like tempo change and saving files to the
hard disk will be provided

1.3 Definitions, Acronyms and Abbreviations


• MIDI : Musical Instrument Digital Interface
• GUI: Graphical User Interface
• TCP/IP : Transmission Control Protocol/Internet Protocol

1.4 Technologies Used


• Java Runtime Environment

1.5 Overall Description


Software Interfaces

• Client Side Java Runtime Environment


• Server Side Java Runtime Environment

1.6 Communication Interface


• All users will be able to communicate with each other on the same chat server.

Use Case Diagram

4
Chat

File: Save & Load

Start/Stop
User

Tempo Up/Down

Groove Studio has one actor which is the user running the application he can interact with four
use cases. The user can chat with other users who are online on the server. He can create musical
files and can save and load these files on the hard disk. Users can start and stop the playing of the
sound and lastly he can change the tempo of the music.

2.1 Use Case : Chat


Brief Description
Initiating this use case the user can chat with other users and send the files created to those users

Initial Step-By-Step Description


• The user creates a file on the musical interface
• Then types a text message for the chat module
• He clicks send and the software sends the message and the file to the server

2.2 Use Case : Saving and Loading


Brief Description
Initiating this use case the user can save and load files on the hard disk

5
Initial Step-By-Step Description
Saving

• The user creates a file on the musical interface


• He then goes to the file dialog and save that file to the hard disk.

Loading

• The user loads a file on the application


• The on clicking start the file starts to play

2.3 Use Case : Start/Stop


Brief Description
Initiating this use case the user can start and stop the sound.

Initial Step-By-Step Description


• By clicking the start button user can start the sound
• By clicking the stop button user can stop the sound

2.4 Use Case :Tempo Up/Down


Brief Description
Initiating this use case the user can increase and decrease the tempo of the sound

Initial Step-By-Step Description


• The user creates a file on the musical interface
• Then when that file is playing user can increase or decrease the tempo as required using
the buttons.

Software Development Approach


3.1 Methodology

6
3.2 Incremental Model
The incremental model is an intuitive approach to the waterfall model. Multiple development
cycles take place here, making the life cycle a “multi-waterfall” cycle. Cycles are divided up
into smaller, more easily managed iterations. Each iteration passes through the requirements,
design, implementation and testing phases. A working version of software is produced during the
first iteration, so you have working software early on during the software life cycle. Subsequent
iterations build on the initial software produced during the first iteration.

Requirement Analysis & Definition: All possible requirements of the system to be developed
are captured in this phase. Requirements are set of functionalities and constraints that the end-
user (who will be using the system) expects from the system. The requirements are gathered
from the end-user by consultation, these requirements are analyzed for their validity and the
possibility of incorporating the requirements in the system to be development is also studied.
Finally, a Requirement Specification document is created which serves the purpose of guideline
for the next phase of the model.
7
System & Software Design: Before a starting for actual coding, it is highly important to
understand what we are going to create and what it should look like? The requirement
specifications from first phase are studied in this phase and system design is prepared. System
Design helps in specifying hardware and system requirements and also helps in defining overall
system architecture. The system design specifications serve as input for the next phase of the
model.

Unit Testing: On receiving system design documents, the work is divided in modules/units and
actual coding is started. The system is first developed in small programs called units, which are
integrated in the next phase. Each unit is developed and tested for its functionality; this is
referred to as Unit Testing. Unit testing mainly verifies if the modules/units meet their
specifications.

System Testing: As specified above, the system is first divided in units which are developed and
tested for their functionalities. These units are integrated into a complete system during
Integration phase and tested to check if all modules/units coordinate between each other and the
system as a whole behaves as per the specifications. After successfully testing the software, it is
delivered to the customer.

Operations & Maintenance: This phase of is virtually never ending phase (Very long).
Generally, problems with the system developed (which are not found during the development life
cycle) come up after its practical use starts, so the issues related to the system are solved after
deployment of the system. Not all the problems come in picture directly but they arise time to
time and needs to be solved; hence this process is referred as Maintenance.

Design Descriptions

8
4.1Context Diagram (0 Level DFD)

Music Save file


Groove
Creation on hard disk
Studio

Load file on

Hard disk

9
Implementation
5.1 Coding
File name: BeatBox.java

import java.awt.*;
import javax.swing.*;
import javax.sound.midi.*;
import java.util.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import javax.swing.event.*;

class BeatBox
{
JPanel background,mainPanel,panel;
ArrayList<JCheckBox> checkboxList;
JFrame theFrame;
JList incomingList;
JTextField userMessage,t;
JLabel temp;
//int nextNum=1;
Vector<String> listVector = new Vector<String>();
String userName;
ObjectOutputStream out;
ObjectInputStream in;
HashMap<String,boolean[]> otherSeqsMap = new HashMap<String,boolean[]>();
ArrayList<Integer> trackList=null;

Sequencer sequencer;
Sequence sequence,mySequence;
Track track;

String []instNames={"Bass Drum","Closed Hi-Hat",


"Open Hi-Hat","Acoustic Snare","Crash Cymbal","Hand Clap",
"High Tom","Hi Bongo","Maracas","Whistle","Low Conga",
"Cowbell","Vibraslap","Low-mid Tom","High Agog","Open Hi Conga"};

int []instruments={35,42,46,38,49,39,50,60,70,72,64,56,59,47,67,63};

public static void main(String args[])

{new BeatBox().startUp();}

10
public void startUp()
{
// open connection to the server
try
{
Socket sock = new Socket("127.0.0.1",4242);
out = new ObjectOutputStream(sock.getOutputStream());
in = new ObjectInputStream(sock.getInputStream());
Thread remote = new Thread(new RemoteReader());
remote.start();
}
catch(Exception ex){
System.out.println("Could not access server");
}
theFrame=new JFrame("Groove Studio");
//theFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
Dimension f = theFrame.getSize();
int x = (d.width - f.width) / 2;
int y = (d.height - f.height) / 2;
theFrame.setBounds(x, y, f.width, f.height );
Image img = Toolkit.getDefaultToolkit().getImage("logo.gif");
theFrame.setIconImage(img);
panel = new JPanel();
t= new JTextField("Enter your name");
t.addActionListener(new textListener());
t.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if(e.getButton()==MouseEvent.BUTTON1)
{t.setText("");}
}

}
);
panel.add(t);
theFrame.add(panel);
theFrame.setSize(75,75);
theFrame.setVisible(true);
}

class textListener implements ActionListener


{

public void actionPerformed(ActionEvent event)


{panel.setSize(0,0);

11
theFrame.setVisible(false);
userName=t.getText();
setUpMidi();
buildGUI();
}
}

public void buildGUI()


{
theFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
theFrame.setSize(1280,800);
BorderLayout layout=new BorderLayout();
Image img = Toolkit.getDefaultToolkit().getImage("logo.gif");
theFrame.setIconImage(img);

background=new JPanel(layout);
background.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
Color col=new Color(235,243,239);

checkboxList=new ArrayList<JCheckBox>();

Box buttonbox= new Box(BoxLayout.X_AXIS);


Box listbox= new Box(BoxLayout.Y_AXIS);

ImageIcon play = new ImageIcon("play.gif");


JButton start=new JButton(play);
start.addActionListener(new MyStartListener());
buttonbox.add(start);
start.setToolTipText("Play");

ImageIcon pause = new ImageIcon("pause.gif");


JButton stop=new JButton(pause);
stop.addActionListener(new MyStopListener());
buttonbox.add(stop);
stop.setToolTipText("Pause");

ImageIcon max = new ImageIcon("up.gif");


JButton uptempo=new JButton(max);
uptempo.addActionListener(new MyTempoUpListener());
buttonbox.add(uptempo);
uptempo.setToolTipText("Increase Tempo");

temp=new JLabel("Tempo");
Font newLabelFont=new Font(temp.getFont().getName(),temp.getFont().getStyle(),12);
temp.setFont(newLabelFont);
float tempoFactor=sequencer.getTempoFactor();
tempoFactor = (float) (Math.round(tempoFactor*100.0f)/100.0f);
String s=new Float(tempoFactor).toString();

12
temp.setText(s +"BPM");
temp.setForeground(Color.BLACK);
buttonbox.add(temp);

ImageIcon min = new ImageIcon("down.gif");


JButton downtempo=new JButton(min);
downtempo.addActionListener(new MyTempoDownListener());
buttonbox.add(downtempo);
downtempo.setToolTipText("Decrease Tempo");
buttonbox.setBackground(Color.WHITE);

incomingList = new JList();


incomingList.addListSelectionListener(new MyListSelectionListener());
incomingList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
JScrollPane theList = new JScrollPane(incomingList);
incomingList.setVisibleRowCount(20);
incomingList.setBackground(col);
incomingList.setForeground(Color.WHITE);
incomingList.setSelectionBackground( Color.WHITE );
incomingList.setSelectionForeground( Color.black );
listbox.add(theList);
incomingList.setListData(listVector);//no data to start with

userMessage = new JTextField();


userMessage.setBackground(col);
userMessage.setForeground(Color.BLACK);
userMessage.addActionListener(new userListener());
buttonbox.add(userMessage);

ImageIcon sendi = new ImageIcon("send.gif");


JButton sendit=new JButton(sendi);
sendit.addActionListener(new userListener());
buttonbox.add(sendit);
sendit.setToolTipText("Send");

Box nameBox=new Box(BoxLayout.Y_AXIS);


for (int i=0;i<16;i++)
{ Label j=new Label(instNames[i]);
j.setBackground(col);
j.setForeground(Color.BLACK);
nameBox.add(j);
}
nameBox.setBackground(Color.BLACK);
background.add(BorderLayout.WEST,nameBox);
background.add(BorderLayout.SOUTH,buttonbox);
background.add(BorderLayout.EAST,listbox);

GridLayout grid = new GridLayout(16,16) ;

13
grid.setVgap(1);
grid.setHgap(1);
mainPanel= new JPanel(grid) ;

background.add(BorderLayout.CENTER, mainPanel);
background.setOpaque(true);
mainPanel.setOpaque(true);
mainPanel.setBackground(Color.BLACK);

for(int i=0;i<256;i++)
{ImageIcon l = new ImageIcon("back.gif");
JCheckBox c=new JCheckBox();
c.setSelected(false);
c.setBackground(Color.BLACK);
checkboxList.add(c);
mainPanel.add(c);
}

JPopupMenu.setDefaultLightWeightPopupEnabled(false);
ImageIcon imageBack = new ImageIcon("back.gif");
JLabel b1= new JLabel(imageBack);
b1.setBounds(0, 0, imageBack.getIconWidth(), imageBack.getIconHeight());
theFrame.getLayeredPane().add(b1, new Integer(Integer.MIN_VALUE));
theFrame.setContentPane(background);
theFrame.setBounds(50,50,30,30);
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("File");
JMenu toolMenu = new JMenu("Tools");

JMenuItem newMenuItem = new JMenuItem("New");


newMenuItem.addActionListener(new newMenuListener());

JMenuItem saveMenuItem = new JMenuItem("Save");


saveMenuItem.addActionListener(new saveMenuListener());

JMenuItem openMenuItem = new JMenuItem("Open");


openMenuItem.addActionListener(new openMenuListener());

JMenuItem clearMenuItem = new JMenuItem("Clear");


clearMnuItem.addActionListener(new clearMenuListener());
JMenuItem restoreMenuItem = new JMenuItem("Restore");
restoreMenuItem.addActionListener(new restoreMenuListener());

JMenuItem aboutusMenuItem = new JMenuItem("About Us");


aboutusMenuItem.addActionListener(new aboutusMenuListener());

fileMenu.add(newMenuItem);
fileMenu.add(openMenuItem);

14
fileMenu.add(saveMenuItem);
toolMenu.add(clearMenuItem);
toolMenu.add(restoreMenuItem);
toolMenu.add(aboutusMenuItem);

menuBar.add(fileMenu);
menuBar.add(toolMenu);
theFrame.setJMenuBar(menuBar);
theFrame.pack();
theFrame.setVisible(true);
}//close buildGUI

public void setUpMidi()


{
try
{ sequencer=MidiSystem.getSequencer();
sequencer.open();
sequence=new Sequence(Sequence.PPQ,4);
track=sequence.createTrack();
sequencer.setTempoInBPM(120);
}
catch(Exception e)
{}
}
public void buildTrackandStart()
{
sequence.deleteTrack(track);
track=sequence.createTrack();
for(int i=0;i<16;i++)
{
trackList=new ArrayList<Integer>();
int key=instruments[i];
for(int j=0;j<16;j++)
{
JCheckBox jc=(JCheckBox)checkboxList.get(j+(16*i));
if(jc.isSelected())
trackList.add(new Integer(key));

else
trackList.add(new Integer(0));//because this slot must be empty
\ }//close inner loop
makeTracks(trackList);
}// close outerloop

track.add(makeEvent(192,9,1,0,15));
try
{ sequencer.setSequence(sequence);
sequencer.setLoopCount(sequencer.LOOP_CONTINUOUSLY);

15
sequencer.start();
sequencer.setTempoInBPM(120) ;
mySequence=sequence;
}
catch(Exception e) {}
}
public void actionPerformed(ActionEvent event)
{}
class clearMenuListener implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
for(int i=0;i<16;i++)
{
for(int j=0;j<16;j++)
{
JCheckBox jc=(JCheckBox)checkboxList.get((j*16)+i);
jc.setSelected(false);
sequencer.stop();
}
}
}
}

class aboutusMenuListener implements ActionListener


{ public void actionPerformed(ActionEvent event)
{
JOptionPane.showMessageDialog(theFrame,"Groove Studio.Copyright AAA 2010 @ All Rights
Reserved","About Us",JOptionPane.PLAIN_MESSAGE);
}
}
class saveMenuListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
JFileChooser fileSave = new JFileChooser();
fileSave.showSaveDialog(theFrame);
saveFile(fileSave.getSelectedFile());
}
}
private void saveFile(File file)
{
boolean [] checkboxState = new boolean[256];
for(int i=0;i < 256;i++)
{
JCheckBox check = (JCheckBox) checkboxList.get(i);
if(check.isSelected())
{checkboxState[i]=true;}

16
}
try {
FileOutputStream fileStream = new FileOutputStream(file);
ObjectOutputStream os = new ObjectOutputStream(fileStream);
os.writeObject(checkboxState);
os.close();
}
catch(Exception ex)
{ex.printStackTrace();}

}
class newMenuListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
for(int i=0;i<16;i++)
{
for(int j=0;j<16;j++)
{
JCheckBox jc=(JCheckBox)checkboxList.get((j*16)+i);
jc.setSelected(false);
sequencer.stop();
}
}
}
}

class openMenuListener implements ActionListener


{
public void actionPerformed(ActionEvent e)
{
JFileChooser fileOpen = new JFileChooser();
fileOpen.showOpenDialog(theFrame);
openFile(fileOpen.getSelectedFile());
}}
private void openFile(File file)
{
boolean [] checkboxState = new boolean[256];
try {
FileInputStream fileStream = new FileInputStream(file);
ObjectInputStream is = new ObjectInputStream(fileStream);
checkboxState = (boolean[]) is.readObject();
is.close();
}
catch(Exception ex)
{ex.printStackTrace();}
for(int i = 0;i < 256;i++)
{ JCheckBox check = (JCheckBox) checkboxList.get(i);

17
if(checkboxState[i])
check.setSelected(true);
else
check.setSelected(false);

}
sequencer.stop();
buildTrackandStart();
}
class MyStartListener implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
buildTrackandStart();
mySequence = sequence;
}
}

class MyStopListener implements ActionListener


{
public void actionPerformed(ActionEvent event)
{sequencer.stop(); }
}

class MyTempoUpListener implements ActionListener


{
public void actionPerformed(ActionEvent event)
{
float tempoFactor=sequencer.getTempoFactor();
tempoFactor = (float) (Math.round(tempoFactor*100.0f)/100.0f);
sequencer.setTempoFactor((float)(tempoFactor * 1.1));
String s=new Float(tempoFactor).toString();
temp.setText(s+" BPM");

}
}

class MyTempoDownListener implements ActionListener


{
public void actionPerformed(ActionEvent event)
{
float tempoFactor=sequencer.getTempoFactor();
sequencer.setTempoFactor((float)(tempoFactor * 0.8));
tempoFactor = (float) (Math.round(tempoFactor*100.0f)/100.0f);
String s=new Float(tempoFactor).toString();
temp.setText(s+" BPM");

18
}
}
class userListener implements ActionListener
{
public void actionPerformed (ActionEvent a)
{ //make an arraylist of the state of checkboxes
boolean [] checkboxState = new boolean[256];

for(int i=0;i < 256;i++)


{
JCheckBox check = (JCheckBox) checkboxList.get(i);
if(check.isSelected())
{checkboxState[i]=true;}
}
String messageToSend = null;
try
{
out.writeObject(userName +":"+userMessage.getText());
out.writeObject(checkboxState);
}
catch(Exception e)
{
System.out.println("Sorry Dude,Server Loaded Chill Out while waiting.Peace Out!");
}
userMessage.setText("");
}//close actionPerformed
}//close inner

public class MyListSelectionListener implements ListSelectionListener


{
public void valueChanged(ListSelectionEvent e)
{
if(!e.getValueIsAdjusting())
{
String selected = (String)incomingList.getSelectedValue();
if(selected != null)
{//now go the map and change sequence
boolean[] selectedState = (boolean[]) otherSeqsMap.get(selected);
changeSequence(selectedState);
sequencer.stop();
buildTrackandStart();
}
}
}

19
class RemoteReader implements Runnable

{
boolean[] checkboxState = null;
String nameToShow = null;
Object obj = null;
public void run()
{

try

{ while((obj=in.readObject()) != null)
{
System.out.println("got an Object from server");
System.out.println(obj.getClass());
nameToShow = (String) obj;
checkboxState = (boolean[]) in.readObject();
otherSeqsMap.put(nameToShow,checkboxState);
listVector.add(nameToShow);
incomingList.setListData(listVector);

catch(Exception e)
{e.printStackTrace();}

class restoreMenuListener implements ActionListener

{
public void actionPerformed(ActionEvent e)
{
if(mySequence != null)
{
sequence = mySequence; // restore to original
}

20
}

public void changeSequence(boolean[] checkboxState)

{
for(int i = 0;i < 256;i++)
{
JCheckBox check = (JCheckBox) checkboxList.get(i);
if(checkboxState[i])
{
check.setSelected(true);
}

else
{
check.setSelected(false);

}
}

public void makeTracks(ArrayList list)


{
Iterator it=list.iterator();
for(int i=0;i<16;i++)
{
Integer num = (Integer)it.
next();
if(num!=null)
{
int numKey=num.intValue();
track.add(makeEvent(144,9,numKey,100,i));
track.add(makeEvent(128,9,numKey,100,i+1));
}
}
}
public MidiEvent makeEvent(int me,int ch,int inst,int vel,int tick)
{
MidiEvent event=null;
try
{
ShortMessage s=new ShortMessage();
s.setMessage(me,ch,inst,vel);
event=new MidiEvent(s,tick);

21
}
catch(Exception e){}
return(event);
}

5.2 File Name: MusicServer.java

import java.io.*;
import java.net.*;
import java.util.*;

public class MusicServer


{
ArrayList<ObjectOutputStream> clientOutputStreams;
public static void main(String[] args)
{new MusicServer().go();}
public class ClientHandler implements Runnable
{
ObjectInputStream in;
Socket clientSocket;

public ClientHandler(Socket socket)


{
try
{clientSocket = socket;
in=new ObjectInputStream(clientSocket.getInputStream());
}
catch(Exception e){e.printStackTrace();}
}// close constructor

22
public void run()
{
Object o1=null;
Object o2=null;
try
{
while((o1 = in.readObject()) != null)
{
o2 = in.readObject();
System.out.println("Read Two Objects");
tellEveryone(o1,o2);
}
}
catch(Exception e){e.printStackTrace();}
}//close run
}//close inner class
public void go()
{
clientOutputStreams = new ArrayList<ObjectOutputStream>();

try
{
ServerSocket serverSock = new ServerSocket(4242);
while(true)
{
Socket clientSocket = serverSock.accept();
ObjectOutputStream out = new
ObjectOutputStream(clientSocket.getOutputStream());
clientOutputStreams.add(out);
Thread t = new Thread(new ClientHandler(clientSocket));
t.start();
System.out.println("Got Connected");
}
}catch(Exception e){e.printStackTrace();}
}//close go
public void tellEveryone(Object one, Object two)
{
Iterator it = clientOutputStreams.iterator();
while(it.hasNext())
{
try
{ ObjectOutputStream out = (ObjectOutputStream) it.next();
out.writeObject(one);
out.writeObject(two);
}
catch(Exception e){e.printStackTrace();}

23
}

}// close tellEveryone

}//close class.

24
Testing Strategies

It should be clear in mind that philosophy behind testing is to find errors. Test cases are devised
with this purpose in mind. A test case is a set of data that the system will process as normal
input. However, the data are created with the express intent of determining whether the system
will process them correctly. Each test case is designed with the intent of finding errors in the way
the system will process it. There are two general strategies for testing software:

• Code testing
• Specification testing

In code testing, the analyst develops those cases to execute every instructions and path in a
program. Under specification testing, the analyst examines the program specifications and then
writes test data to determine how the program operates under specific conditions.

Systems are not designed as entire systems nor are they tested as single systems. The analyst
must perform both unit and system testing.

6.1 Unit Testing


Unit testing concentrates verification on the smallest element of the program – the
module. Using the detailed design description important control paths are tested to establish
errors within the bounds of the module.

6.2 System Testing


Ultimately, software is included with other system components and a set of system
validation and integration tests are performed. Steps performed during software design and
testing can greatly improve the probability of successful software integration in the larger
system. System testing is a series of different tests whose main aim is to fully exercise the
computer-based system. Although each test has a different role, all work should verify that all
system elements have been properly integrated and form allocated functions. Below we consider
various system tests for computer-based systems.

6.3 Black Box Testing


Black box testing approaches concentrate on the fundamental requirements of the
software. Black box testing allows the software engineer to produce groups of input situations
that will fully exercise all functional requirements for a program. Black box testing is not an
alternative to white box techniques. It is a complementary approach that is likely to uncover a
different type of errors that the white box approaches.

25
Black box testing tries to find errors in the following categories:

(1) Incorrect or Missing Functions,

(2) Interface Errors

(3) Errors in Data Structures or External Database Access

(4) Performance Errors,

(5) Initialization and Termination Errors.

6.4 Beta testing


A test for a computer product prior to commercial release. Beta testing is the last stage of
testing, and normally can involve sending the product to beta test sites outside the company for
real-world exposure or offering the product for a free trial download over the Internet. Beta
testing is often preceded by a round of testing.

26
Screenshots
Original Interface

Chat Interface

27
28
Conclusion
This project has huge scope for further development using various features from Java Media
Framework it can be converted into a complete media player with a chat interface also it has an
online implementation whereby it can be placed as an online application connecting users from
varied part of the world. Also as every user enjoys music it can be used as an alternative to mp3
player. Additional features that can be provided can be video play user account creation, saving
playlists.

References

• Java: Complete Reference……………..................Herbert Schildt

• Java Black Book …………………………………Steve Holzner

• http://www.java2s.com/Tutorial/Java/.htm..................October,2010

• http://home.cogeco.ca/~ve3ll/jatutor0.htm.................. October,2010

• http://download.oracle.com/javase/tutorial/................ October,2010

29

You might also like