Mit Java Musik machen?

Cherryrose

Mitglied
Hallo, ich habe eine Aufgabe bekommen, in der ich mit Java Musik machen soll. Ich arbeite mit Eclipse. Ich habe folgende Idee: Wenn man als Nutzer eine Tonleiter angibt (z.B. C-Dur) dann kommt eine Melodie in C-Dur. Und wenn man eine andere eingibt, kommt die gleiche Melodie in der anderen. Die Melodie würde ich dann selber spielen und einbauen.

Ich habe es schonmal geschafft, dass wenn ich ausführe eine Melodie kommt. Doch wie mache ich, dass der Nutzer erst eingeben muss, wie die Melodie ist? Dachte mir so mit if, weiß aber von selbst nicht genau wie das geht.

Würde mich sehr über Hilfe freuen!
 

Cherryrose

Mitglied
Die Buttons erscheinen nicht.

Java:
package samples;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Gui extends JFrame implements ActionListener{
	private static final long serialVersionUID = 1L;
	
	public final static Dimension GUI_SIZE = new Dimension(400,300);
	public final static String GUI_TITLE = "Audio Player v1.0";
	
	private JPanel contentPane;
	private JPanel headerPane;
	
	private JButton[] btns;
	
	public Gui() {
	
		setSize(GUI_SIZE);
		setTitle(GUI_TITLE);
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		setLocationRelativeTo(null);
		
		this.contentPane = new JPanel(new GridLayout(3,2,20,20));
		this.contentPane.setBorder(BorderFactory.createEmptyBorder(30, 30, 30, 30));
		
		this.headerPane = new JPanel();
		
		this.btns = new JButton[6];
		
		createComponents();
	}        
	
	private void createComponents(){
		
		JLabel header = new JLabel("<Html>Mit welchem Instrument soll 'Suit'<br>"                
				+ "von R.CH.Martin gespielt werden ?</Html>", JLabel.CENTER);
		
		Font newFont = header.getFont().deriveFont(14f);
		
		header.setFont(newFont);
		
		String[] label = {"Bandoneon","Harfe","Blockflöte","Klavier","Glockenspiel","Orgel"};
		
		for (int i = 0; i < btns.length; i++) {
			btns[i] = new JButton(label[i]);
			btns[i].addActionListener(this);
		}
		
		for (int i = 0; i < btns.length; i++) {
			contentPane.add(btns[i]);
		}                        
		
		this.headerPane.add(header);
		
		this.add(BorderLayout.PAGE_START, headerPane);
		this.add(BorderLayout.CENTER, contentPane);
		}
   
    public void actionPerformed(ActionEvent e) {
    	switch(e.getActionCommand()){      
    	case "Bandoneon":
    		System.out.println("Test : " + e.getActionCommand());
    		break;
    	case "Harfe":
    		System.out.println("Test : " + e.getActionCommand());
    		break;
    	case "Blockflöte":
    		System.out.println("Test : " + e.getActionCommand());
    		break;
    	case "Klavier":
    		System.out.println("Test : " + e.getActionCommand());
    		break;
    	case "Glockenspiel":
    		System.out.println("Test : " + e.getActionCommand());
    		break;
    	case "Orgel":
    		System.out.println("Test : " + e.getActionCommand());
    		break;
    	}
    }
}
 

kaoZ

Top Contributor
:D

Du musst natürlich auch in unserer AudioTest.java

folgendes ändern :)

Java:
public static void main(String[] args) {
	  
		//new AudioTest().startSession();
		
		new Gui().setVisible(true);  // <<---
		
    }
 

fLooojava

Bekanntes Mitglied
Ich funk mal dazwischen.

@kaoZ:
Weshalb generierst du die Buttons + Labels mit Schleifen? Macht das Sinn, für spätere Änderungen? Du legst hier ja doch ein statisches JButton Objekt mit 6 Objekten an, sprich auch hier müsste man dann eine Änderung vornehmen.

Würde mich interessieren, ansonsten ganz nettes Projekt!


flo
 
Zuletzt bearbeitet:

kaoZ

Top Contributor
Ok dann weiter im Text, da wir das ganze ja nicht nach einem Design Pattern wie z.B MVC umsetzen , werden wir einfach unserer Gui als Attribut eine Referenz auf unseren AudioPlayer geben.

Java:
public class Gui extends JFrame implements ActionListener{
    private static final long serialVersionUID = 1L;

    public final static Dimension GUI_SIZE = new Dimension(400,300);
    public final static String GUI_TITLE = "Audio Player v1.0";

    
    private JPanel contentPane;
    private JPanel headerPane;
    
    private AudioPlayer player;  // <<---
    
    private JButton[] btns;
    
	public Gui(Sound...sounds) {...}

in unserem Konstruktor der Klasse Gui werden wir nun diesen initialisieren, außerdem werden wir hier gleich die möglichkeit geben eine playlist an die Gui und somit an den Konstruktor des AudioPlayers zu geben :

Java:
	public Gui(Sound...sounds) {  // <<---
	   
		setSize(GUI_SIZE);
		setTitle(GUI_TITLE);
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		setLocationRelativeTo(null);
		
		this.contentPane = new JPanel(new GridLayout(3,2,20,20));
		this.contentPane.setBorder(BorderFactory.createEmptyBorder(30, 30, 30, 30));
		
		this.headerPane = new JPanel();
		
		this.btns = new JButton[6];
		
		this.player = new AudioPlayer(sounds);  // <<--
		
		createComponents();
    }

nun werden wir noch über unseren listener definieren was beim klick auf die einzelnen Buttons passieren soll, also werden wir an dieser Stelle in der Gui folgenden code in der actionPerformed Methode abändern :

Java:
@Override
    public void actionPerformed(ActionEvent e) {
		
	  switch(e.getActionCommand()){
	  case "Bandoneon":
		  player.play(player.getSongByName("one"));
		  break;
	  case "Harfe":
		  player.play(player.getSongByName("two"));
		  break;
	  case "Blockflöte":
		  player.play(player.getSongByName("three"));
		  break;
	  case "Klavier":
		  player.play(player.getSongByName("four"));
		  break;
	  case "Glockenspiel":
		  player.play(player.getSongByName("five"));
		  break;
	  case "Orgel":
		  //player.play(player.getSongByName(""));
		  break;
	  }
    }

Der gesamte Quelltext sollte nun so aussehen :

Java:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Gui extends JFrame implements ActionListener{
    private static final long serialVersionUID = 1L;

    public final static Dimension GUI_SIZE = new Dimension(400,300);
    public final static String GUI_TITLE = "Audio Player v1.0";

    
    private JPanel contentPane;
    private JPanel headerPane;
    
    private AudioPlayer player;
    
    private JButton[] btns;
    
	public Gui(Sound...sounds) {
	   
		setSize(GUI_SIZE);
		setTitle(GUI_TITLE);
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		setLocationRelativeTo(null);
		
		this.contentPane = new JPanel(new GridLayout(3,2,20,20));
		this.contentPane.setBorder(BorderFactory.createEmptyBorder(30, 30, 30, 30));
		
		this.headerPane = new JPanel();
		
		this.btns = new JButton[6];
		
		this.player = new AudioPlayer(sounds);
		
		createComponents();
    }
	
	private void createComponents(){
		
		JLabel header = new JLabel("<Html>Mit welchem Instrument soll 'Suit'<br>"
				+ "von R.CH.Martin gespielt werden ?</Html>", JLabel.CENTER);
		
		Font newFont = header.getFont().deriveFont(14f);
		
		header.setFont(newFont);
	
		String[] label = {"Bandoneon","Harfe","Blockflöte","Klavier","Glockenspiel","Orgel"};
		
		for (int i = 0; i < btns.length; i++) {
	        btns[i] = new JButton(label[i]);
	        btns[i].addActionListener(this);
        }
		
		for (int i = 0; i < btns.length; i++) {
	        contentPane.add(btns[i]);
        }
		
		
		this.headerPane.add(header);
		
		this.add(BorderLayout.PAGE_START, headerPane);
		this.add(BorderLayout.CENTER, contentPane);	
	}

	@Override
    public void actionPerformed(ActionEvent e) {
		
	  switch(e.getActionCommand()){
	  case "Bandoneon":
		  player.play(player.getSongByName("one"));
		  break;
	  case "Harfe":
		  player.play(player.getSongByName("two"));
		  break;
	  case "Blockflöte":
		  player.play(player.getSongByName("three"));
		  break;
	  case "Klavier":
		  player.play(player.getSongByName("four"));
		  break;
	  case "Glockenspiel":
		  player.play(player.getSongByName("five"));
		  break;
	  case "Orgel":
		  //player.play(player.getSongByName(""));
		  break;
	  }
    }
}

In der Klasse AudioTest erzeugen wir nun ein Sound Array was uns als Playlist für unseren Player dient, und übergeben diesen an unsere Gui und somit an den dadurch referenzierten AudioPlayer:

Java:
	public static void main(String[] args) {
	  
		String path = "L:/OpenOffice/share/gallery/sounds/";
		
		Sound[] playlist = new Sound[5];
		
		playlist[0]	= new Sound("one",path + "cow.wav");
		playlist[1] = new Sound("two",path + "curve.wav");
		playlist[2]	= new Sound("three",path + "drama.wav");
		playlist[3] = new Sound("four",path + "explos.wav");
		playlist[4] = new Sound("five",path + "falling.wav");
		
		//new AudioTest().startSession();
		new Gui(playlist).setVisible(true);
		
    }

wenn du die Anwendung nun startest , solltest du sehen können das zwar der Sound Abgespielt wird, aber solange dies der Fall ist der Button den du betätigst hast quasi blockiert wird und gedrückt bleibt, dies liegt daran das das abspielen der Sounds hier im gleichen Thread passiert
in welchem auch die Gui arbeitet , dieser nennt sich EDT, und man sollte immer vermeiden, längere und komplexe Aktionen in diesem Thread auszuführen , da sonst eben das Gui solange blockiert wird , wie die zusätzlich ausgeführte Aktion andauert.

Also wird der nächste logische Schritt sein das wir das abspielen der Sounds in einen Separaten Thread auslagern müssen und Benutzeraktionen nicht zu behindern.


Wenn du soweit bist und es ausprobiert hast und alles so funtkioniert wie es hier beschrieben ist getst weiter, wir sind nichtmehr weit vom Ziel entfernt :p
 
Zuletzt bearbeitet:

kaoZ

Top Contributor


@kaoZ:
Weshalb generierst du die Buttons + Labels mit Schleifen? Macht das Sinn, für spätere Änderungen? Du legst hier ja doch ein statisches JButton Objekt mit 6 Objekten an, sprich auch hier müsste man dann eine Änderung vornehmen.


Einfach der Übersichtlichkeits halber, ist aber geschmackssache,

klar könnte man auch jeden Button über eine eigenes Attribut definieren, ich finde aber bei solch kleinen Projekten wesentlich übersichtlicher.

Zudem spare ich mir nen haufen Source Code , man könnte sogar noch weiter gehen und das ganze in einer doppelten for schleifen machen , dann allerdings wird das ganze ziemlich kryptisch.

wenn ich dann einen speziellen button benötige kann ich diesen immernoch über seinen index im Array ansprechen.

zudem spar ich mir sowas hier:

Java:
conentPane.add(btn1);
contentPane.add(btn2);

usw... usw..

[EDIT]Wenn du natürlich im Vorfeld schon weißt das sich der ButtonText ggf. ändern könnte , vielleicht weil du ihn über die Songs in der Playlist generieren würdest, dann kannst du die Buttons auch einzeln als Attribut der Gui deklarieren, würde aber auch mit einem Array wie in meinem Beispiel funktionieren.[/EDIT]

[EDIT]

Du legst hier ja doch ein statisches JButton Objekt mit 6 Objekten an

ich lege ein Datencontainer (Array) mit platz für 6 JButtons an , statisch ist dies nicht.
[/EDIT]
 
Zuletzt bearbeitet:

Cherryrose

Mitglied
Also ich hab versucht das so zu machen, aber ersetzt man mit dem was du zum AudioPlayer geschrieben hast das andere wo die files schon definiert sind?

Ich hab das probiert, hab auch mit beiden probiert, aber es kommen immer nur Fehlermeldungen.

Java:
package samples;

import java.util.Scanner; 
//Die Klasse Scanner ist in dem Paket java.util definiert.


public class AudioTest2 {
	
	 Scanner sc; 
	 AudioPlayer player;
	 String path;
	 
//sc repräsentiert den Scanner, der Scanner definiert Methoden zum Einlesen von Dateien	
	
	 public AudioTest2() {
		 sc = new Scanner(System.in);  //Der Scanner liest normalerweise eine Datenquelle, hier die Konsolenangabe.
		 player = new AudioPlayer();
		 path = "C:/Users/Ela/Music/"; //Der Pfad zu der .wav Datei, welcher abgespiel werden soll.

		 fillPlaylist();               //Diese Methode initialisiert die Playlist
    }
	
	
//Die Sounddateien werden in der Playlist angegeben, um sie dann als Nutzer auszuwählen.
	     
	
	public static void main1(String[] args) {
		
		String path = "C:/Users/Ela/Music/";
		Sound[] playlist = new Sound[6];
		
		playlist[0] = new Sound("one",path + "Bandoneon.wav");
		playlist[1] = new Sound("two",path + "Blockflöte.wav");
		playlist[2] = new Sound("three",path + "Glockenspiel.wav");
		playlist[3] = new Sound("four",path + "Harfe.wav");
		playlist[4] = new Sound("five",path + "Klavier.wav");
		playlist[5] = new Sound("six",path + "Orgel.wav");
		
		new Gui(playlist).setVisible(true);
	}
	
	public void startSession(){       
		boolean running = true;
		
		 System.out.println("Hier können Sie sich für ein Instrument entscheiden, auf dem das Lied 'Suit' von R.Ch.Martin gespielt werden soll!");
		 System.out.println("");
		 System.out.println("1. Geben Sie als erstes 'Instrument' ein, um eine Übersicht zu erhalten.");
		 System.out.println("2. Als nächstes geben Sie den Namen eines Instrumentes ein, um sie abzuspielen. Dies können Sie beliebig oft wiederholen.");
		 System.out.println("3. Wenn Sie den Player beenden wollen, geben Sie 'stop' ein.");
		 System.out.println("");
		 System.out.println("***********************************************************************************************");
		 
		 while (running) {            
			 String input = sc.nextLine();
		 
			 if (input.equals("Instrument")) {
			 
				 System.out.println("");
				
			 
				 for (int i = 0; i < player.getPlayList().size(); i++) {
					 System.out.println(player.getPlayList().get(i).getName()); 
					 
				 } 
			 	 continue;
		}                       
		if(input.equals("stop")) {
			 running = false;
			 sc.close();
			 System.out.println("Der Player wurde beendet. Hoffentlich haben Sie die Musik genossen!");
			 System.out.println("Ich wünsche Ihnen noch einen schönen Tag!");
		}    
		 
		while(running){
			System.out.println("Das Lied wird mit " + input + " gespielt. Viel Vergnügen!");
			player.play(player.getSongByName(input));
			break; 
		

			}
		 }
	}
	public AudioPlayer getPlayer()              {return this.player;}
	
	public static void main(String[] args) { 
		new Gui().setVisible(true);
		
//Die Main Methode dient dazu um das Programm zu starten und die startSession(); Methode aufzurufen.
		}
}
 

kaoZ

Top Contributor
Du sollst keine neue main Methode hinzufügen!

du kannst alles in der Klasse AudioTest so lassen wie es war , und in dessen main Methode fügst du lediglich diesen Quelltext hinzu:

Wir erzeugen hier KEINE Instanz unserer Klasse AudioTest, da diese nur für unsere Konsolenversion ausschlagebend ist!

Java:
public static void main(String[] args) {
	  
		String path = "L:/OpenOffice/share/gallery/sounds/";
		
		Sound[] playlist = new Sound[5];
		
		playlist[0]	= new Sound("one",path + "cow.wav");
		playlist[1] = new Sound("two",path + "curve.wav");
		playlist[2]	= new Sound("three",path + "drama.wav");
		playlist[3] = new Sound("four",path + "explos.wav");
		playlist[4] = new Sound("five",path + "falling.wav");
		
		//new AudioTest().startSession();
		new Gui(playlist).setVisible(true);
		
    }


Hier mal die ganze Klasse AudioTest wie sie aussehen sollte
Java:
import java.util.Scanner;



public class AudioTest {
	
	Scanner sc;
	AudioPlayer player;
	String path;
	
	public AudioTest() {
	   sc = new Scanner(System.in);
	   player = new AudioPlayer();
	   path = "L:/OpenOffice/share/gallery/sounds/";
	   
	   fillPlaylist();
    }
	
	public void fillPlaylist(){
		
		Sound one	 = new Sound("one",path + "cow.wav");
		Sound two	 = new Sound("two",path + "curve.wav");
		Sound three	 = new Sound("three",path + "drama.wav");
		Sound four	 = new Sound("four",path + "explos.wav");
		Sound five	 = new Sound("five",path + "falling.wav");
		
		getPlayer().addToPlayList(one, two, three, four, five);
	}
	
	public void startSession(){
		boolean running = true;
		
        System.out.println("Willkommen beim AudioPlayer");
        System.out.println("***************************");
        System.out.println("- Gibt 'songlist' ein um eine Titelübersicht zu erhalten,");
        System.out.println("- gibt den Namen eines Sounds ein um ihn abzuspielen,");
        System.out.println("- gib 'remove' ein um einen Song aus der Playlist zu entfernen,");
        System.out.println("- oder 'stop' um den Player zu beenden.");
        System.out.println("_______________________________________");
        

		while (running) {
	        String input = sc.nextLine();
	        
	        if (input.equals("songlist")) {
	        	
	        	System.out.println("Songlist");
	        	System.out.println("********");
	        	
	            for (int i = 0; i < player.getPlayList().size(); i++) {
	                System.out.println("Sound " + i + ": " + player.getPlayList().get(i).getName());
                }
	            continue;
            }
	        
	        if (input.equals("remove")) {
	        	
	        	System.out.println("Geben Sie den Namen der Sounds ein den Sie entfernen möchten :");
	            
	        	String sound = sc.nextLine();
	        	
	        	for (int i = 0; i < player.getPlayList().size(); i++) {
	                if (player.getPlayList().get(i).getName().equals(sound)) {
	                    player.removeFromPlayList(sound);
                    }
                }
	        	continue;
            }
	        
	        if(input.equals("stop")) {
	            running = false;
	            sc.close();
            }
	        
	        while(running){
	        	player.play(player.getSongByName(input));
	        	break;
	        }
        }
	}
	
	public AudioPlayer getPlayer() 				{return this.player;}

	public static void main(String[] args) {
	  
		String path = "L:/OpenOffice/share/gallery/sounds/";
		
		Sound[] playlist = new Sound[5];
		
		playlist[0]	= new Sound("one",path + "cow.wav");
		playlist[1] = new Sound("two",path + "curve.wav");
		playlist[2]	= new Sound("three",path + "drama.wav");
		playlist[3] = new Sound("four",path + "explos.wav");
		playlist[4] = new Sound("five",path + "falling.wav");
		
		//new AudioTest().startSession();  // <<-- auskommentiert da nicht benutzt!
		new Gui(playlist).setVisible(true);
		
    }
}

Ich wollte dir damit eigentlich zeigen das du sowohl die Konsolenversion nutzen als auch die GuiVersion nutzen kannst, je nachdem von welcher Klasse du eine Instanz erzeugst, AudioTest für die KonsolenVersion, und Gui für die Version mit Grafischer Darstellung, wenn du das nicht nachvollziehen kannst können wir sonst auch eine gesonderte Klasse erstellen die die main Methode beinhaltet, falls dich das zu sehr verunsichern sollte
 
Zuletzt bearbeitet:

Cherryrose

Mitglied
Achso, alles klar ;)

Jetzt hab ich es so gemacht und dann erscheint die fehlermeldung:

Exception in thread "main" java.lang.NullPointerException
at samples.AudioPlayer.addToPlayList(AudioPlayer.java:24)
at samples.AudioPlayer.<init>(AudioPlayer.java:20)
at samples.Gui.<init>(Gui.java:44)
at samples.AudioTest2.main(AudioTest2.java:102)
 

kaoZ

Top Contributor
änder mal bitte in der Klasse AudioPlayer :

den 2ten Konstruktor von

Java:
 public AudioPlayer(Sound...songs) {
    	super();
        addToPlayList(songs);
    }

in

Java:
 public AudioPlayer(Sound...songs) {
    	playList = new ArrayList<>();
        addToPlayList(songs);
    }

keine Ahnung was mich da geritten hat
Code:
super();
hinzuschreiben, das ist nämlich völliger blödsinn ^^

nun sollte es soweit gehen das der Sound abspielt , aber der Button solange gedrückt bleibt, darum kümmern wir uns dann jetzt.
 
Zuletzt bearbeitet:

Cherryrose

Mitglied
Hab den fehler grade selbst gemerkt!

Also bei mir bleibt der Button so lange gedrückt wie das Lied lang ist, danach kann ich ein weiteres auswählen! :) Das ist doch das was ich wollte, oder fällt da noch etwas?
 
Zuletzt bearbeitet:

kaoZ

Top Contributor
ja eins fehlt noch :)

um genau dies zu beheben , werden wir die play() Methode der Klasse AudioPlayer , so um schrieben das das Abspielen der Sounds in einem eigenen Thread stattfindet:

nun kannst du sogar mehrere Sounds gleichzeitig abspielen , da jeder Sound in einem Separaten Thread abgespielt wird.

dies lässt sich ganz einfach folgendermaßen umsetzen :

hier hab ich mal den alten teil auskommentiert :

Java:
public void play(Sound song){
    	
    	try{
    		new Thread(){
    			@Override
    			public void run(){
    				try {
    			        AudioInputStream stream = AudioSystem.getAudioInputStream(song.getFile());
    			        AudioFormat audioFormat = stream.getFormat();
    			        DataLine.Info info = new DataLine.Info(Clip.class, audioFormat);
    			        Clip clip = (Clip) AudioSystem.getLine(info);
    			        clip.open(stream);
    			        clip.start();
    			        
    			        while(clip.getFramePosition() < clip.getFrameLength()) {
    			        	
    			        	 // Nur zum testen so implementiert
    			        };
    		 
    		        } catch (Exception e) {
    			        if (song == null) {
    			           	JOptionPane.showMessageDialog(null, "Sound wurde nicht gefunden !");
    		            }
    		        }
    			}
    		}.start();
    	}
    	catch(Exception ex){
    		ex.printStackTrace();
    	}
    	
    /*	try {
	        AudioInputStream stream = AudioSystem.getAudioInputStream(song.getFile());
	        AudioFormat audioFormat = stream.getFormat();
	        DataLine.Info info = new DataLine.Info(Clip.class, audioFormat);
	        Clip clip = (Clip) AudioSystem.getLine(info);
	        clip.open(stream);
	        clip.start();
	        
	        while(clip.getFramePosition() < clip.getFrameLength()) {
	        	
	        	 // Nur zum testen so implementiert
	        };
 
        } catch (Exception e) {
	        if (song == null) {
	           	System.out.println("Song wurde nicht in der Playlist gefunden, oder Existiert nicht !");
            }
        } */
    }

hier wird nun bei jedem aufruf dieser Methode ein neuer Thread gestartet, dessen Task , oder in dem Fall Runnable es ist die Daten aus dem Stream zu lesen, in einen Clip umzuwandeln und abzuspielen.

[EDIT]
Zugegeben das mit der Fehlerbehandlung ist eher unschön und Suboptimal , aber für ein einfaches Beispiel ausreichend und funktionsfähig!
[/EDIT]

Du kannst nun selbst bestimmen, ob du deine Anwendung in der Konsolenversion, oder mit der Gui startest.

dies kannst du in der Klasse AudioTest.java ganz einfach ausprobieren indem du ganz mal an dieser Stelle die Gui auskommentierst und eine Instanz der Klasse AudioTest erstellst

Java:
public static void main(String[] args) {
	  
		String path = "L:/OpenOffice/share/gallery/sounds/";
		
		Sound[] playlist = new Sound[5];
		
		playlist[0]	= new Sound("one",path + "cow.wav");
		playlist[1] = new Sound("two",path + "curve.wav");
		playlist[2]	= new Sound("three",path + "drama.wav");
		playlist[3] = new Sound("four",path + "explos.wav");
		playlist[4] = new Sound("five",path + "falling.wav");
		
		//new AudioTest().startSession(); // <-- ohne Gui
		new Gui(playlist).setVisible(true); // <-- mit Gui
		
    }
 
Zuletzt bearbeitet:

Cherryrose

Mitglied
Das mit dem selbst bestimmen habe ich anders geregelt, ich habe AudioTest2 erstellt und das ist für GUI und das normale für Konsole, also das hatte ich schon. ;)

Jetz habe ich Audioplayer bearbeitet und bei mir erscheint eine fehlermeldung, zudem ist "getPlayList().add" ; "(song.getFile());" ; "(song == null)" unterstrichen und auch die aller letzte } Klammer
Java:
//Der AudioPlayer spielt die Sounds ab.
package samples;

import java.util.ArrayList;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;

public class AudioPlayer {

	private ArrayList<Sound> playList; 
	public AudioPlayer() {                            //Mit "public ..." werden die Methoden definiert ↓
		playList = new ArrayList<>();
		}
	public AudioPlayer(Sound...songs) {
		playList = new ArrayList<>();
		addToPlayList(songs);
		}
	public void addToPlayList(Sound...songs){
		for (Sound sound : songs) {
			getPlayList().add(sound);
			} 
		}
	public void removeFromPlayList(Sound sound){
		for (int i = 0; i < playList.size(); i++) {
			if (playList.get(i).getName().equals(sound)) {
				playList.remove(i);
				}
			}
		}
	        public Sound getSongByName(String name)
	        {                Sound sound = null;
	        for (int i = 0; i < playList.size(); i++) {
	        	if (playList.get(i).getName().equals(name)) {
	        		sound = playList.get(i);
	        		}
	        	}
	        return sound;
	        }
	        public void play(Sound song){
//Hier werden die Lieder abgespielt.
	        	 try{
	        		 new Thread(){
	        			 @Override
	        			 public void run(){
	        				 try { 
	        					 AudioInputStream stream = AudioSystem.getAudioInputStream(song.getFile());
	        					 AudioFormat audioFormat = stream.getFormat();
	        					 DataLine.Info info = new DataLine.Info(Clip.class, audioFormat);
	        					 Clip clip = (Clip) AudioSystem.getLine(info);
	        					 clip.open(stream);
	        					 clip.start();
	        					 
	        					 while(clip.getFramePosition() < clip.getFrameLength()) {
	        						 // Nur zum testen so implementiert
	        					 };
	        				 } catch (Exception e) {
	        					 if (song == null) {
	        						 System.out.println("Song wurde nicht in der Playlist gefunden, oder Existiert nicht !");
	        					 }
	        				 }
	        			 }
	        		 }.start();
	        	 }       
	        	 catch(Exception ex){
	        		 ex.printStackTrace();
	        	 }
	        }
	        	 
// Auch die Playlist kann durch ein mehrfaches Eingeben wiederholt werden.
 
Zuletzt bearbeitet:

kaoZ

Top Contributor
da fehlt unten auch eine Klammer , und der öffentliche Getter , also die Methode
Code:
getPlayList()
;)

Java:
import java.util.ArrayList;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;
import javax.swing.JOptionPane;

public class AudioPlayer {
    
    private ArrayList<Sound> playList;
    
    public AudioPlayer() {
        playList = new ArrayList<>();
    }
    
    public AudioPlayer(Sound...songs) {
    	playList = new ArrayList<>();
        addToPlayList(songs);
    }
 
    public void addToPlayList(Sound...songs){
        for (Sound sound : songs) {
            getPlayList().add(sound);
        }
    }
    
    public void removeFromPlayList(String sound){
        for (int i = 0; i < playList.size(); i++) {
            if (playList.get(i).getName().equals(sound)) {
                playList.remove(i);
            }
        }
        System.out.println(sound + " wurde aus der Playlist entfernt!");
    }
    
    //Achtung , kann NPE auslösen , hier ist handlungsbedarf !
    
    public Sound getSongByName(String name){
        
        Sound sound = null;
        
        for (int i = 0; i < playList.size(); i++) {
            if (playList.get(i).getName().equals(name)) {
               sound = playList.get(i);
            }
        }
        return sound;
        
    }
    
    public void play(Sound song){
    	
    	try{
    		new Thread(){
    			@Override
    			public void run(){
    				try {
    			        AudioInputStream stream = AudioSystem.getAudioInputStream(song.getFile());
    			        AudioFormat audioFormat = stream.getFormat();
    			        DataLine.Info info = new DataLine.Info(Clip.class, audioFormat);
    			        Clip clip = (Clip) AudioSystem.getLine(info);
    			        clip.open(stream);
    			        clip.start();
    			        
    			        while(clip.getFramePosition() < clip.getFrameLength()) {
    			        	
    			        	 // Nur zum testen so implementiert
    			        };
    		 
    		        } catch (Exception e) {
    			        if (song == null) {
    			           	JOptionPane.showMessageDialog(null, "Sound wurde nicht gefunden !");
    		            }
    		        }
    			}
    		}.start();
    	}
    	catch(Exception ex){
    		ex.printStackTrace();
    	}
    }

    public ArrayList<Sound> getPlayList()       {return this.playList;}
}
 
Zuletzt bearbeitet:

Cherryrose

Mitglied
Jetzt ist immernoch was unterstrichen und wenn ich Klavier eingeben kommt das:

Klavier
Das Lied wird mit Klavier gespielt. Viel Vergnügen!
Exception in thread "Thread-1" java.lang.Error: Unresolved compilation problems:
Cannot refer to a non-final variable song inside an inner class defined in a different method
Cannot refer to a non-final variable song inside an inner class defined in a different method

at samples.AudioPlayer$1.run(AudioPlayer.java:51)
 

kaoZ

Top Contributor
Bei mir funktioniert es reibungslos mit Gui sowie in der Konsolenversion,

was steht in dieser Zeile bei dir ?

at samples.AudioPlayer$1.run(AudioPlayer.java:51)

und den Code der Klasse den du ausführen möchtest,

normalerweise sollte alles Funktionieren da wir die Variable song vom Typ Sound nur an einer Stelle in der inneren Klasse verwenden,

ansonsten füge an dieser stelle mal ein final hinzu:

Java:
 public void play(final Sound song){  // <---
    	
    	try{
    		new Thread(){
    			@Override
    			public void run(){
    				try {
    			        AudioInputStream stream = AudioSystem.getAudioInputStream(song.getFile());
    			        AudioFormat audioFormat = stream.getFormat();
    			        DataLine.Info info = new DataLine.Info(Clip.class, audioFormat);
    			        Clip clip = (Clip) AudioSystem.getLine(info);
    			        clip.open(stream);
    			        clip.start();
    			        
    			        while(clip.getFramePosition() < clip.getFrameLength()) {
    			        	
    			        	 // Nur zum testen so implementiert
    			        };
    		 
    		        } catch (Exception e) {
    			        if (song == null) {
    			           	JOptionPane.showMessageDialog(null, "Sound wurde nicht gefunden !");
    		            }
    		        }
    			}
    		}.start();
    	}
    	catch(Exception ex){
    		ex.printStackTrace();
    	}
    }
 
Zuletzt bearbeitet:

Cherryrose

Mitglied
Mit final ist es besser, aber wenn ich was falsches eingebe erscheint nicht das was soll, sondern er will das falsche abspielen.

Java:
//Der AudioPlayer spielt die Sounds ab.
package samples;

import java.util.ArrayList;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;
import javax.swing.JOptionPane;

public class AudioPlayer {

	private ArrayList<Sound> playList; 
	public AudioPlayer() {                            //Mit "public ..." werden die Methoden definiert ↓
		playList = new ArrayList<>();
		}
	public AudioPlayer(Sound...songs) {
		playList = new ArrayList<>();
		addToPlayList(songs);
		}
	public void addToPlayList(Sound...songs){
		for (Sound sound : songs) {
			getPlayList().add(sound);
			} 
		}
	public void removeFromPlayList(Sound sound){
		for (int i = 0; i < playList.size(); i++) {
			if (playList.get(i).getName().equals(sound)) {
				playList.remove(i);
			}
		}
		System.out.println(sound + " wurde aus der Playlist entfernt!");
	}
	        public Sound getSongByName(String name)
	        {                Sound sound = null;
	        for (int i = 0; i < playList.size(); i++) {
	        	if (playList.get(i).getName().equals(name)) {
	        		sound = playList.get(i);
	        		}
	        	}
	        return sound;
	        }
	        public void play(final Sound song){
	        	try{
	        		new Thread(){
	        			@Override
	        			public void run(){
	        				try {
	        					AudioInputStream stream = AudioSystem.getAudioInputStream(song.getFile());
	        					AudioFormat audioFormat = stream.getFormat();
	        					DataLine.Info info = new DataLine.Info(Clip.class, audioFormat);
	        					Clip clip = (Clip) AudioSystem.getLine(info);
	        					clip.open(stream);
	        					clip.start();
	        					
	        					while(clip.getFramePosition() < clip.getFrameLength()) {
	        				 
	        					};
	        					
	        				 } catch (Exception e) {
	        					 if (song == null) {
	        						 JOptionPane.showMessageDialog(null, "Sound wurde nicht gefunden !");
	        					}
	        				}
	        			}
	        		}.start();
	        	 }       
	        	 catch(Exception ex){
	        		 ex.printStackTrace();
	        	 }
	        }
	        public ArrayList<Sound> getPlayList()       {return this.playList;}
} 
// Auch die Playlist kann durch ein mehrfaches Eingeben wiederholt werden.
 
Zuletzt bearbeitet:

kaoZ

Top Contributor
Das liegt daran das wie uns noch nicht um anständige Fehler/Ausnahme Behandlung Gekümmert haben, hatte ich aber schon mehrfach erwähnt :) bin jetzt allerdings auch erstmal unterwegs.
Schaue mir das später nochmal an
 

kaoZ

Top Contributor
Um dies zu umgehen das wenn du etwas eingibst was in der Playlist nicht existiert könntest du folgendes machen, da du ja 2 Versionen hast, hier eine lösung für die Konsolenvariante des Players :

Hier in der p
Code:
lay()
Methode des AudioPlayers

Java:
public void play(final Sound song){
 
    	new Thread(){
    		@Override
    		public void run(){
    			try {
    				AudioInputStream stream = AudioSystem.getAudioInputStream(song.getFile());
					AudioFormat audioFormat = stream.getFormat();
					DataLine.Info info = new DataLine.Info(Clip.class, audioFormat);
			        Clip clip = (Clip) AudioSystem.getLine(info);
			        clip.open(stream);
			        clip.start();
			        
			        while(clip.getFramePosition() < clip.getFrameLength()) {};
			        
                } catch (NullPointerException | IOException | UnsupportedAudioFileException | LineUnavailableException  e) {
                	
                	if (e instanceof NullPointerException) {
	                    System.out.println("Dieser Song exestiert in der PlayList nicht !");
                    }
                	else{
                    	System.out.println("Folgender Fehler ist augetretten : " + e.toString());
                		
                		//JOptionPane.showMessageDialog(null, "Folgender Fehler ist aufgetretten : " + e.toString());
    	                
    	                /* Muti-Catch lösung, hier wird bei einem Fehler die Anwendung weiter Ausgeführt,
    	                 * bei einer NPE wird hier gesondert ausgegeben das ein Sound mit diesem Namen nicht
    	                 * in der Playlist existiert, anderfalls wird
    	                 * der User aber über das Auftreten eines nicht normalen
    	                 * Programmverhaltens informiert! 
    	                 */
                	}
                }
    		}
    	}.start();
    }
 

kaoZ

Top Contributor
Es gäbe auch noch die Möglichkeit im Methodenkopf zu deklarieren das eine Ausnahme geworfen werden könnte, dies würde man dann so deklarieren:

Java:
public void play(Sound song) throws Exception{....}

hier würde man dann die Exception an den Aufrufer dieser Methode delegieren und die Ausnahme nicht gleich behandeln, (hätten wir vorher gewusst das wir eine Gui Schreiben) hätte man gleich zu beginn dafür sorgen können hier mit Delegation zu arbeiten und die Fehlerbehandlung entweder durch die Gui, z.B durch das anzeigen eines Dialoges, oder durch die Klasse AudioTest in Form von gezielten und aussagekräftigen Konsolenausgaben zu realisieren.

Da wir bei der Gui Version hier selbst dafür verantwortlich sind welche sounds wir in die Playlist übergeben, können wir dies hier mehr oder weniger vernachlässigen da wir festlegen welcher Button welches Lied abspielt , anders bei der Konsolenversion, bei der der User ( und wir gehen im Normalfall immer vom DAU aus ) die Eingabe macht, wenn du nun die oben zuerst genannte Lösung nutzt sollte es so aussehen :

Code:
Willkommen beim AudioPlayer
***************************
- Gibt 'songlist' ein um eine Titelübersicht zu erhalten,
- gibt den Namen eines Sounds ein um ihn abzuspielen,
- gib 'remove' ein um einen Song aus der Playlist zu entfernen,
- oder 'stop' um den Player zu beenden.
_______________________________________
sdfsdf
Dieser Song existiert in dieser Playlist nicht !
 
Zuletzt bearbeitet:

kaoZ

Top Contributor
Hier nochmal eine übersicht der Klassen wie sie nun bei mir aussehen :

Java:
import java.io.File;

/**
 * 
 * @author kaoZ
 * 
 * Diese Klasse hat keine andere Funktion als lediglich
 * den Pfad und einen Namen zu einer AudioDatei zu speichern,
 * man könnte also sagen Objekte dieser Klasse sind unsere Sounds,
 * welche wir später abspielen wollen.
 *
 */

public class Sound {
	
	private String name;
	private File file;
	
	public Sound(String name, String filePath) {
		this.name = name;
		this.file = new File(filePath);
    }
	
	public String getName() 		{return this.name;}
	public File getFile() 			{return this.file;}
}

Java:
import java.io.IOException;
import java.util.ArrayList;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;

public class AudioPlayer {
    
    private ArrayList<Sound> playList;
    
    public AudioPlayer() {
        playList = new ArrayList<>();
    }
    
    public AudioPlayer(Sound...songs) {
    	playList = new ArrayList<>();
        addToPlayList(songs);
    }
 
    public void addToPlayList(Sound...songs){
        for (Sound sound : songs) {
            getPlayList().add(sound);
        }
    }
    
    public void removeFromPlayList(String sound){
        for (int i = 0; i < playList.size(); i++) {
            if (playList.get(i).getName().equals(sound)) {
                playList.remove(i);
            }
        }
        System.out.println(sound + " wurde aus der Playlist entfernt!");
    }
    
    //Achtung , kann NPE auslösen , hier ist handlungsbedarf !
    
    public Sound getSongByName(String name){
    
    	Sound sound = null;
    	
    	for (int i = 0; i < playList.size(); i++) {
	        if (playList.get(i).getName().equals(name)) {
	            sound = playList.get(i);
            }
        }
    	return sound;  
    }
    
    public void play(final Sound song){
 
    	new Thread(){
    		@Override
    		public void run(){
    			try {
    				AudioInputStream stream = AudioSystem.getAudioInputStream(song.getFile());
					AudioFormat audioFormat = stream.getFormat();
					DataLine.Info info = new DataLine.Info(Clip.class, audioFormat);
			        Clip clip = (Clip) AudioSystem.getLine(info);
			        clip.open(stream);
			        clip.start();
			        
			        while(clip.getFramePosition() < clip.getFrameLength()) {};
			        
                } catch (NullPointerException | IOException | UnsupportedAudioFileException | LineUnavailableException  e) {

                	if (e instanceof NullPointerException) {
	                    System.out.println("Dieser Song existiert in dieser Playlist nicht !");
                    }
                	else{
                		System.out.println("Folgender Fehler ist aufgetretten : " + e.toString());
                	}
                }
    		}
    	}.start();
    }

    public ArrayList<Sound> getPlayList()       {return this.playList;}
}

Java:
import java.util.Scanner;



public class AudioTest {
	
	Scanner sc;
	AudioPlayer player;
	String path;
	
	public AudioTest() {
	   sc = new Scanner(System.in);
	   player = new AudioPlayer();
	   path = "L:/OpenOffice/share/gallery/sounds/";
	   
	   fillPlaylist();
    }
	
	public void fillPlaylist(){
		
		Sound one	 = new Sound("one",path + "cow.wav");
		Sound two	 = new Sound("two",path + "curve.wav");
		Sound three	 = new Sound("three",path + "drama.wav");
		Sound four	 = new Sound("four",path + "explos.wav");
		Sound five	 = new Sound("five",path + "falling.wav");
		
		getPlayer().addToPlayList(one, two, three, four, five);
	}
	
	public void startSession(){
		boolean running = true;
		
        System.out.println("Willkommen beim AudioPlayer");
        System.out.println("***************************");
        System.out.println("- Gibt 'songlist' ein um eine Titelübersicht zu erhalten,");
        System.out.println("- gibt den Namen eines Sounds ein um ihn abzuspielen,");
        System.out.println("- gib 'remove' ein um einen Song aus der Playlist zu entfernen,");
        System.out.println("- oder 'stop' um den Player zu beenden.");
        System.out.println("_______________________________________");
        

		while (running) {
	        String input = sc.nextLine();
	        
	        if (input.equals("songlist")) {
	        	
	        	System.out.println("Songlist");
	        	System.out.println("********");
	        	
	            for (int i = 0; i < player.getPlayList().size(); i++) {
	                System.out.println("Sound " + i + ": " + player.getPlayList().get(i).getName());
                }
	            continue;
            }
	        
	        if (input.equals("remove")) {
	        	
	        	System.out.println("Geben Sie den Namen der Sounds ein den Sie entfernen möchten :");
	            
	        	String sound = sc.nextLine();
	        	
	        	for (int i = 0; i < player.getPlayList().size(); i++) {
	                if (player.getPlayList().get(i).getName().equals(sound)) {
	                    player.removeFromPlayList(sound);
                    }
                }
	        	continue;
            }
	        
	        if(input.equals("stop")) {
	            running = false;
	            sc.close();
            }
	        
	        while(running){
	                player.play(player.getSongByName(input));
	        	break;
	        }
        }
	}
	
	public AudioPlayer getPlayer() 				{return this.player;}

	public static void main(String[] args) {
	  
		String path = "L:/OpenOffice/share/gallery/sounds/";
		
		Sound[] playlist = new Sound[5];
		
		playlist[0]	= new Sound("one",path + "cow.wav");
		playlist[1] = new Sound("two",path + "curve.wav");
		playlist[2]	= new Sound("three",path + "drama.wav");
		playlist[3] = new Sound("four",path + "explos.wav");
		playlist[4] = new Sound("five",path + "falling.wav");
		
		new AudioTest().startSession();
		//new Gui(playlist).setVisible(true);
		
    }
}

Java:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Gui extends JFrame implements ActionListener{
    private static final long serialVersionUID = 1L;

    public final static Dimension GUI_SIZE = new Dimension(400,300);
    public final static String GUI_TITLE = "Audio Player v1.0";

    
    private JPanel contentPane;
    private JPanel headerPane;
    
    private AudioPlayer player;
    
    private JButton[] btns;
    
	public Gui(Sound...sounds) {
	   
		setSize(GUI_SIZE);
		setTitle(GUI_TITLE);
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		setLocationRelativeTo(null);
		
		this.contentPane = new JPanel(new GridLayout(3,2,20,20));
		this.contentPane.setBorder(BorderFactory.createEmptyBorder(30, 30, 30, 30));
		
		this.headerPane = new JPanel();
		
		this.btns = new JButton[6];
		
		this.player = new AudioPlayer(sounds);
		
		createComponents();
    }
	
	private void createComponents(){
		
		JLabel header = new JLabel("<Html>Mit welchem Instrument soll 'Suit'<br>"
				+ "von R.CH.Martin gespielt werden ?</Html>", JLabel.CENTER);
		
		Font newFont = header.getFont().deriveFont(14f);
		
		header.setFont(newFont);
	
		String[] label = {"Bandoneon","Harfe","Blockflöte","Klavier","Glockenspiel","Orgel"};
		
		for (int i = 0; i < btns.length; i++) {
	        btns[i] = new JButton(label[i]);
	        btns[i].addActionListener(this);
        }
		
		for (int i = 0; i < btns.length; i++) {
	        contentPane.add(btns[i]);
        }
		
		
		this.headerPane.add(header);
		
		this.add(BorderLayout.PAGE_START, headerPane);
		this.add(BorderLayout.CENTER, contentPane);	
	}

	@Override
    public void actionPerformed(ActionEvent e) {
		
		
	  switch(e.getActionCommand()){
	  case "Bandoneon":
		  player.play(player.getSongByName("one"));
		  break;
	  case "Harfe":
		  player.play(player.getSongByName("two"));
		  break;
	  case "Blockflöte":
		  player.play(player.getSongByName("three"));
		  break;
	  case "Klavier":
		  player.play(player.getSongByName("four"));
		  break;
	  case "Glockenspiel":
		  player.play(player.getSongByName("five"));
		  break;
	  case "Orgel":
		  //player.play(player.getSongByName(""));
		  break;
	  }
	}
}

Hierbei enthält die Klasse AudioTest die main Methode, diese könnte man auch einfach um ein besseres Verständniss dafür zu bekommen in eine andere beliebige Klasse auslagern , und die Klasse AudioTest.java z.B in KonsolenVersion.java umbenennen.
 

Cherryrose

Mitglied
Also ich habe jetzt AudioPlayer bearbeitet und er sieht nun so aus:

Java:
//Der AudioPlayer spielt die Sounds ab.
package samples;

import java.io.IOException;
import java.util.ArrayList;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.swing.JOptionPane;

public class AudioPlayer {

	private ArrayList<Sound> playList; 
	public AudioPlayer() {                            //Mit "public ..." werden die Methoden definiert ↓
		playList = new ArrayList<>();
		}
	public AudioPlayer(Sound...songs) {
		playList = new ArrayList<>();
		addToPlayList(songs);
		}
	public void addToPlayList(Sound...songs){
		for (Sound sound : songs) {
			getPlayList().add(sound);
			} 
		}
	        public Sound getSongByName(String name)
	        {                Sound sound = null;
	        for (int i = 0; i < playList.size(); i++) {
	        	if (playList.get(i).getName().equals(name)) {
	        		sound = playList.get(i);
	        		}
	        	}
	        return sound;
	        }
	        public void play(final Sound song) throws Exception{
	        	try{
	        		new Thread(){
	        			@Override
	        			public void run(){
	        				try {
	        					AudioInputStream stream = AudioSystem.getAudioInputStream(song.getFile());
	        					AudioFormat audioFormat = stream.getFormat();
	        					DataLine.Info info = new DataLine.Info(Clip.class, audioFormat);
	        					Clip clip = (Clip) AudioSystem.getLine(info);
	        					clip.open(stream);
	        					clip.start();
	        					
	        					while(clip.getFramePosition() < clip.getFrameLength()) {
	        				 
	        					};
	        					
	        				} catch (NullPointerException | IOException | UnsupportedAudioFileException | LineUnavailableException  e) {
	        					if (song == null) {
	        						JOptionPane.showMessageDialog(null, "Sound wurde nicht gefunden !");
	        					}                    
	        					else{
	        						System.out.println("Folgender Fehler ist aufgetretten : " + e.toString());
	        						}	
	        					}
	        				}
	        				
	        			}.start();
	        	 }       
	        	 catch(Exception ex){
	        		 ex.printStackTrace();
	        	 }
	        }
	        public ArrayList<Sound> getPlayList()       {return this.playList;}
} 
// Auch die Playlist kann durch ein mehrfaches Eingeben wiederholt werden.

Doch bei Gui wird bei jedem Instrument diese Zeile unterstrichen: player.play(player.getSongByName("Bandoneon"));
 

kaoZ

Top Contributor
Entferne das throws Exception in Methodenkopf der play Methode ;) da du im Catch block schon für behandlung eventuell auftretender Ausnahmen sorgst brauchst du das dort nicht.

Es war nur ein Beispiel wie man es anders machen könnte. :)
 
Zuletzt bearbeitet:

kaoZ

Top Contributor
Dad liegt daran das du in deiner Klasse AudioTest irgendwo die Ausgabe Erzeugst das der aktuelle Sound gespielt wird bevor geprüfte wird ob dieser vorhanden ist, poste mal deine Klasse AudioTest

[EDIT]da ich arbeiten bin Scheibe ich zzt. Von Handy aus, sonst muss ich heute abend nochmal drüber schauen :)[/EDIT]
 
Zuletzt bearbeitet:

Cherryrose

Mitglied
AudioTest
Java:
package samples;

import java.util.Scanner; 
//Die Klasse Scanner ist in dem Paket java.util definiert.


public class KonsolenVersion {
	
	 Scanner sc; 
	 AudioPlayer player;
	 String path;
	 
//sc repräsentiert den Scanner, der Scanner definiert Methoden zum Einlesen von Dateien	
	
	 public KonsolenVersion() {
		 sc = new Scanner(System.in);  //Der Scanner liest normalerweise eine Datenquelle, hier die Konsolenangabe.
		 player = new AudioPlayer();
		 path = "C:/Users/Ela/Music/"; //Der Pfad zu der .wav Datei, welcher abgespiel werden soll.

		 fillPlaylist();               //Diese Methode initialisiert die Playlist
    }
	
	public void fillPlaylist(){  
		
		Sound b = new Sound("Bandoneon",path + "Bandoneon.wav"); 
		Sound f = new Sound("Blockflöte",path + "Blockflöte.wav");
		Sound g = new Sound("Glockenspiel",path + "Glockenspiel.wav"); 
		Sound h = new Sound("Harfe",path + "Harfe.wav"); 
		Sound k = new Sound("Klavier",path + "Klavier.wav"); 
		Sound o = new Sound("Orgel",path + "Orgel.wav"); 
		
		getPlayer().addToPlayList(b, f, g, h, k, o);
//Die Sounddateien werden in der Playlist angegeben, um sie dann als Nutzer auszuwählen.
	}        
	
	public void startSession() throws Exception{       
		boolean running = true;
		
		 System.out.println("Hier können Sie sich für ein Instrument entscheiden, in der das Lied 'Suit' von R.Ch.Martin gespielt werden soll!");
		 System.out.println("");
		 System.out.println("1. Geben Sie als erstes 'Instrument' ein, um eine Übersicht zu erhalten.");
		 System.out.println("2. Als nächstes geben Sie den Namen eines Instrumentes ein, um sie abzuspielen. Dies können Sie beliebig oft wiederholen.");
		 System.out.println("3. Wenn Sie den Player beenden wollen, geben Sie 'stop' ein.");
		 System.out.println("");
		 System.out.println("***********************************************************************************************");
		 
		 while (running) {            
			 String input = sc.nextLine();
		 
			 if (input.equals("Instrument")) {
			 
				 System.out.println("");
				
			 
				 for (int i = 0; i < player.getPlayList().size(); i++) {
					 System.out.println(player.getPlayList().get(i).getName()); 
					 
				 } 
			 	 continue;
		}                       
		if(input.equals("stop")) {
			 running = false;
			 sc.close();
			 System.out.println("Der Player wurde beendet. Hoffentlich haben Sie die Musik genossen!");
			 System.out.println("Ich wünsche Ihnen noch einen schönen Tag!");
		}    
		 
		while(running){
			System.out.println("Das Lied wird mit " + input + " gespielt. Viel Vergnügen!");
			player.play(player.getSongByName(input));
			break; 

			}
		 }
	}
	public AudioPlayer getPlayer()              {return this.player;}
	
	public static void main(String[] args) throws Exception { 
		new KonsolenVersion().startSession();
		
//Die Main Methode dient dazu um das Programm zu starten und die startSession(); Methode aufzurufen.
		}
}
 

kaoZ

Top Contributor
Entferne in Zeile 69
Java:
System.out.println("Das Lied wird mit " + input + " gespielt. Viel Vergnügen!");

Oder versuche mal es hinter den Aufruf von play....
Einzufügen.
 
Zuletzt bearbeitet:

kaoZ

Top Contributor
Wenn du es entfernst, sollte der Sound abgespielt werden ohne dass es eine Meldung gibt, wenn du etwas falsches eingibst sollte die Meldung erscheinen das der Titel in der playlist nicht Vorhanden ist, zur Not kopierte aus meinen letzten Post die Klasse AudioPlayer und ersetze deine dadurch, wenn du unbedingt eine Ausgabe haben möchtest, welcher Sound abgespielt wird, müsste man dies in der Methode play Realisieren und zuvor Prüfen ob der Titel existiert, dies können wir gern machen, allerdings nicht vom Handy aus :)
 

Cherryrose

Mitglied
Ich krieg das nicht richtig hin, denke ich lass das einfachso, da ich nicht den ganzen Tag dafür Zeit habe.

In der Konsole steht jatzt das: Das Lied wird mit s gespielt. Viel Vergnügen!
Diese Instrument wurde doch nicht gefunden!
 

kaoZ

Top Contributor
Das "Problem" ist das du parallel versucht hast eigene features hinzuzufügen , welche aber mir nicht bekannt waren/sind, deswegen funktioniert meine Version hier bei mir reibungslos und deine in Verbindung mit meiner nicht ;)

Ich taste mich nochmal ganz langsam ran , also....

1. du musst nicht an jede Methode eine throws Deklaration anfügen, sondern

- nur da wo du das Exception Handling an den Aufrufer delegieren möchtest
- wo auch Exceptions geworfen werden können

2. wenn du möchstest das ausgegeben wird welcher Sound aktuell abgespielt wird, musst du dies
an folgender Stelle / folgendermaßen realisieren, wenn der eingegebene Sound nun nicht existiert wird hier schon beim Aufrufen geprüft oder null übergeben wurde, und wenn ja ein dementsprechender Hinweis ausgegeben :

Java:
 public void play(final Sound song){
    	
    	if (song == null) {
	        System.out.println("Dieser Sound existiert in der Playlist nicht !");
        }
    	else{
    		System.out.println("Es wird Sound " + song.getName() + " abgespielt , viel Spaß !");
    		
    		new Thread(){
        		@Override
        		public void run(){
        			try {
        				AudioInputStream stream = AudioSystem.getAudioInputStream(song.getFile());
    					AudioFormat audioFormat = stream.getFormat();
    					DataLine.Info info = new DataLine.Info(Clip.class, audioFormat);
    			        Clip clip = (Clip) AudioSystem.getLine(info);
    			        clip.open(stream);
    			        clip.start();
    			        
    			        while(clip.getFramePosition() < clip.getFrameLength()) {};
    			        
                    } catch (IOException | UnsupportedAudioFileException | LineUnavailableException  e) {

                    	System.out.println("Folgender Fehler ist aufgetretten : " + e.toString());
               
                    }
        		}
        	}.start();
        }
    }

da wir hier die play Methode nur in verbindung mit der Methode
Code:
[COLOR="Black"]getSongByName(String song){...}[/COLOR]
nutzen , und diese insofern der Sound nicht in der Playlist existieren sollte null zurück liefert, prüfen wir hier den eingabeparameter und falls null übergeben wurde geben wir eine entsprechende Meldung aus das der Sound nicht in der Liste existiert !


3. Exception Handling in separat zum Haupt Thread laufenden Threads ist um einiges Komplizierter als reguläres Exception Handling, da du hier beim Überschrieben der
Code:
run()
methode des Runnables keine throws deklaration hinzufügen kannst, sonder einen
Code:
ExceptionHandler
nutzen müsstest.

folgendermaßen sieht die Konsolenversion und dessen Ausgabe nach oben stehenden Modifikation nun aus :

Code:
Willkommen beim AudioPlayer
***************************
- Gibt 'songlist' ein um eine Titelübersicht zu erhalten,
- gibt den Namen eines Sounds ein um ihn abzuspielen,
- gib 'remove' ein um einen Song aus der Playlist zu entfernen,
- oder 'stop' um den Player zu beenden.
_______________________________________
sdfsdf
Dieser Sound existiert in der Playlist nicht !
three
Es wird Sound three abgespielt , viel Spaß !
 
Zuletzt bearbeitet:

Cherryrose

Mitglied
Ich habe ein letztes Problem...

Ich muss mein Programm per e-mail jemanden senden und dabei soll der jenige auch eclipse öffnen und alles so sehen wie ich es sehe. DasPproblem dabei ist, dass der Pfad zu den Songs auf meinem Rechner gespeichert ist, und wenn ich ihn verändern will, muss da dennoch C:/ oder sowas stehen und wenn ich dann versende wird die Musik nicht abgespielt.

Wie soll ich dass versenden, damit bei dem jenigen die Musik auch abspielt?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Push Nachrichten von JAVA EE App an Mobile App Java Basics - Anfänger-Themen 3
H .java Dateien in Eclipse einbinden und ausführen Java Basics - Anfänger-Themen 1
onlyxlia Schlüsselworte Was meint man mit "einen Typ" in Java erstellen? Java Basics - Anfänger-Themen 2
O Java Kara geschweifte Klammern Java Basics - Anfänger-Themen 2
richis-fragen Mausrad logitech kann links und rechts klick wie in java abragen. Java Basics - Anfänger-Themen 15
XWing Java Klssenproblem Java Basics - Anfänger-Themen 4
R Umgebungsvariable java -cp gibt immer Java-Hilfe... Java Basics - Anfänger-Themen 3
farbenlos Csv Datei in Java einlesen Java Basics - Anfänger-Themen 18
F TableModelListener: java.lang.ArrayIndexOutOfBoundsException: 132 Java Basics - Anfänger-Themen 3
G Java 8 - Support-Ende Java Basics - Anfänger-Themen 7
T Java Weihnachtsbaum + Rahmen Java Basics - Anfänger-Themen 1
N Will mit Java anfangen Java Basics - Anfänger-Themen 13
Ü Java Array - Buchstaben als Zahlen ausgeben Java Basics - Anfänger-Themen 22
M Java Iterator Verständnisfrage Java Basics - Anfänger-Themen 6
M Java Mail Programm Java Basics - Anfänger-Themen 4
Sniper1000 Java 391 für Windows Java Basics - Anfänger-Themen 37
J Java long- in int-Variable umwandeln Java Basics - Anfänger-Themen 6
JaZuDemNo Java im Studium Java Basics - Anfänger-Themen 7
E Java Programm zur anzeige, ob Winter- oder Sommerzeit herrscht Java Basics - Anfänger-Themen 62
I QR code in Java selber generieren Java Basics - Anfänger-Themen 5
V Java-Ausnahmebehandlung: Behandlung geprüfter Ausnahmen Java Basics - Anfänger-Themen 1
krgewb Java Streams Java Basics - Anfänger-Themen 10
A Überwältigt von der komplexen Java Welt Java Basics - Anfänger-Themen 29
O Mehrfachvererbung auf Spezifikations- und Implementierungsebene in Java. Interfaces Java Basics - Anfänger-Themen 19
John_Sace Homogene Realisierung von Generics in Java ? Java Basics - Anfänger-Themen 19
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
R mit Java API arbeiten Java Basics - Anfänger-Themen 9
P JDK installieren Probleme bei der Java-Installation Java Basics - Anfänger-Themen 8
S Java: Wie sortiere ich eine ArrayList benutzerdefinierter Objekte nach einem bestimmten Attribut? Java Basics - Anfänger-Themen 2
Timo12345 JNLP File mit Java öffnen Java Basics - Anfänger-Themen 2
S Video Editierung mit Java.._ Java Basics - Anfänger-Themen 2
F Einstelungen in Java - CursorBlinkRate Java Basics - Anfänger-Themen 10
A PHP $_POST["name"] in Java Java Basics - Anfänger-Themen 3
vivansai21 Is there a oneliner to create a SortedSet filled with one or multiple elements in Java? Java Basics - Anfänger-Themen 9
Athro-Hiro Weißes Bild in Java erstellen Java Basics - Anfänger-Themen 3
Arjunreddy Can someone please tell me how to use a debugger in BlueJ(a Java environment) Java Basics - Anfänger-Themen 1
M Java assoziationen (UML) Java Basics - Anfänger-Themen 8
H Excel-Tabellen mit Java erstellen Java Basics - Anfänger-Themen 4
Simon16 Java ArrayListe von einer Klasse sortieren Java Basics - Anfänger-Themen 2
P Wie kann ich in meinem Java Programm etwas dauerhaft speichern? Java Basics - Anfänger-Themen 5
H Nutzt Eclipse alle CPU-Threads beim Ausführen von Java-Programmen? Java Basics - Anfänger-Themen 4
xXGrowGuruXx Java einstieg, leichte sache 0 verstanden Java Basics - Anfänger-Themen 7
A java.sql.SQLException: Data type mismatch. Java Basics - Anfänger-Themen 1
H Java-Programm zur Ausgabe von Zuständen Java Basics - Anfänger-Themen 80
N Java Spiel Figur auf dem Hintergrundbild bewegen. Java Basics - Anfänger-Themen 11
G Kann Java-Programm nicht als jar aufrufen, auch als EXE nicht Java Basics - Anfänger-Themen 19
N Java Taschenrechner hat Jemand vlt einen Tipp dafür wie ich jetzt die buttons verbinden kann und das Ergebnis auf dem textfield anzeigen lassen kann Java Basics - Anfänger-Themen 13
A Lerngruppe Java Java Basics - Anfänger-Themen 2
G Help me in the Java Program Java Basics - Anfänger-Themen 2
L Java- Vererbung Java Basics - Anfänger-Themen 4
LimDul Suche Java Stream Tutorial Java Basics - Anfänger-Themen 2
_so_far_away_ Ich möchte Java lernen Java Basics - Anfänger-Themen 11
benny1993 Java Programm erstellen für ein Fußball-Turnier Java Basics - Anfänger-Themen 3
M Datentypen While-Schleife eine Java Methode erstellen Java Basics - Anfänger-Themen 3
V Bild per Java Script austauschen Java Basics - Anfänger-Themen 7
MoxMorris this Keyword in Java Java Basics - Anfänger-Themen 14
D Wie kann man in Java nach Arrays auf Duplikate prüfen Java Basics - Anfänger-Themen 12
wolei JAVA Zeitdifferenz feststellen. Java Basics - Anfänger-Themen 4
DiyarcanZeren Rekursion in Java Java Basics - Anfänger-Themen 5
wolei Java generic interface in a generic class Java Basics - Anfänger-Themen 6
monsterherz Ablauf der Erstellung eines Java Programmes Java Basics - Anfänger-Themen 17
monsterherz Circle.java:5: error: <identifier> expected Java Basics - Anfänger-Themen 2
julian-fr Wie kann ich am besten Java lernen? Java Basics - Anfänger-Themen 17
A Java-Properties und -RessourceBundles Java Basics - Anfänger-Themen 5
lrnz22 Java-Basics-Aufgabe Java Basics - Anfänger-Themen 8
R Java kann nicht installiert werden Java Basics - Anfänger-Themen 8
marcelnedza Finde meinen Fehler in einer Methode nicht, Java Karol Java Basics - Anfänger-Themen 15
G In ein java Dokument Ton einbinden Java Basics - Anfänger-Themen 1
C was heisst es wenn java ']' erwartet ? Java Basics - Anfänger-Themen 2
KeinJavaFreak Erste Schritte Programm "Java(TM) Platform SE binary " nicht vorhanden Java Basics - Anfänger-Themen 1
KeinJavaFreak Erste Schritte Java "Executable Jar File" nicht vorhanden Java Basics - Anfänger-Themen 1
melisax Java 2D-Array Tabelle Java Basics - Anfänger-Themen 4
melisax Java Array Wert an bestimmtem Index angeben Java Basics - Anfänger-Themen 14
J Java Testklasse Java Basics - Anfänger-Themen 5
P Java Selenium . Parameterized.Parameters erzeugt eine Fehlermeldung Java Basics - Anfänger-Themen 14
W Java-Code mit Array Java Basics - Anfänger-Themen 14
W Java-Code Java Basics - Anfänger-Themen 2
P BeforeEach AfterEach werden nicht ausgeführt. Java / Selenium Java Basics - Anfänger-Themen 4
A Wie führe ich eine Batch-Datei von meiner Java-Anwendung aus? Java Basics - Anfänger-Themen 18
W Java code- TicTac toe Java Basics - Anfänger-Themen 51
Ostkreuz Java Docs Java Basics - Anfänger-Themen 9
R Java boolean Unterschied " == " und " = " Java Basics - Anfänger-Themen 3
D Java Programm mit Batch-Datei starten Java Basics - Anfänger-Themen 32
W Java-code Java Basics - Anfänger-Themen 8
W Java-code Java Basics - Anfänger-Themen 9
W Java-Code erklären Java Basics - Anfänger-Themen 6
A Java Kurs / Tutorial Java Basics - Anfänger-Themen 6
K Java Lotto Spiel; ich komme nicht weiter Java Basics - Anfänger-Themen 15
R Operatoren Rechenoperation in Java verwenden für Calculator Java Basics - Anfänger-Themen 2
P Java 2n Potenzieren Java Basics - Anfänger-Themen 1
J Java Hamster Java Basics - Anfänger-Themen 4
D Wie sehe ich ein Java-Programm? Java Basics - Anfänger-Themen 27
V Die Funktion des neuen Schlüsselworts in Java Java Basics - Anfänger-Themen 1
W Junit-Test (Java) Java Basics - Anfänger-Themen 4
W Testfälle bei Java ( Junit-Test) Java Basics - Anfänger-Themen 3
laxla123 If-else Java Java Basics - Anfänger-Themen 4
RashAGhul Java Verwaltungstool Erstellen mit kaum Wissen Java Basics - Anfänger-Themen 9
S Substring in java Java Basics - Anfänger-Themen 3
Z Operatoren Java Applikation Java Basics - Anfänger-Themen 8
Tw1Z Erste Schritte Sort in java Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben