beep Παιξτε μουσική στο PC όπως το 1980

Οι ηχητικές δυνατότητες του πρώτου IBM PC, πριν βγουν οι κάρτες ήχου δεν ήταν κάτι το συναρπαστικό. Ήταν ένα απλό ηχείο, όχι δε θα το πω μεγαφωνάκι – σικ. Σήμερα δε θα βρεις στην αγορά κουτί που να περιέχει ένα, αλλά κάθε μητρική έχει ακόμα υποστήριξη. Παρόλα αυτά είναι χρήσιμο και μπορείς να προσθέσεις ένα από κάποιο παλιό κουτί ή ραδιόφωνο. Αν δεν έχεις μπορείς να πάρεις 5 κομμάτια στην εκπληκτική τιμή των 0.75€ από εδώ. (Αν κάποιος μένει Ηράκλειο Κρήτης και θέλει ένα, ας μου στείλει ένα PM).

image

Ο ήχος μέσα από το κουτί είναι πολύ αδύναμος, αλλά αυτό το θεωρώ πλεονέκτημα.

Στο άρθρο αυτό θα δούμε πως μπορούμε να το χρησιμοποιήσουμε στο Linux.

Φόρτωση του module κατά την εκκίνηση

Θα πρέπει να δώσουμε δικαιώματα για τη χρήση του ηχείου για τον χρήστη. Θα φτιάξουμε ένα κανόνα udev που θα δίνει δικαιώματα στη συσκευή στους χρήστες τις ομάδας beep που θα φτιάξουμε.

Δημιουργούμε ένα αρχείο /etc/udev/rules.d/10-beep.rules

sudo nano /etc/udev/rules.d/10-beep.rules

που θα περιέχει τα παρακάτω:

# Add write access to the PC speaker for the "beep" group
# https://github.com/spkr-beep/beep/blob/master/PERMISSIONS.md

ACTION=="add", SUBSYSTEM=="input", ATTRS{name}=="PC Speaker", ENV{DEVNAME}!="", GROUP="beep", MODE="0620"

Στην συνέχεια θα φτιάξουμε την ομάδα και θα προσθέσουμε τον εαυτό μας

sudo addgroup beep
sudo usermod -aG beep $(whoami)

κάνουμε επανεκκίνηση και τρέχουμε την εντολή beep. Αν δεν ακούσουμε κάτι κάνουμε ένα

ls -lH /dev/input/by-path/platform-pcspkr-event-spkr

και ελέγχουμε τα δικαιώματα του αρχείου.

Καταραμένο Ubuntu

Και στον υπολογιστή μου δεν δούλεψε γιατί το module δεν φόρτωνε κατά την εκκίνηση. Ενώ με το χέρι
δούλευε κανονικά. Δεν υπήρχε κανένα πρόβλημα στα αρχεία καταγραφής. Μετά απο εκτεταμένο ξύσιμο του τριχωτού της κεφαλής …

Στο Ubuntu το σχετικό module του πυρήνα είναι απενεργοποιημένο. Θα πρέπει να βρούμε την σχετική γραμμή στο παρακάτω αρχείο και να βάλουμε μπροστά ένα #.

sudo nano /etc/modprobe.d/blacklist.conf

Στην συνέχεια θα πρέπει να βάλουμε το module να φορτώνει κατά την εκκίνηση. Φτιάχουμε ένα αρχείο στην θέση /etc/modules-load.d/ που θα περιέχει μια γραμμή που θα γράφει pcspkr

sudo nano /etc/modules-load.d/asfodelus.conf

Τέλος για παν ενδεχώμενο ξαναφτιάχνουμε το initrd με τον τρόπο της διανομής μας.

sudo update-initramfs -k all -u

Πιθανά να θέλει μόνο να αφαιρέσουμε το blacklist.

Ας παίξουμε μουσική

Θα πρέπει να εγκαταστήσουμε την εντολή beep αν δεν υπάρχει.

sudo apt install beep

Στα παρακάτω αποθετήρια θα βρούμε μερικές κλασσικές μελωδίες

Αξίζει τον κόπο;

Σίγουρα η ποιότητα και η ένταση του ήχου δεν κερδίζουν τον χαρακτηρισμό HiFi :grinning:, αλλά μερικές φορές είναι αυτό που θέλεις. Αν θέλεις σε κάποιο script ένα ηχητικό σήμα είναι γρηγορότερο από το να παίξεις κάποια μουσική από τα ηχεία. Προσθέστε το Vintage του πράγματος για μια εμπειρία από το 1980 :innocent:

Επιπρόσθετα η μητρική μου μπορεί να ρυθμιστεί να παράγει ένα ήχο κατά την εκκίνηση, σηματοδοτώντας τη σωστή στιγμή για μπεις στο BIOS ή στον boot loader.

Bonus

Μια συνηθισμένη λειτουργία παλαιότερα ήταν να παίζει ήχους το τερματικό. Και είναι ένα χρήσιμο feedback για αυτόματη συμπλήρωση εντολών με το πλήκτρο TAB για παράδειγμα. Μπορείς να το ενεργοποιήσεις πειράζοντας 2 ρυθμίσεις:

Αλλά δε θα χρησιμοποιήσει (ούτε κατάφερα να βρω αν γίνετε) το ηχειάκι, αλλά θα παίξει ένα αρχείο στην κάρτα ήχου, κρίμα. Σε ένα αρχείο εντολών μπορείς να κάνεις μπίπ με την εντολή: printf '\a'.

3 «Μου αρέσει»
//A-ha!
//by GeneralSpud

// For this to work, we need the pitches library

#include "pitches.h"

// Two things need to be created: the array for the notes of the melody (in order)
// and the duration of each (think of it like sheet music in two parts)

// BOTH ARRAYS MUST BE THE SAME SIZE!

// The melody array 
int melody[] = {
  NOTE_FS5, NOTE_FS5, NOTE_D5, NOTE_B4, NOTE_B4, NOTE_E5, 
  NOTE_E5, NOTE_E5, NOTE_GS5, NOTE_GS5, NOTE_A5, NOTE_B5, 
  NOTE_A5, NOTE_A5, NOTE_A5, NOTE_E5, NOTE_D5, NOTE_FS5, 
  NOTE_FS5, NOTE_FS5, NOTE_E5, NOTE_E5, NOTE_FS5, NOTE_E5
};

// The note duration, 8 = 8th note, 4 = quarter note, etc.
int durations[] = {
  8, 8, 8, 4, 4, 4, 
  4, 5, 8, 8, 8, 8, 
  8, 8, 8, 4, 4, 4, 
  4, 5, 8, 8, 8, 8
};
// determine the length of the arrays to use in the loop iteration
int songLength = sizeof(melody)/sizeof(melody[0]);
void setup() {
 //We don't need anything here
}

void loop() {
  // Iterate through both arrays
  // Notice how the iteration variable thisNote is created in the parenthesis
  // The for loop stops when it is equal to the size of the melody array
  for (int thisNote = 0; thisNote < songLength; thisNote++){
    // determine the duration of the notes that the computer understands
    // divide 1000 by the value, so the first note lasts for 1000/8 milliseconds
    int duration = 1000/ durations[thisNote];
    tone(8, melody[thisNote], duration);
    // pause between notes
    int pause = duration * 1.3;
    delay(pause);
    // stop the tone
    noTone(8);
  }
}

Ο κώδικας σε Arduino για το Take on me των A-ha, για τους μερακλήδες.
Πηγή.

2 «Μου αρέσει»