Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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.
Deiner Ausdrucksweise nach zu urteilen, bist du Newbie.
Von daher schlage ich dir folgende Vorgehensweise vor:
1. Erstelle das Programm so, dass du im code vorgibst, welche tonart gespielt werden soll.
2. Ändere das Programm so, dass es nacheinander 3 verschiedene tonarten abspielt.
3. Ändere das Programm so, dass du mit if oder switch case verschiedene Bedingungen prüfen kannst, und du nur mit einem Parameter die tonart ändern kannst.
4. Bau eine abfrage von der Tastatur ein, auf die du reagierst.
5. Verbessere deinen code
6. Stell die tastatureingabe auf eine graphische Eingabe um
Also, es stimmt schon, ich habe bis jetzt nur so in der Schule den Anfang gelernt, aber diese Augabe ist völlig anders.
Bis jetzt habe ich es geschafft, dass eine Melodie spielt, bloß weiß noch nicht wie ich das so einbaue, dass ich zB 4 Melodien zur Wahl habe.
Java:
package samples;
import java.io.*;
import sun.audio.*;
public class audio {
public static void main(String[] args)
throws Exception
{
String wav_file = "C:/Users/Public/Music/Sample Music/Natur4.wav"; //
InputStream in = new FileInputStream(wav_file);
AudioStream audio = new AudioStream(in);
AudioPlayer.player.start(audio);
}
}
man könnte dies auch elegant mit einem Switch lösen , dies würde dann folgendermaßen aussehen.
Java:
switch(userEingabe){
case "mol":
AudioPlayer.play(...);
break;
case "dur":
AudioPlayer.play(...);
break;
}
in beiden fällen sollte dir aufgefallen sein das es sich bei userEingabe um einen String handelt, welcher per equals(Object o); auf Inhaltliche gleichheit mit dem in der Bedingung angegebenen String verglichen wird.
Zum einlesen der Nutzereingaben solltest du insofern du ohne GUI arbeitest dir die Klasse Scanner mal genauer anschauen
zudem wenn du dies so machen möchtest musst du den AudioPlayer im Konstruktor übergeben da sonst deine Klasse Audio keine Kenntnis von deinem Player hat .
Java:
public class Audio{
AudioPlayer player;
public Audio(AudioPlayer player){
this.player = player;
}
void melodie(){
...
}
}
}
Insofern die Klasse AudioPlayer von dir erstellt ist würde ich auch eher aus OOP Sicht die Melodien diesem Player übergeben, und die Melodien in einer Separaten Klasse realisieren und als Objekte behandeln
Quasi
Java:
public AudioPlayer(Melody...melodies){....}
so kannst du dann deinem Player die Songs/Melodien oder whatever übergeben und dieser spielt diese dann ab.
Hier mal ein fiktives Besipiel was ich meine , OHNE funktionale implementierung, rein zur veranschaulichung !
Song.java
Java:
public class Song {
File file;
public Song(String filePath) {
this.file = new File(filePath);
}
public String getName() {return this.file.getName();}
}
AudioPlayer.java
Java:
public class AudioPlayer {
private Song[] songs;
public AudioPlayer() {}
public AudioPlayer(Song...songs) {
this.songs = songs;
}
public void addSongs(Song...songs){
this.songs = songs;
}
public void play(Song song){
System.out.println(song.getName());
}
public Song[] getSongs() {return this.songs;}
}
AudioTest.java
Java:
public class AudioTest {
public static void main(String[] args) {
AudioPlayer player = new AudioPlayer();
Song one = new Song("C:/MySong.wav");
Song two = new Song("G:/ExampleSong.wac");
player.addSongs(one,two);
/*
* Hier kannst du sehen wie das mit dem switch
* funktionieren würde.
*/
Scanner sc = new Scanner(System.in);
switch(sc.nextLine()){
case "mol":
player.play(one);
break;
case "dur":
player.play(two);
break;
}
sc.close();
}
}
package samples;
import java.util.*;
import java.io.*;
import sun.audio.*;
public class Audio {
AudioPlayer player;
public Audio(AudioPlayer player){
this.player = player; }
public static void main(String[] args)
String tonleiter="C-Dur";
switch(C-Dur){
case "C-Dur":
AudioPlayer.play("C:/Users/Ela/Music/C-Dur.wav");
break;
case "D-Dur":
AudioPlayer.play("C:/Users/Ela/Music/D-Dur.wav");
break;
case "G-Dur":
AudioPlayer.play("C:/Users/Ela/Music/G-Dur.wav");
InputStream in = new FileInputStream(wav_file);
AudioStream audio = new AudioStream(in);
AudioPlayer.player.start(audio);
}
}
So, das hab ich bisher. "AudioPlayer player;" wie ist das gemeint, das verstehe ich nicht, soll das alleine so stehen oder kommt noch was dazu?
Und AudioPlayer bzw. AudioPlayer.play wird überall unterstrichen. Dazu auch noch C-Dur bei switch und wav_file.
Vielen Dank für deine Hilfe!!!!
Edit: Müssen alle 3 erstellt werden? Ich kenne das noch nicht so. Wäre schön, wenn du das anhang meiner aufgabe dies erklären könntest!
Okay, ich habe grade versucht, das ihrgendwie hinzukriegen. Aber ich schaffe es nicht, da ich keine Ahnung davon habe, aber die Aufgabe muss ich lösen.
Also AudioPlayer hatte ich bis du es geschrieben hast noch nicht. Das ist das was du geschrieben hast nur mit Audio statt Song, doch ich weiß nicht recht, was genau ich damit machen soll und was alles noch eingefügt werden muss.
Java:
package samples;
public class AudioPlayer {
private Audio[] songs;
public AudioPlayer() {}
public AudioPlayer(Audio...songs) {
this.songs = songs;
}
public void addSongs(Audio...songs){
this.songs = songs;
}
public void play(Audio song){
System.out.println(song.getName());
}
public Audio[] getSongs()
{return this.songs;}
}
Das war Audio, muss man dies für jedes Lied erstellen oder ist es allgemein?
Und auch da, was muss ich noch dazufügen?
Java:
package samples;
import java.io.File;
public class Audio {
File file;
public Audio(String filePath) {
this.file = new File(filePath);
}
public String getName()
{return this.file.getName();}
}
Wäre schön, wenn du mir auch morgen weiter hilfst, heute ist es ja schon spät!
1. Wir erstellen uns eine Klasse, dessen Objekte nachher unsere Sounds / Töne Darstellen,
diese nennen wir Sound
Sound.java :
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;}
}
Jetzt schreiben wir uns einen Player welcher später dann diese Sounds abspielen können soll,
hier erstellen wir nun erstmal eine gewisse basisfunktionalität, damit man Töne zu einer Playlist hinzufügen und löschen, nach Titel suchen kann , und zu guter letzt die Dateien auch abspielen kann.
AudioPlayer.java (hier erstmal nur die Basisfunktionalität):
Java:
import java.util.ArrayList;
public class AudioPlayer {
private ArrayList<Sound> playList;
public AudioPlayer() {
this.playList = new ArrayList<>();
}
public AudioPlayer(Sound...songs) {
this.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);
}
}
}
//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){
//Hier werden dann die einzelnen Songs dann abgespielt
}
public ArrayList<Sound> getPlayList() {return this.playList;}
}
Erstelle nun zum testen eine Klasse AudioTest die wie folgt aussieht :
(bei path gibt einen Pfad zu einer deiner .wav dateien an ! )
AudioTest.java
Java:
public class AudioTest {
public static void main(String[] args) {
String path = "L:/Cinema 4d/tex/tutorials/maxon_technoloop2.wav";
Sound wave = new Sound("Wave",path);
AudioPlayer player = new AudioPlayer();
player.play(wave);
}
}
Da es hier nur darum geht dir zu zeigen wie man wav dateien abspielt sollte dies nun schon klappen,
habe ich in der play Methode nun nur zu Testzwecken implementiert, in einer richtigen Implementierung würde man die Frames vorher auslesen und danach die Bedingung richten, fügst du diesen Code nun allerdings in diesem Beispiel nicht hinzu , beendet dein Programm bevor die Datei abgespielt wird, hier könnte man das Abspielen auch in einem Extra gestarteten Thread erledigen, dies würde hier allerdings zu weit gehen.
Teste bitte mal ob es bei dir so funktioniert, und gib mir Rückmeldung, dann können wir weitermachen, falls du irgendetwas nicht verstehen solltest, lass es mich wissen
Tut mir leid dass ich mich gestern nicht gemeldet habe.
Also, ich habe alles so erstellt wie du es geschrieben hast. Bin bloß bei dem "Implentieren" stecken geblieben, da ich nicht genau weiß wo hin.
Ok hier nochmal alle Klasse wie sie nun sein sollten :
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.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() {
playList = new ArrayList<>();
}
public AudioPlayer(Sound...songs) {
super();
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);
}
}
}
//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 {
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();
clip.start();
while(clip.getFramePosition() < clip.getFrameLength()) {
// Nur zum testen so implementiert
};
} catch (Exception e) {
//Hier werden wir dann ExceptionHandling betreiben !
}
}
public ArrayList<Sound> getPlayList() {return this.playList;}
}
Java:
public class AudioTest {
public static void main(String[] args) {
String path = "L:/Cinema 4d/tex/tutorials/maxon_technoloop2.wav";
Sound wave = new Sound("Wave",path);
AudioPlayer player = new AudioPlayer();
//Song zur Playlist hinzufügen, anhand des Names aus der Playlist laden + abspielen
player.addToPlayList(wave);
player.play(player.getSongByName("Wave"));
//Oder Song direkt abspielen
//player.play(wave);
}
}
Versuch mal das nachzuvollziehen , und wenn du Fragen hast stell diese, dann können wir uns um den Rest kümmern , wie Fehlerbehandlung und die Beseitigung der NPE bei nicht gefundenem Titel in der Playlist
Dazu kommen wir nun als nächstes, ich bin allerdings Grade unterwegs, sobald ich morgen zu Hause bin zeige ich dir wie du die playlist füllst und dann dem User ermöglichst verschiedene Sounds auszuwählen
Hier mal die Klasse AudioTest wie man sie erstellen könnte :
Java:
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 + "drame.wav");
Sound four = new Sound("four",path + "explose.wav");
Sound five = new Sound("five",path + "falling.wav");
getPlayer().addToPlayList(one, two, three, four, five);
}
public void startSession(){
boolean running = true;
while (running) {
String input = sc.nextLine();
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) {
new AudioTest().startSession();
}
}
Nun zur Erklärung :
Der Konstruktor :
Java:
public AudioTest() {
sc = new Scanner(System.in);
player = new AudioPlayer();
path = "L:/OpenOffice/share/gallery/sounds/";
fillPlaylist();
}
Hier werden der
Code:
Scanner
für die Nutzereingabe, der
Code:
AudioPlayer
und der
Code:
Pfad
welcher die Sounds ( in meinem Fall ) beinhaltet angegeben, zusätzlich wird die methode
Code:
fillPlaylist();
aufgerufen welche die Playlist initialisiert, kann man auch per eingabe machen , für das Beispiel reicht es aber so , hier nun die Methode
Code:
fillPlaylist();
Java:
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 + "drame.wav");
Sound four = new Sound("four",path + "explose.wav");
Sound five = new Sound("five",path + "falling.wav");
getPlayer().addToPlayList(one, two, three, four, five);
}
Diese Methode übernimmt das initialisieren der Playlist des AudioPlayers, ich hab hier willkürlich mal ein paar .wav files hinzugefügt dich ich auf die schnelle gefunden habe.
nun noch die entscheidende Methode
Code:
startSession();
Java:
public void startSession(){
boolean running = true;
while (running) {
String input = sc.nextLine();
if (input.equals("stop")) {
running = false;
sc.close();
}
while(running){
player.play(player.getSongByName(input));
break;
}
}
}
Zugegeben , sie sieht etwas kryptisch aus, aber es ist notwendig damit nicht nach jeder eingabe die Anwendung beendet wird, hier passiert folgendes, beim Ausführen der Methode wird der boolsche Wert
Code:
running
auf true gesetzt, somit startet die erste While Schleife und die lokal definierte Variable
Code:
input
wartet nun über den Scanner und dessen nextLine Methode, auf eingabe in der Konsole, solange diese nicht "stop" ist, wird die variable input mit der nächsten Zeile der Konsole belegt ,daraufhin wird die zweite while Schleife ausgeführt, die ebenfalls solange läuft wie
Code:
running = true
ist, in dieser wird nun die methode
Code:
play(Song s);
, in verbindung mit der Methode
Code:
getSongByName(String s);
des AudioPlayers aufgerufen und dieser der Inhalt der lokalen Variable input gefüllt.
Nun wird in dieser Methode nach einem Song gesucht der Namentlich Identisch mit der Eingabe ist, sollte ein Soung gefunden werden spielt die Methode play(); diesen dann ab, und das
Code:
break;
sorgt dafür das aus der zweiten while schleife wieder heraus in die erste gesprungen wird, anders würde sonst nun die Anwendung beendet werden.
Du kannst so nun beliebig oft einen Sound nach dem anderen aus der playlist abspielen, bis du stop eingibst, dann wird
Code:
running = false
gesetzt, der Scanner geschlossen und die Anwendung beendet.
hier nun noch die Main Methode welche nurnoch dazu dient um das Programm zu starten, bzw. eine Instanz der Klasse AudioTest zu Instanziieren, und die
Code:
startSession();
Methode aufzurufen.
Java:
public static void main(String[] args) {
new AudioTest().startSession();
}
Wir könnten nun noch beigehen und die Methoden in der Klasse AudioPlayer vernünftig implementieren und uns um Fehlerbehandlung Kümmern, oder evtl, eine kleine GUI schreiben welche das Ganze Visualisiert.
Nein, nein noch ist garnichts geklärt.
Hatte die letzten Tage keine Zeit dafür, habe grade erst dass gemacht, was du geschrieben hast.
Soweit habe ich keinen fehler, doch wenn ich abspielen will, erscheint keine Fehlermeldung aber auch kein Ton.
Du hast geschrieben, man muss implementieren, wie geht das?
public void play(Sound song){
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();
clip.start();
// *********************************************
// Das hier ist Wichtig , sonst wird das Programm beendet bevor der Sound abgespielt wurde !
while(clip.getFramePosition() < clip.getFrameLength()) {
// Nur zum testen so implementiert
};
//*********************************************
} catch (Exception e) {
//Hier werden wir dann ExceptionHandling betreiben !
}
}
Implementieren bedeutet übrigens nichts anderes als einbinden, einfügen oder etwas einem bestehendem System hinzuzufügen
Es kann sein , das das .wav file eine andere Codierung verwendet, versuch mal bitte eine andere datei abzuspielen, bei mir funktionieren auch nicht alle, ansonsten müssen wir uns noch um die Codierund kümmern.
Ansonsten musst du mal debuggen und ein Breakpoint auf das auslesen des formates setzen dann muss die Codierung
Code:
"PCM_SIGNED"
sein, sonst kann es sein das es zwar abgespielt wird du aber nix hörst.
Hier noch ein Screen vom Debugger :
Wenn du nicht weißt wie man den Debugger nutzt lass es mich wissen ^^
[EDIT]
Mach doch mal nen Screenshot von Deiner IDE und poste denn hier mal oder nen LInk dazu so das ich Quelltext und die Konsole sehen kann, vielleicht finde ich nen Fehler insofern es einen gibt
[/EDIT]
[EDIT]
Poste doch auch bitte mal deine Klasse AudioTest damit ich sehen kann wie und ob du die Sounds deiner Playlist hinzugefügt hast.
[/EDIT]
ok, dann weiter im Text, nun müssen wir mal debuggen :
Folgendermaßen , durch doppelklick an diese stelle , setzt du einen Breakpoint, dies ist die kleine blaue kugel
Bitte mach das mal an genau dieser Stelle in der Klasse AudioPlayer.
dann startest du deine Anwendung unter Verwendung dieses Buttons als Java Application:
und gibst dann mal zum testen "one" ein und bestätigst mit Enter.
Jetzt müsste Eclipse in die Debugg Ansicht springen und du siehts links oben solch ein Fenster :
jetzt nutzt du diesen Button solange bis du oben links wie im oberen bild audioFormat stehen hast,
klickst nun auf den pfeil davor und dann sollte es aussehen wie im Bild oben dort stehen dann informationen zu der Codierung deiner AudioDatei., mach davon bitte mal nen screenshot
[EDIT]oder bekommst du in der Console irgendwelche Exceptions oder Fehlermeldungen , falls ja bitte poste diese mal.[/EDIT]
Ich weiß nicht so recht wo ich "one" eingeben soll. Wenn ich das als breakpoint mache und dann auf das symbol drücke dann erscheint diese Ansicht aber mit anderen Angaben und auch wenn ich alles durchgucke, das was bei dir steht entdecke ich nicht.
Wenn du deine Application in deiner IDE startest , sollte durch die while Schleifen das untere rote Viereck aktiv sein, das bedeutet die Anwendung wartet auf eingabe , du kannst dann unten wie in dem Bilder in der Konsole text eingeben, und diese dann mit Enter bestätigen .
wenn der Text den du eingibst mit einem der Songnamen übereinstimmen sollte, wird der Sound abgespielt.
Ich habe mal ein paar Ausgabe hinzugefügt damit es besser zu sehen ist das die Anwendung läuft,
so sollte es dann aussehen wenn du die Anwendung startest, die eingekreiste Zeile ist meine Eingabe:
ersetze mal deine Klasse AudioTest mit diesem SourceCode hier, denke aber daran das du deine Songs wieder angeben musst! :
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("- 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("stop")) {
running = false;
sc.close();
System.out.println("Player wurde beendet ! Schönen Tag noch.");
}
while(running){
System.out.println("Spiele Sound " + input + " ab.");
player.play(player.getSongByName(input));
break;
}
}
}
public AudioPlayer getPlayer() {return this.player;}
public static void main(String[] args) {
new AudioTest().startSession();
}
}
Du musst noch einen Schritt weiter klicken oben mit dem Grünen Pfeil damit die Variable belegt wird, dann sollte oben rechts auch das Format erscheinen.
[EDIT]ersetze aber trotzdem mal die Klasse AudioTest, damit du anhand der Ausgaben sehen kannst ob das Programm läuft wie es soll oder nicht [/EDIT]
Eine Klasse stellt unsere Sounds dar, eine unseren Player , und eine Verbindet das Ganze.
Objekte der Klasse Sound repräsentieren die Sounds die wir abspielen wollen.
Objekte der Klasse AudioPlayer stellt unseren Player dar.
Objekte der Klasse AudioTest verknüpfen das ganze miteinander.
In der Klasse AudioTest erzeugen wir Sounds ( Objekte vom Typ Sound) welche wir an die Playlist unseres AudioPlayers übergeben,
die Klasse AudioTest erzeugt hier in unserem Fall die Schleifen welche die Nutzereingaben entgegen nimmt und dann entsprechend
darauf reagiert, z.B indem unser Player einen Sound abspielt.
In der OOP ist es so das Objekte bestimmter Typen wie in unserem Fall reelle Dinge darstellen, so stellt in userem Fall halt die klasse Sound einen Sound dar, hätte man die Klasse Handy wäre z.B ein Objekt der klasse eine nachahmung eines reelen Gegenstandes, dabei legt man über die Klasse fest welche Eigenschaften und attribute solch ein Objekt hat, zum Beispiel einen Typ oder einen Namen, dafür sind die sogenannten Member oder auch Instanzvariablen gedacht.
Java:
public class Handy{
private String name; // Member oder auch Instanzvariable
...
}
diese steht dann jedem Objekt welches erzeugt wird zur Verfügung. und kann für jedes Objekt unterschiedlich belegt sein.
Die Klasse ist also der Bauplan und ein erzeugtes Objekt dieser Klasse ist quasi ein einzelnes Element mit den in der Klasse festgelegten Eigenschaften und "Funktionen" ( methoden )
Also ich hab das jetzt so ausgebaut wie ich es wollte, aber denke um noch mehr zu überzeugen könnte ich doch noch so machen, dass es in einem neuen Fenster erscheint. Ist das viel Arbeit? Ich habe noch bis nächsten Dienstag Zeit.
Würde mich sehr über weitere Hilfe freuen!
package samples;
import java.util.Scanner;
//Die Klasse Scanner ist in dem Paket java.util definiert.
public class AudioTest {
Scanner sc;
AudioPlayer player;
String path;
//sc repräsentiert den Scanner, der Scanner definiert Methoden zum Einlesen von Dateien
public AudioTest() {
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(){
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) {
new AudioTest().startSession();
//Die Main Methode dient dazu um das Programm zu starten und die startSession(); Methode aufzurufen.
}
}
So sieht mein Code jetzt aus, ich habe Tonart durch Instrument ersetzt und würde es schön finden wenn ein Fenster erscheint wo man sich für ein Instrument entscheidet. Wenn man auf eins drückt kommt gleich die Musik, oder es erscheint ein neues Fenster wo steht welches Instrument jetzt spielt, muss aber nicht umbedingt sein. Wenn eins zuende gespielt hat kann man sich dann gleich ohne erneutes öffnen ein neues aussuchen. Also ich hoffe es ist nicht zu schwer, wäre schön wenn es klappt, dann hätte ich 2 Versionen die ich präsentieren kann!
Zuerst müssen wir uns gedanken darüber machen wie wir das was du dort skizziert hast optisch umsetzen, wenn ich darauf schaue sehe ich z.B :
- 1 JFrame mit BorderLayout
- 1 JLabel im Head Bereich des JFrames
- 1 JPanel welches unseren Content beinhaltet ( hier mit GridLayout)
- 6 JButtons welche uns nachher die möglichkeit geben die Sounds abzuspielen
Hier der Code dazu , hier ist allerdings noch keine Funktionalität vorhanden, dazu kommen wir jetzt gleich:
Java:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
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 {
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]);
}
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);
}
}
Das ganze schaut dann so aus :
Ich habe hier erst einmal versucht es so einfach wie möglich für dich zu gestalten , und erzeuge hier über Schleifen die nötigen Elemente, und fülle diese dann über eine weitere Schleife mit Text, welchem ich zuvor initialisiert habe, wenn du Fragen dazu haben solltest immer raus damit , schließlich sollst du es ja nachvollziehen können
als nächstes werden wir einen Listener einbinden , und zwar in einfachster Form, welcher auf die Buttonsklicks lauscht und dann über sogenannte Events die nötigen Aktionen ausführt/aufruft.
[EDIT]Das verwenden von HTML Tags im JLabel ist notwendig da sonst keine Zeilenumbruch stattfindet, ansonsten hätten wir eine eigenständige klasse von JLabel ableiten müssen um dieses feature selbst zu implementieren, was hier eindeutig zu aufwendig wäre.[/EDIT]
Da ich nicht weiß ob nur ein Interpret mit verschiedenen Instrumenten Voraussetzung bei dir ist ,
habe ich auch nur das von dir skizzierte nachgestellt, wenn du mehrere Künstler anbieten sollst, müsste man sonst das gleiche nochmal für Künstler machen , und dann beim auswählen dieser dann dieses Fenster öffnen welches die verschiedenen Instrumente anbietet, ansonsten könnte man es so lassen.
Als nächstes werden wir über folgenden Code , einen Listener implementieren, hier handelt es sich um ein Interface, da ein Interface Abstrakt ist, muss die Methode ( hier nur eine , seit Java 8 ist dies ein funktionales Interface ) überschrieben werden.
Hier der Code
Java:
public class Gui extends JFrame implements ActionListener{..}
nachdem du über Strg + Shift + O das package des ActionListener importiert hast fordert dich Eclipse nun durch unterstreichen der Klasse Gui auf , die Methoden des Interfaces zu implementieren in unserem Fall
Java:
public void actionPerformed(ActionEvent e){...}
Zudem müssen wir oben in der Schleife in welcher wird die Buttons erzeugen auch gleich die Buttons beim Listener anmelden, dies machen wir indem wir diesen Code hinzufügen :
Java:
for (int i = 0; i < btns.length; i++) {
btns[i] = new JButton(label[i]);
btns[i].addActionListener(this); // <----
}
wenn du dies hast sollte es nun ( ohne die hier bereits gemachten implementierungen ) 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 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);
}
@Override
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;
}
}
}
über die hier schon implementierten "prints", kannst du wenn du die Applikation ausführst und die Buttons betätigst schon sehen das in der Console von Eclipse ausgegeben wird von welchem Button bzw. welcher ActionCommand das Event ausgelöst wird.
So sollte es nun aussehen wenn du die Buttons drückst :