Bios Sounds

Status
Nicht offen für weitere Antworten.

gorgeous georg

Neues Mitglied
Hallo,

ist es möglich mit Java so Töne auszugeben wie sie z. B. bei bei den Tastentönen bei Handy zu hören sind. Ich weiß leider nicht wie sie heißen, in einigen Blogs wurden sie als Bios-Töne oder Dos-Töne bezeichnet. Es sind so Piepstöne wie die nicht über die normalen Lautsprecher ausgegeben werden sonder über die Lautsprecher am Mainboard.

Ich kenne schon:
System.out.print("\007");
Ich suche sowas genau wie das, nur in verschiedenen Tonhöhen.
 

Atze

Top Contributor
ich glaube so viele verschiedene töne kann das board net :) ist ja schön genug, dass es überhaupt piepst, wenn was kaputt ist :)
 

faetzminator

Gesperrter Benutzer
Dort hast du einen Piezo und keinen Laussprecher. Dieser kennt genau einen Ton. Bei HW- oder BIOS-Fehlern "morst" er mit 2 verschiedenen Tonlängen und -reihenfolgen zum Benutzer.
 

schalentier

Gesperrter Benutzer
S

Spacerat

Gast
...das geht noch... behaupte ich mal.
Das Prinzip hat sich ja nicht geändert. Es beruht sozusagen immer noch auf "ausgegebene Beeps pro Sekunde". Das man damit auch Piezos verschiedene Töne entlocken kann, hört man an einigen Digitaluhren, die, auf diesem Prinzip beruhend, auch Melodien spielen können.
 
S

Spacerat

Gast
Naja... ändert natürlich nichts an der Tatsache, das man dafür relativ hohe Taktraten benötigt. In Java kommt man aber blos auf 100Hz also maximal 100 Beeps pro Sekunde. Um Melodie mässig richtig was hin zubekommen bräuchte man aber Taktraten von mindestens 20Hz - 20kHz.
@Edit: Da fällt mir gerade noch 'ne kleine Spielerei ein, die auch ungefähr so funktionierte... Und zwar gab es zu C64 Zeiten schon Programme, die die 1541 (Diskettenlaufwerk) "Alle meine Entchen" oder sowas spielen liessen.
 
Zuletzt bearbeitet von einem Moderator:

L-ectron-X

Gesperrter Benutzer
Wir hatten mal vor einigen Jahren einen Thread zu diesem Thema, ich hatte auch noch irgendwo Code dazu, kann ihn aber nicht finden...:autsch:
Mit ausgiebiger Forumsuche sollte sich das Thema aber wieder finden lassen.
 

newcron

Aktives Mitglied
Zu klären wäre nur noch die frage, ob PC Speaker noch immer in allen modernen PCs verbaut werden? Gerade in Laptops glaube ich nicht, dass die das noch unterstützen.
 

schalentier

Gesperrter Benutzer
So ich hab noch mal bissel geguggt und folgendes ist herrausgekommen:

Der PC-Speaker kennt tatsaechlich nur 2 Zustaende - an oder aus. Allerdings kann man den eben schnell an und aus machen, um beliebige Toene zu erzeugen (und prinzipell so auch normale MP3 abspielen). Zu den Zeiten, als das ueberhaupt interessant war (noch vor der Soundkarte), wurde ein bestimmter programmierbarer Chip (PIT, Programmable Interval Timer) benutzt, um den PC Speaker ausreichend schnell umzuschalten.

Den PIT gibts heute noch, allerdings braucht man zum Programmieren direkten Zugriff auf die Hardware. Unter Linux gibts einen ioclt dafuer (KDMKTONE, quasi ein Signal an der Kernel genau das zu tun), wie und ob das unter Windows geht, weiss ich nicht.

Heutige Rechner sind aber so schnell (auch unter Java, wie kommst du auf 100Hz??), dass man den PC-Speaker auch ohne PIT schnell genug an/aus schalten koennte. Allerdings kannst du nicht auf die Hardware zugreifen, dafuer brauchte man einen Systemtreiber (solls aber angeblich fuer Windows und Linux geben).

GameDev.net - PC Speaker

PS: Mit Ubuntu auf einem Thinkpad kommt ein Ton aus den eingebauten Lautsprechern...
 
S

Spacerat

Gast
In Java geht das nur über JNI schnell genug. Die 100Hz ergeben sich aus der Genauigkeit von 1ms. Dem kleinsten long Wert der z.B. an "wait()" übergeben werden kann. Ausserdem scheint die blosse Ausgabe eines ASCII-07 an die Console eh nicht zu funktionieren, was mich ein wenig wundert. In Eclipse höre ich zumindest nichts.
Eine Kleinigkeit hatte ich bei den 100Hz deswegen auch nicht beachtet. Man könnte ja eine ganze Zeichenkette bestehend aus Beeps innerhalb der 1ms ausgeben. Ob das was bringt?
 

schalentier

Gesperrter Benutzer
Jo, mit wait() wird das nix. Ich dachte eher an sowas:
Java:
long lastNanos = getNanoSeconds();
while( playing() ) {
    long currentNanos = getNanoSeconds();
    if( currentNanos-lastNanos > nanosPerSample ) {
        lastNanos = currentNanos;
        play( nextSample() );
    }
}

ASCII 7 hilft nix, da das in Abhaengigkeit der Console eben einen Beep fester Laenge und Tonhoehe produziert. Man muss schon den Speaker irgendwie direkt ansprechen und das klappt nicht (mehr). Hach... frueher war eben doch alles besser... ;-)
 

yxcvbn

Mitglied
mit C funktionierts so

unter Linux:

Code:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/io.h>


int main(int argc, char **argv)
{

if( ioperm(0x61, 1, 1) )
	{
	printf("Fehler ioperm\n");
	exit(0);
	}

if( ioperm(0x42,2 , 1) )
	{
	printf("Fehler ioperm\n");
	exit(0);
	}

int freq ;

for(freq = 50 ; freq < 500 ; freq = freq +25 )
	{
	int scale = 1193046 / freq;

	outb( 0xb6  ,  0x43 );
	outb( scale & 0xff  ,  0x42 );
	outb( scale >> 8  ,  0x42 );
	outb( inb(0x61) | 3  ,  0x61 );
	usleep(100000);
	}

outb( inb(0x61) & ~3  ,  0x61 );

}

unter Windows:

Code:
#include <stdio.h>
#include <pc.h>
#include <unistd.h>


int main(int argc, char **argv)
{

int freq ;

for(freq = 50 ; freq < 500 ; freq = freq +25 )
	{
	int scale = 1193046 / freq;

	outportb(0x43, 0xb6);
	outportb(0x42, scale & 0xff);
	outportb(0x42, scale >> 8);
	outportb(0x61, inportb(0x61) | 3);
	usleep(100000);
	}

outportb(0x61, inportb(0x61) & ~3);

}
 
S

Spacerat

Gast
ASCII 7 hilft nix, da das in Abhaengigkeit der Console eben einen Beep fester Laenge und Tonhoehe produziert.
Der Umstand ist ja hinlänglich bekannt. Aber der Beep sollte doch eigentlich bei jedem Aufruf (Ausgabe von ASCII-07) neu initialisiert werden. Und wenn man diese Ausgaben extrem schnell wiederholt, sollte sich der gewünschte Effekt doch eigentlich einstellen. Es sei denn, man überlässt dem System die Ausgabe, z.B. durch die Übergabe einer ganzen ASCII-07-Staffel in einer Zeichenkette.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben