# Bios Sounds



## gorgeous georg (17. Aug 2009)

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 (18. Aug 2009)

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 (18. Aug 2009)

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 (18. Aug 2009)

Mit Java wird das nicht direkt klappen, du musst C/C++ (oder eine andre Sprache, die direkt die guten alten Ports nutzen kann) und JNI verwenden.

Making Music using the PC Speaker (Win9x or DOS)


----------



## faetzminator (18. Aug 2009)

Da will ich erst hören, dass dies mit den heutigen Computern noch geht :bahnhof:


----------



## schalentier (18. Aug 2009)

faetzminator hat gesagt.:


> Da will ich erst hören, dass dies mit den heutigen Computern noch geht :bahnhof:



Ich wuesste nicht, warum das nicht mehr klappen sollte... Laut PC speaker - Wikipedia, the free encyclopedia gibt es neben den altbekannten (oder unbekannten) MOD-Playern auch Linux/Windows Treiber, die den PC-Speaker ansprechen. Ich kann das hier auf Arbeit allerdings grad nicht ausprobieren... aber es waere komisch, wenn das nicht mehr ginge...


----------



## Spacerat (18. Aug 2009)

...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.


----------



## faetzminator (18. Aug 2009)

Spacerat hat gesagt.:


> 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.


Hmm da hatte ich wohl eine Wissenslücke. Hab so was noch nie gehört oder gebastelt


----------



## Spacerat (18. Aug 2009)

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.


----------



## L-ectron-X (18. Aug 2009)

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 (18. Aug 2009)

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 (20. Aug 2009)

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...


----------



## Spacerat (20. Aug 2009)

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 (21. Aug 2009)

Jo, mit wait() wird das nix. Ich dachte eher an sowas:

```
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 (21. Aug 2009)

mit C funktionierts so

unter Linux:


```
#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:


```
#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);

}
```


----------



## jason (21. Aug 2009)

Laut dieser Liste gibt es auch BIOSs, die hohe und tiefe Töne wiedergeben können.

MfG jason


----------



## Spacerat (22. Aug 2009)

schalentier hat gesagt.:


> 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.


----------

