The officially official Devuan Forum!

You are not logged in.

#76 2025-12-13 18:33:09

fsmithred
Administrator
Registered: 2016-11-25
Posts: 2,787  

Re: ALSA-only purists: Question, new GUI app for the mixer and EQ?

Yes, I'd like to try it. Thanks. My first attempt will be to build it for "all" arch.

Edit: changed "any" to "all" after checking what I usually do.

Offline

#77 2025-12-13 19:11:51

greenjeans
Member
Registered: 2017-04-07
Posts: 1,367  
Website

Re: ALSA-only purists: Question, new GUI app for the mixer and EQ?

Cool beans! I just now uploaded the new version 2.1-0 to Sourceforge it has the new script and some updated info:
https://sourceforge.net/projects/vuu-do … /AlsaTune/

Give it some of that Refracta magic! wink

Crap, lost my build-depends file, been messing with this for months, so if I remember correctly:

libasound2-dev
libgtk-3-dev
libglib2.0-dev

Compile:

 gcc -o mxeq mxeq.c $(pkg-config --cflags --libs gtk+-3.0 alsa glib-2.0) -Wall

Last edited by greenjeans (2025-12-13 19:29:45)


https://sourceforge.net/projects/vuu-do/ New Vuu-do isos uploaded October 2025!
Vuu-do GNU/Linux, minimal Devuan-based Openbox and Mate systems to build on. Also a max version for OB.
Devuan 5 mate-mini iso, pure Devuan, 100% no-vuu-do. wink Devuan 6 version also available for testing.
Please donate to support Devuan and init freedom! https://devuan.org/os/donate

Offline

#78 2025-12-14 16:30:59

fsmithred
Administrator
Registered: 2016-11-25
Posts: 2,787  

Re: ALSA-only purists: Question, new GUI app for the mixer and EQ?

There's cymbals! I hear cymbals!!! I've been listening to this on the computer for so long I forgot there was a drummer in the group.
https://www.youtube.com/watch?v=v-a8LQx … rt_radio=1
(Dave Holland - Conference of the Birds)

So yeah, it compiles and runs on i386 architecture. I didn't make a package. I just copied files into place and ran the postinstall script. At first the equalizer wasn't working. Then I read the README and then I googled to find 'alsamixer -D equal' which did work. After that, the AlsaTune equalizer worked.

It nice to have the volume and frequency sliders all available in the same window. Let's talk about packaging in real time.

Offline

#79 2025-12-15 16:12:30

greenjeans
Member
Registered: 2017-04-07
Posts: 1,367  
Website

Re: ALSA-only purists: Question, new GUI app for the mixer and EQ?

That's awesome! Thanks so much for giving that a try, working on the next upgrade all day yesterday and still not done, but i've figured out how I want to deal with the toggles on the backend, and I have a working prototype now, very simple to use, very hard to make, lol.

Just an observation from what i've learned so far:
I like C, only been messing with it since earlier this year, but it's fairly easy to get the hang of, i'm enjoying it more and more. C is not really what makes things take so long, it's GTK and CSS and doing 50+ cycles of compile/test/mod/repeat just to get one f***ing element to be in the right place and look right.

me: Okay gcc, let's rock this thing, go!
gcc: Sorry bro, you used a deprecated command that's been replaced by a command that does the exact same thing but has another name.
me:
gcc:
me: **** you
gcc: **** you noob, RTFM.


https://sourceforge.net/projects/vuu-do/ New Vuu-do isos uploaded October 2025!
Vuu-do GNU/Linux, minimal Devuan-based Openbox and Mate systems to build on. Also a max version for OB.
Devuan 5 mate-mini iso, pure Devuan, 100% no-vuu-do. wink Devuan 6 version also available for testing.
Please donate to support Devuan and init freedom! https://devuan.org/os/donate

Offline

#80 2025-12-15 20:47:42

greenjeans
Member
Registered: 2017-04-07
Posts: 1,367  
Website

Re: ALSA-only purists: Question, new GUI app for the mixer and EQ?

Getting there....should have a version 3 of AlsaTune soon!

d1by3r.jpg

This is a separate script that will be called from a button on the regular AlsaTune gui and pops up it's own window. There just wasn't space on the main gui to do everything and this works a lot better, more modular so it's easier to work on and very simple. It works basically the same way as AlsaTune, polls the backend for functions that are pure on/off toggles, checkbox to indicate status, name, description. Easy and simple even for a novice to work with. All changes are instantaneously applied in real-time, you can open the alsamixer backend and watch it change while you click.

Last edited by greenjeans (2025-12-15 20:57:24)


https://sourceforge.net/projects/vuu-do/ New Vuu-do isos uploaded October 2025!
Vuu-do GNU/Linux, minimal Devuan-based Openbox and Mate systems to build on. Also a max version for OB.
Devuan 5 mate-mini iso, pure Devuan, 100% no-vuu-do. wink Devuan 6 version also available for testing.
Please donate to support Devuan and init freedom! https://devuan.org/os/donate

Offline

#81 2025-12-16 00:49:00

greenjeans
Member
Registered: 2017-04-07
Posts: 1,367  
Website

Re: ALSA-only purists: Question, new GUI app for the mixer and EQ?

Got it all essentially done, I added one more feature after adding the new button/script, I added a tooltip that only appears when you hover over volume sliders that have a mute function, to let you know that you can right-click to mute/unmute, it's a small thing but there was no clear instruction about that in the main gui.

So for the new script, it would be so amazing if some of you smart folks could take a minute and test function. It's a complete standalone script so you don't need AlsaTune to run it, just compile it and run. I'm especially interested in any new toggles it might miss, and whether it gives a proper description on common toggles or falls back to the default because of a new name.

You will need gcc of course and all that it pulls in, and you will also need the libgtk3-dev and libasound2-dev packages.

Compile:

gcc alsatoggle.c -o alsatoggle $(pkg-config --cflags --libs gtk+-3.0) -lasound

alsatoggle.c

#include <gtk/gtk.h>
#include <alsa/asoundlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>

typedef struct {
    snd_mixer_elem_t *elem;
} ToggleChannel;

typedef struct {
    snd_mixer_t *mixer;
    ToggleChannel *channels;
    int num_channels;
    GtkListStore *store;
} ToggleData;

// Normalize name for matching (lowercase, spaces/dashes removed)
static void normalize_name(char *dest, const char *src, size_t dest_size) {
    size_t i = 0;
    while (*src && i < dest_size - 1) {
        char c = tolower(*src);
        if (c != ' ' && c != '-') {
            dest[i++] = c;
        }
        src++;
    }
    dest[i] = '\0';
}

// Get user-friendly description, this section will need fine-tuning and additions
static const char* get_description(const char *alsa_name) {
    char normalized[128];
    normalize_name(normalized, alsa_name, sizeof(normalized));

    if (strstr(normalized, "automute") ||
        strstr(normalized, "automutemode") ||
        strstr(normalized, "automode")) {
        return "Automatically mutes internal speakers when headphones are plugged in.";
    }
    else if (strstr(normalized, "loopback")) {
        return "Routes audio output back to input (for recording what you hear).";
    }
    else if (strstr(normalized, "independenthp") ||
             strstr(normalized, "independentheadphone")) {
        return "Allows independent audio streams for headphones and speakers (no auto-muting of speakers).";
    }
    else if (strstr(normalized, "beep")) {
        return "Controls the PC speaker beep tone (system alerts). Usually best left disabled to avoid noise.";
    }
    else if (strstr(normalized, "phantom") ||
             strstr(normalized, "48v")) {
        return "Provides 48V phantom power for condenser microphones.";
    }

    return "Toggles this audio control on or off.";
}

// Callback when a toggle is flipped
static void on_toggle_changed(GtkCellRendererToggle *renderer, gchar *path_str, ToggleData *data) {
    GtkTreeIter iter;
    if (!gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(data->store), &iter, path_str))
        return;

    gboolean active;
    gtk_tree_model_get(GTK_TREE_MODEL(data->store), &iter, 0, &active, -1);
    active = !active;  // Flip it

    int row = atoi(path_str);
    snd_mixer_elem_t *elem = data->channels[row].elem;

    // Apply to ALSA
    if (snd_mixer_selem_has_playback_switch(elem)) {
        snd_mixer_selem_set_playback_switch_all(elem, active);
    }
    if (snd_mixer_selem_has_capture_switch(elem)) {
        snd_mixer_selem_set_capture_switch_all(elem, active);
    }
    if (snd_mixer_selem_is_enumerated(elem)) {
        unsigned int item = active ? 1 : 0;  // Most are 0=Disabled, 1=Enabled
        snd_mixer_selem_set_enum_item(elem, 0, item);
    }

    // Update the store/UI
    gtk_list_store_set(data->store, &iter, 0, active, -1);
}

static gboolean on_row_click(GtkWidget *treeview, GdkEventButton *event, ToggleData *data) {
    if (event->button == 3) { // Right-click toggle
        GtkTreePath *path;
        if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(treeview), event->x, event->y, &path, NULL, NULL, NULL)) {
            GtkTreeIter iter;
            if (gtk_tree_model_get_iter(GTK_TREE_MODEL(data->store), &iter, path)) {
                gboolean active;
                gtk_tree_model_get(GTK_TREE_MODEL(data->store), &iter, 0, &active, -1);
                active = !active;
                gtk_list_store_set(data->store, &iter, 0, active, -1);

                int row = gtk_tree_path_get_indices(path)[0];
                snd_mixer_elem_t *elem = data->channels[row].elem;
                // Same apply code as on_toggle_changed
                if (snd_mixer_selem_has_playback_switch(elem)) {
                    snd_mixer_selem_set_playback_switch_all(elem, active);
                }
                if (snd_mixer_selem_has_capture_switch(elem)) {
                    snd_mixer_selem_set_capture_switch_all(elem, active);
                }
                if (snd_mixer_selem_is_enumerated(elem)) {
                    unsigned int item = active ? 1 : 0;
                    snd_mixer_selem_set_enum_item(elem, 0, item);
                }
            }
            gtk_tree_path_free(path);
            return TRUE; // Handled
        }
    }
    return FALSE; // Pass left-click through
}

// Initialize ALSA and find toggles
static void init_alsa_toggles(ToggleData *data) {
    data->mixer = NULL;
    data->channels = NULL;
    data->num_channels = 0;

    if (snd_mixer_open(&data->mixer, 0) < 0) return;

    if (snd_mixer_attach(data->mixer, "default") < 0 ||
        snd_mixer_selem_register(data->mixer, NULL, NULL) < 0 ||
        snd_mixer_load(data->mixer) < 0) {
        snd_mixer_close(data->mixer);
        return;
    }

    ToggleChannel temp[64];
    int count = 0;

    snd_mixer_elem_t *elem;
    for (elem = snd_mixer_first_elem(data->mixer); elem; elem = snd_mixer_elem_next(elem)) {
        if (!snd_mixer_selem_is_active(elem)) continue;

        gboolean has_volume = snd_mixer_selem_has_playback_volume(elem) ||
                              snd_mixer_selem_has_capture_volume(elem);
        gboolean has_switch = snd_mixer_selem_has_playback_switch(elem) ||
                              snd_mixer_selem_has_capture_switch(elem);
        gboolean is_enum = snd_mixer_selem_is_enumerated(elem);

        // Pure toggle: either a switch without volume, or an enumerated control
        if ((has_switch && !has_volume) || is_enum) {
            if (count >= 64) break;
            temp[count].elem = elem;
            count++;
        }
    }

    if (count > 0) {
        data->num_channels = count;
        data->channels = g_new(ToggleChannel, count);
        memcpy(data->channels, temp, count * sizeof(ToggleChannel));
    }
}

static void cleanup_alsa(ToggleData *data) {
    if (data->mixer) snd_mixer_close(data->mixer);
    g_free(data->channels);
}

int main(int argc, char *argv[]) {
    gtk_init(&argc, &argv);

    gtk_window_set_default_icon_name("audio-speakers");

    ToggleData data = {0};
    init_alsa_toggles(&data);

    GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window), "AlsaTune - Toggle Functions");
    gtk_window_set_default_size(GTK_WINDOW(window), 660, 400);
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);

    // Some styling to match main app
    GtkCssProvider *css = gtk_css_provider_new();
    gtk_css_provider_load_from_data(css,
        "box { border: 2px solid #333333; border-radius: 4px; }"
        "button { border: 1px solid #333333; border-radius: 4px; }",
        -1, NULL);
    gtk_style_context_add_provider_for_screen(gdk_screen_get_default(),
                                              GTK_STYLE_PROVIDER(css),
                                              GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);

    GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
    gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
    gtk_container_add(GTK_CONTAINER(window), vbox);

    GtkWidget *scrolled = gtk_scrolled_window_new(NULL, NULL);
    gtk_box_pack_start(GTK_BOX(vbox), scrolled, TRUE, TRUE, 0);

    if (data.num_channels == 0) {
        GtkWidget *label = gtk_label_new("No toggle controls detected on this system.");
        gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
        gtk_widget_set_margin_top(label, 40);
        gtk_container_add(GTK_CONTAINER(scrolled), label);
    } else {
        GtkWidget *treeview = gtk_tree_view_new();
        GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
        gtk_tree_selection_set_mode(selection, GTK_SELECTION_NONE);
        gtk_container_add(GTK_CONTAINER(scrolled), treeview);
        gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE);

        // Column 1: Toggle switch
        GtkCellRenderer *rend_toggle = gtk_cell_renderer_toggle_new();
        GtkTreeViewColumn *col_toggle = gtk_tree_view_column_new_with_attributes("", rend_toggle, "active", 0, NULL);
        gtk_tree_view_column_set_fixed_width(col_toggle, 80);
        gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), col_toggle);

        // Column 2: Name
        GtkCellRenderer *rend_name = gtk_cell_renderer_text_new();
        g_object_set(rend_name, "weight", PANGO_WEIGHT_BOLD, "xpad", 10, NULL);
        GtkTreeViewColumn *col_name = gtk_tree_view_column_new_with_attributes("Control", rend_name, "text", 1, NULL);
        gtk_tree_view_column_set_min_width(col_name, 200);
        gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), col_name);

        // Column 3: Description (wraps and expands)
        GtkCellRenderer *rend_desc = gtk_cell_renderer_text_new();
        g_object_set(rend_desc, "wrap-mode", PANGO_WRAP_WORD, "wrap-width", 330, NULL);
        GtkTreeViewColumn *col_desc = gtk_tree_view_column_new_with_attributes("Description", rend_desc, "text", 2, NULL);
        gtk_tree_view_column_set_expand(col_desc, TRUE);
        gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), col_desc);

        // ListStore: active (bool), name (string), description (string)
        data.store = gtk_list_store_new(3, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING);
        gtk_tree_view_set_model(GTK_TREE_VIEW(treeview), GTK_TREE_MODEL(data.store));

        for (int i = 0; i < data.num_channels; i++) {
            snd_mixer_elem_t *elem = data.channels[i].elem;
            const char *name = snd_mixer_selem_get_name(elem);
            const char *desc = get_description(name);

            // Determine current state
            gboolean active = FALSE;
            if (snd_mixer_selem_has_playback_switch(elem)) {
                int val;
                snd_mixer_selem_get_playback_switch(elem, SND_MIXER_SCHN_FRONT_LEFT, &val);
                active = val;
            } else if (snd_mixer_selem_is_enumerated(elem)) {
                unsigned int item;
                snd_mixer_selem_get_enum_item(elem, 0, &item);
                active = (item == 1);  // Adjust if any are reversed
            }

            GtkTreeIter iter;
            gtk_list_store_append(data.store, &iter);
            gtk_list_store_set(data.store, &iter,
                               0, active,
                               1, name,
                               2, desc,
                               -1);
        }

        g_signal_connect(rend_toggle, "toggled", G_CALLBACK(on_toggle_changed), &data);
        g_signal_connect(treeview, "button-press-event", G_CALLBACK(on_row_click), &data);
    }

    // Big goofy close button at bottom
    GtkWidget *close_btn = gtk_button_new_with_label("To enable a function, check the box beside it or hover over its row and right-click."
    "\nUncheck or click again to disable.  Left-click here to exit this window when done.");
    gtk_widget_set_tooltip_text(close_btn, 
    "Click this button (or the window's X) to close when you're done. "
    "All changes are applied instantly and saved on the backend, no further action needed.");
    gtk_widget_set_halign(close_btn, GTK_ALIGN_CENTER);
    gtk_widget_set_margin_top(close_btn, 10);
    gtk_widget_set_margin_bottom(close_btn, 10);
    g_signal_connect_swapped(close_btn, "clicked", G_CALLBACK(gtk_widget_destroy), window);
    gtk_box_pack_start(GTK_BOX(vbox), close_btn, FALSE, FALSE, 0);

    gtk_widget_show_all(window);
    gtk_main();

    cleanup_alsa(&data);
    return 0;
}

https://sourceforge.net/projects/vuu-do/ New Vuu-do isos uploaded October 2025!
Vuu-do GNU/Linux, minimal Devuan-based Openbox and Mate systems to build on. Also a max version for OB.
Devuan 5 mate-mini iso, pure Devuan, 100% no-vuu-do. wink Devuan 6 version also available for testing.
Please donate to support Devuan and init freedom! https://devuan.org/os/donate

Offline

#82 2025-12-16 07:56:01

rations
Member
Registered: 2025-11-06
Posts: 22  

Re: ALSA-only purists: Question, new GUI app for the mixer and EQ?

Great job. Have you considered adding capture? Could be handy for people using jitsi etc. I couldn't figure out why the mic wasn't working and it turned out capture was not enabled.

Also I tired installing vuudo mini the other day and couldn't get it to boot. Not sure what I did wrong but the live version worked.


You will own nothing and be depressed

Offline

#83 2025-12-16 09:03:42

wert
Member
Registered: 2025-10-30
Posts: 11  

Re: ALSA-only purists: Question, new GUI app for the mixer and EQ?

too much gtk and too little alsa smile
that gtk is going to kill you.

if you like to experiment about get rid of gtk. here is your base smile

#define _GNU_SOURCE
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <stdio.h>
#include <fcntl.h>
#include <wchar.h>
#include <sys/mman.h>
#include <linux/input-event-codes.h>

#include <wayland-client-protocol.h>
#include "xdg.h"

static struct wl_display*					dis;
static struct wl_registry*                  reg;
static struct wl_compositor*                comp;
static struct wl_shm_pool*					pool;
static struct wl_buffer*					wbuf;
static struct wl_seat*						seat;
static struct wl_surface*					wsur;
static struct wl_shm*                       shm;
static struct wl_shm_pool*                  pool;
static struct wl_keyboard*					kbd;
static struct xdg_wm_base*					wm;
static struct xdg_surface*					xsur;
static struct xdg_toplevel*					xtop;
static struct wl_pointer*					ptr;

static int					w, h, shmfd, run, *map, clr = 0xff33aa55;

static void vm_ping(void *data, struct xdg_wm_base *base, uint32_t serial){
	xdg_wm_base_pong(base, serial);
}
static const struct xdg_wm_base_listener vm_l = { vm_ping };

static void xsurconf(void *data, struct xdg_surface *xdg_surface, uint32_t serial){
	xdg_surface_ack_configure(xdg_surface, serial);
}
static const struct xdg_surface_listener xsur_l = { xsurconf };

static void xtopconf(void *data, struct xdg_toplevel *xdg_toplevel, int32_t width, int32_t height, struct wl_array *states){}
static void xtopclose(void *data, struct xdg_toplevel *xdg_toplevel){}
static void xtopbounds(void *data, struct xdg_toplevel *xdg_toplevel, int32_t width, int32_t height){}
static const struct xdg_toplevel_listener xtop_l = { xtopconf, xtopclose, xtopbounds };

static void wbuf_release(void *data, struct wl_buffer *wb) {
}
static const struct wl_buffer_listener wbuf_l = { wbuf_release };

static void wsur_enter(void *data, struct wl_surface *wl_surface, struct wl_output *output){}
static void wsur_leave(void *data, struct wl_surface *wl_surface, struct wl_output *output){}
static const struct wl_surface_listener wsur_l = { wsur_enter, wsur_leave };

static void kbd_keymap(void *data, struct wl_keyboard *wl_keyboard, unsigned format, int fd, unsigned size){}
static void kbd_enter(void *data, struct wl_keyboard *wl_keyboard, unsigned serial, struct wl_surface *surface, struct wl_array *keys){}
static void kbd_leave(void *data, struct wl_keyboard *wl_keyboard, unsigned serial, struct wl_surface *surface){}
static void kbd_key(void *data, struct wl_keyboard *wl_keyboard, unsigned serial, unsigned time, unsigned key, unsigned state){
	if(key == KEY_F4 && state) run = 0;

	else if(key == KEY_F3 && state) {
		clr = 0xffaa3355;
		wmemset(map, clr, w * 40);
		wl_surface_attach(wsur, wbuf, 0, 0);
		wl_surface_damage_buffer(wsur, 0, 0, w, h);
		wl_surface_commit(wsur);
	}
}

static void kbd_modifiers(void *data, struct wl_keyboard *wl_keyboard, unsigned serial, unsigned mods_depressed, unsigned mods_latched, unsigned mods_locked, unsigned group){}
static void kbd_repeat(void *data, struct wl_keyboard *wl_keyboard, int rate, int delay){}
static const struct wl_keyboard_listener kbd_l = {
	kbd_keymap,
	kbd_enter,
	kbd_leave,
	kbd_key,
	kbd_modifiers,
	kbd_repeat
};

static void shmfmt(void *data, struct wl_shm *wl_shm, uint32_t fmt){}
static const struct wl_shm_listener shm_l = { shmfmt };

static void seat_caps(void *data, struct wl_seat *wl_seat, unsigned caps){}
static void seat_name(void *data, struct wl_seat *wl_seat, const char *name){}
static const struct wl_seat_listener seat_l = { seat_caps, seat_name };

static void g_add(void *data, struct wl_registry *wlreg, unsigned name, const char *interface, unsigned version){
//	printf("version: %u     name: %s\n", version, interface);

	if(!strcmp(interface, "wl_compositor")) {
		comp = wl_registry_bind(wlreg, name, &wl_compositor_interface, version);

	} else if(!strcmp(interface, "wl_seat")) {
		seat = wl_registry_bind(wlreg, name, &wl_seat_interface, version);
		wl_seat_add_listener(seat, &seat_l, data);
		kbd = wl_seat_get_keyboard(seat);
		wl_keyboard_add_listener(kbd, &kbd_l, data);
		ptr = wl_seat_get_pointer(seat);

	} else if(!strcmp(interface, "wl_shm")) {
		shm = wl_registry_bind(wlreg, name, &wl_shm_interface, version);
		wl_shm_add_listener(shm, &shm_l, data);

	} else if(!strcmp(interface, "xdg_wm_base")) {
		wm = wl_registry_bind(wlreg, name, &xdg_wm_base_interface, version);
		xdg_wm_base_add_listener(wm, &vm_l, data);

	}
}
static void g_rm(void *data, struct wl_registry *wlreg, unsigned name){}
static const struct wl_registry_listener reg_l = { g_add, g_rm };

int main(int argc, char *argv[]){
	w = 1920, h = 1080;

	dis = wl_display_connect(NULL);
	reg = wl_display_get_registry(dis);
	wl_registry_add_listener(reg, &reg_l, NULL);
	wl_display_roundtrip(dis);

	shmfd = open("/tmp/shmpool", O_RDWR | O_CREAT, 0644);
	ftruncate(shmfd, w * h * 4);
	pool = wl_shm_create_pool(shm, shmfd, w * h * 4);

	map = mmap(NULL, w * h * 4, PROT_READ | PROT_WRITE, MAP_SHARED, shmfd, 0);
	close(shmfd);

	wbuf = wl_shm_pool_create_buffer(pool, 0, w, h, 4 * w, 	WL_SHM_FORMAT_XRGB8888);
	wl_buffer_add_listener(wbuf, &wbuf_l, NULL);

	wsur = wl_compositor_create_surface(comp);
	wl_surface_add_listener(wsur, &wsur_l, NULL);

	xsur = xdg_wm_base_get_xdg_surface(wm, wsur);
	xdg_surface_add_listener(xsur, &xsur_l, NULL);

	xtop = xdg_surface_get_toplevel(xsur);
	xdg_toplevel_add_listener(xtop, &xtop_l, NULL);
	wl_surface_commit(wsur);
	wl_display_roundtrip(dis);

//	xdg_toplevel_set_fullscreen(xtop, struct wl_output *output);

	wmemset(map, clr, w * 40);
	wl_surface_attach(wsur, wbuf, 0, 0);
	wl_surface_damage_buffer(wsur, 0, 0, w, h);
	wl_surface_commit(wsur);

	run = 1;
	while(run) {
		wl_display_dispatch(dis);           // this is a blocking func eg. if no event on display this call blocked.
	}

	xdg_toplevel_destroy(xtop);
	xdg_surface_destroy(xsur);
	xdg_wm_base_destroy(wm);

	wl_surface_attach(wsur, NULL, 0, 0);
	wl_surface_destroy(wsur);

	wl_buffer_destroy(wbuf);
	wl_shm_pool_destroy(pool);
	wl_shm_destroy(shm);

	wl_seat_release(seat);
	wl_compositor_destroy(comp);
	wl_display_disconnect(dis);

    return 0;
}

This is a 8x16 ascii bitmap font to experiment about get rid of font renderers/configs. (eg freetype, fontconfig)

static char	ascii_8x16_bitmap_font[1504] = {
	/* 33 0x21 '!' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x18, /* 00011000 */
	0x3c, /* 00111100 */
	0x3c, /* 00111100 */
	0x3c, /* 00111100 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x00, /* 00000000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 34 0x22 '"' */
	0x00, /* 00000000 */
	0x66, /* 01100110 */
	0x66, /* 01100110 */
	0x66, /* 01100110 */
	0x24, /* 00100100 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 35 0x23 '#' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x6c, /* 01101100 */
	0x6c, /* 01101100 */
	0xfe, /* 11111110 */
	0x6c, /* 01101100 */
	0x6c, /* 01101100 */
	0x6c, /* 01101100 */
	0xfe, /* 11111110 */
	0x6c, /* 01101100 */
	0x6c, /* 01101100 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 36 0x24 '$' */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x7c, /* 01111100 */
	0xc6, /* 11000110 */
	0xc2, /* 11000010 */
	0xc0, /* 11000000 */
	0x7c, /* 01111100 */
	0x06, /* 00000110 */
	0x06, /* 00000110 */
	0x86, /* 10000110 */
	0xc6, /* 11000110 */
	0x7c, /* 01111100 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 37 0x25 '%' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0xc2, /* 11000010 */
	0xc6, /* 11000110 */
	0x0c, /* 00001100 */
	0x18, /* 00011000 */
	0x30, /* 00110000 */
	0x60, /* 01100000 */
	0xc6, /* 11000110 */
	0x86, /* 10000110 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 38 0x26 '&' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x38, /* 00111000 */
	0x6c, /* 01101100 */
	0x6c, /* 01101100 */
	0x38, /* 00111000 */
	0x76, /* 01110110 */
	0xdc, /* 11011100 */
	0xcc, /* 11001100 */
	0xcc, /* 11001100 */
	0xcc, /* 11001100 */
	0x76, /* 01110110 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 39 0x27 ''' */
	0x00, /* 00000000 */
	0x30, /* 00110000 */
	0x30, /* 00110000 */
	0x30, /* 00110000 */
	0x60, /* 01100000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 40 0x28 '(' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x0c, /* 00001100 */
	0x18, /* 00011000 */
	0x30, /* 00110000 */
	0x30, /* 00110000 */
	0x30, /* 00110000 */
	0x30, /* 00110000 */
	0x30, /* 00110000 */
	0x30, /* 00110000 */
	0x18, /* 00011000 */
	0x0c, /* 00001100 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 41 0x29 ')' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x30, /* 00110000 */
	0x18, /* 00011000 */
	0x0c, /* 00001100 */
	0x0c, /* 00001100 */
	0x0c, /* 00001100 */
	0x0c, /* 00001100 */
	0x0c, /* 00001100 */
	0x0c, /* 00001100 */
	0x18, /* 00011000 */
	0x30, /* 00110000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 42 0x2a '*' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x66, /* 01100110 */
	0x3c, /* 00111100 */
	0xff, /* 11111111 */
	0x3c, /* 00111100 */
	0x66, /* 01100110 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 43 0x2b '+' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x7e, /* 01111110 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 44 0x2c ',' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x30, /* 00110000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 45 0x2d '-' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0xfe, /* 11111110 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 46 0x2e '.' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 47 0x2f '/' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x02, /* 00000010 */
	0x06, /* 00000110 */
	0x0c, /* 00001100 */
	0x18, /* 00011000 */
	0x30, /* 00110000 */
	0x60, /* 01100000 */
	0xc0, /* 11000000 */
	0x80, /* 10000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 48 0x30 '0' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x38, /* 00111000 */
	0x6c, /* 01101100 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xd6, /* 11010110 */
	0xd6, /* 11010110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0x6c, /* 01101100 */
	0x38, /* 00111000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 49 0x31 '1' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x18, /* 00011000 */
	0x38, /* 00111000 */
	0x78, /* 01111000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x7e, /* 01111110 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 50 0x32 '2' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x7c, /* 01111100 */
	0xc6, /* 11000110 */
	0x06, /* 00000110 */
	0x0c, /* 00001100 */
	0x18, /* 00011000 */
	0x30, /* 00110000 */
	0x60, /* 01100000 */
	0xc0, /* 11000000 */
	0xc6, /* 11000110 */
	0xfe, /* 11111110 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 51 0x33 '3' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x7c, /* 01111100 */
	0xc6, /* 11000110 */
	0x06, /* 00000110 */
	0x06, /* 00000110 */
	0x3c, /* 00111100 */
	0x06, /* 00000110 */
	0x06, /* 00000110 */
	0x06, /* 00000110 */
	0xc6, /* 11000110 */
	0x7c, /* 01111100 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 52 0x34 '4' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x0c, /* 00001100 */
	0x1c, /* 00011100 */
	0x3c, /* 00111100 */
	0x6c, /* 01101100 */
	0xcc, /* 11001100 */
	0xfe, /* 11111110 */
	0x0c, /* 00001100 */
	0x0c, /* 00001100 */
	0x0c, /* 00001100 */
	0x1e, /* 00011110 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 53 0x35 '5' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0xfe, /* 11111110 */
	0xc0, /* 11000000 */
	0xc0, /* 11000000 */
	0xc0, /* 11000000 */
	0xfc, /* 11111100 */
	0x06, /* 00000110 */
	0x06, /* 00000110 */
	0x06, /* 00000110 */
	0xc6, /* 11000110 */
	0x7c, /* 01111100 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 54 0x36 '6' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x38, /* 00111000 */
	0x60, /* 01100000 */
	0xc0, /* 11000000 */
	0xc0, /* 11000000 */
	0xfc, /* 11111100 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0x7c, /* 01111100 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 55 0x37 '7' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0xfe, /* 11111110 */
	0xc6, /* 11000110 */
	0x06, /* 00000110 */
	0x06, /* 00000110 */
	0x0c, /* 00001100 */
	0x18, /* 00011000 */
	0x30, /* 00110000 */
	0x30, /* 00110000 */
	0x30, /* 00110000 */
	0x30, /* 00110000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 56 0x38 '8' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x7c, /* 01111100 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0x7c, /* 01111100 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0x7c, /* 01111100 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 57 0x39 '9' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x7c, /* 01111100 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0x7e, /* 01111110 */
	0x06, /* 00000110 */
	0x06, /* 00000110 */
	0x06, /* 00000110 */
	0x0c, /* 00001100 */
	0x78, /* 01111000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 58 0x3a ':' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 59 0x3b ';' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x30, /* 00110000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 60 0x3c '<' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x06, /* 00000110 */
	0x0c, /* 00001100 */
	0x18, /* 00011000 */
	0x30, /* 00110000 */
	0x60, /* 01100000 */
	0x30, /* 00110000 */
	0x18, /* 00011000 */
	0x0c, /* 00001100 */
	0x06, /* 00000110 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 61 0x3d '=' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x7e, /* 01111110 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x7e, /* 01111110 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 62 0x3e '>' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x60, /* 01100000 */
	0x30, /* 00110000 */
	0x18, /* 00011000 */
	0x0c, /* 00001100 */
	0x06, /* 00000110 */
	0x0c, /* 00001100 */
	0x18, /* 00011000 */
	0x30, /* 00110000 */
	0x60, /* 01100000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 63 0x3f '?' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x7c, /* 01111100 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0x0c, /* 00001100 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x00, /* 00000000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 64 0x40 '@' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x7c, /* 01111100 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xde, /* 11011110 */
	0xde, /* 11011110 */
	0xde, /* 11011110 */
	0xdc, /* 11011100 */
	0xc0, /* 11000000 */
	0x7c, /* 01111100 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 65 0x41 'A' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x10, /* 00010000 */
	0x38, /* 00111000 */
	0x6c, /* 01101100 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xfe, /* 11111110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 66 0x42 'B' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0xfc, /* 11111100 */
	0x66, /* 01100110 */
	0x66, /* 01100110 */
	0x66, /* 01100110 */
	0x7c, /* 01111100 */
	0x66, /* 01100110 */
	0x66, /* 01100110 */
	0x66, /* 01100110 */
	0x66, /* 01100110 */
	0xfc, /* 11111100 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 67 0x43 'C' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x3c, /* 00111100 */
	0x66, /* 01100110 */
	0xc2, /* 11000010 */
	0xc0, /* 11000000 */
	0xc0, /* 11000000 */
	0xc0, /* 11000000 */
	0xc0, /* 11000000 */
	0xc2, /* 11000010 */
	0x66, /* 01100110 */
	0x3c, /* 00111100 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 68 0x44 'D' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0xf8, /* 11111000 */
	0x6c, /* 01101100 */
	0x66, /* 01100110 */
	0x66, /* 01100110 */
	0x66, /* 01100110 */
	0x66, /* 01100110 */
	0x66, /* 01100110 */
	0x66, /* 01100110 */
	0x6c, /* 01101100 */
	0xf8, /* 11111000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 69 0x45 'E' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0xfe, /* 11111110 */
	0x66, /* 01100110 */
	0x62, /* 01100010 */
	0x68, /* 01101000 */
	0x78, /* 01111000 */
	0x68, /* 01101000 */
	0x60, /* 01100000 */
	0x62, /* 01100010 */
	0x66, /* 01100110 */
	0xfe, /* 11111110 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 70 0x46 'F' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0xfe, /* 11111110 */
	0x66, /* 01100110 */
	0x62, /* 01100010 */
	0x68, /* 01101000 */
	0x78, /* 01111000 */
	0x68, /* 01101000 */
	0x60, /* 01100000 */
	0x60, /* 01100000 */
	0x60, /* 01100000 */
	0xf0, /* 11110000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 71 0x47 'G' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x3c, /* 00111100 */
	0x66, /* 01100110 */
	0xc2, /* 11000010 */
	0xc0, /* 11000000 */
	0xc0, /* 11000000 */
	0xde, /* 11011110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0x66, /* 01100110 */
	0x3a, /* 00111010 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 72 0x48 'H' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xfe, /* 11111110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 73 0x49 'I' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x3c, /* 00111100 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x3c, /* 00111100 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 74 0x4a 'J' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x1e, /* 00011110 */
	0x0c, /* 00001100 */
	0x0c, /* 00001100 */
	0x0c, /* 00001100 */
	0x0c, /* 00001100 */
	0x0c, /* 00001100 */
	0xcc, /* 11001100 */
	0xcc, /* 11001100 */
	0xcc, /* 11001100 */
	0x78, /* 01111000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 75 0x4b 'K' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0xe6, /* 11100110 */
	0x66, /* 01100110 */
	0x66, /* 01100110 */
	0x6c, /* 01101100 */
	0x78, /* 01111000 */
	0x78, /* 01111000 */
	0x6c, /* 01101100 */
	0x66, /* 01100110 */
	0x66, /* 01100110 */
	0xe6, /* 11100110 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 76 0x4c 'L' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0xf0, /* 11110000 */
	0x60, /* 01100000 */
	0x60, /* 01100000 */
	0x60, /* 01100000 */
	0x60, /* 01100000 */
	0x60, /* 01100000 */
	0x60, /* 01100000 */
	0x62, /* 01100010 */
	0x66, /* 01100110 */
	0xfe, /* 11111110 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 77 0x4d 'M' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0xc6, /* 11000110 */
	0xee, /* 11101110 */
	0xfe, /* 11111110 */
	0xfe, /* 11111110 */
	0xd6, /* 11010110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 78 0x4e 'N' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0xc6, /* 11000110 */
	0xe6, /* 11100110 */
	0xf6, /* 11110110 */
	0xfe, /* 11111110 */
	0xde, /* 11011110 */
	0xce, /* 11001110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 79 0x4f 'O' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x7c, /* 01111100 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0x7c, /* 01111100 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 80 0x50 'P' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0xfc, /* 11111100 */
	0x66, /* 01100110 */
	0x66, /* 01100110 */
	0x66, /* 01100110 */
	0x7c, /* 01111100 */
	0x60, /* 01100000 */
	0x60, /* 01100000 */
	0x60, /* 01100000 */
	0x60, /* 01100000 */
	0xf0, /* 11110000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 81 0x51 'Q' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x7c, /* 01111100 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xd6, /* 11010110 */
	0xde, /* 11011110 */
	0x7c, /* 01111100 */
	0x0c, /* 00001100 */
	0x0e, /* 00001110 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 82 0x52 'R' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0xfc, /* 11111100 */
	0x66, /* 01100110 */
	0x66, /* 01100110 */
	0x66, /* 01100110 */
	0x7c, /* 01111100 */
	0x6c, /* 01101100 */
	0x66, /* 01100110 */
	0x66, /* 01100110 */
	0x66, /* 01100110 */
	0xe6, /* 11100110 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 83 0x53 'S' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x7c, /* 01111100 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0x60, /* 01100000 */
	0x38, /* 00111000 */
	0x0c, /* 00001100 */
	0x06, /* 00000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0x7c, /* 01111100 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 84 0x54 'T' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x7e, /* 01111110 */
	0x7e, /* 01111110 */
	0x5a, /* 01011010 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x3c, /* 00111100 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 85 0x55 'U' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0x7c, /* 01111100 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 86 0x56 'V' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0x6c, /* 01101100 */
	0x38, /* 00111000 */
	0x10, /* 00010000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 87 0x57 'W' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xd6, /* 11010110 */
	0xd6, /* 11010110 */
	0xd6, /* 11010110 */
	0xfe, /* 11111110 */
	0xee, /* 11101110 */
	0x6c, /* 01101100 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 88 0x58 'X' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0x6c, /* 01101100 */
	0x7c, /* 01111100 */
	0x38, /* 00111000 */
	0x38, /* 00111000 */
	0x7c, /* 01111100 */
	0x6c, /* 01101100 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 89 0x59 'Y' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x66, /* 01100110 */
	0x66, /* 01100110 */
	0x66, /* 01100110 */
	0x66, /* 01100110 */
	0x3c, /* 00111100 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x3c, /* 00111100 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 90 0x5a 'Z' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0xfe, /* 11111110 */
	0xc6, /* 11000110 */
	0x86, /* 10000110 */
	0x0c, /* 00001100 */
	0x18, /* 00011000 */
	0x30, /* 00110000 */
	0x60, /* 01100000 */
	0xc2, /* 11000010 */
	0xc6, /* 11000110 */
	0xfe, /* 11111110 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 91 0x5b '[' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x3c, /* 00111100 */
	0x30, /* 00110000 */
	0x30, /* 00110000 */
	0x30, /* 00110000 */
	0x30, /* 00110000 */
	0x30, /* 00110000 */
	0x30, /* 00110000 */
	0x30, /* 00110000 */
	0x30, /* 00110000 */
	0x3c, /* 00111100 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 92 0x5c '\' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x80, /* 10000000 */
	0xc0, /* 11000000 */
	0xe0, /* 11100000 */
	0x70, /* 01110000 */
	0x38, /* 00111000 */
	0x1c, /* 00011100 */
	0x0e, /* 00001110 */
	0x06, /* 00000110 */
	0x02, /* 00000010 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 93 0x5d ']' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x3c, /* 00111100 */
	0x0c, /* 00001100 */
	0x0c, /* 00001100 */
	0x0c, /* 00001100 */
	0x0c, /* 00001100 */
	0x0c, /* 00001100 */
	0x0c, /* 00001100 */
	0x0c, /* 00001100 */
	0x0c, /* 00001100 */
	0x3c, /* 00111100 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 94 0x5e '^' */
	0x10, /* 00010000 */
	0x38, /* 00111000 */
	0x6c, /* 01101100 */
	0xc6, /* 11000110 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 95 0x5f '_' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0xff, /* 11111111 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 96 0x60 '`' */
	0x00, /* 00000000 */
	0x30, /* 00110000 */
	0x18, /* 00011000 */
	0x0c, /* 00001100 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 97 0x61 'a' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x78, /* 01111000 */
	0x0c, /* 00001100 */
	0x7c, /* 01111100 */
	0xcc, /* 11001100 */
	0xcc, /* 11001100 */
	0xcc, /* 11001100 */
	0x76, /* 01110110 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 98 0x62 'b' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0xe0, /* 11100000 */
	0x60, /* 01100000 */
	0x60, /* 01100000 */
	0x78, /* 01111000 */
	0x6c, /* 01101100 */
	0x66, /* 01100110 */
	0x66, /* 01100110 */
	0x66, /* 01100110 */
	0x66, /* 01100110 */
	0x7c, /* 01111100 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 99 0x63 'c' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x7c, /* 01111100 */
	0xc6, /* 11000110 */
	0xc0, /* 11000000 */
	0xc0, /* 11000000 */
	0xc0, /* 11000000 */
	0xc6, /* 11000110 */
	0x7c, /* 01111100 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 100 0x64 'd' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x1c, /* 00011100 */
	0x0c, /* 00001100 */
	0x0c, /* 00001100 */
	0x3c, /* 00111100 */
	0x6c, /* 01101100 */
	0xcc, /* 11001100 */
	0xcc, /* 11001100 */
	0xcc, /* 11001100 */
	0xcc, /* 11001100 */
	0x76, /* 01110110 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 101 0x65 'e' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x7c, /* 01111100 */
	0xc6, /* 11000110 */
	0xfe, /* 11111110 */
	0xc0, /* 11000000 */
	0xc0, /* 11000000 */
	0xc6, /* 11000110 */
	0x7c, /* 01111100 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 102 0x66 'f' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x1c, /* 00011100 */
	0x36, /* 00110110 */
	0x32, /* 00110010 */
	0x30, /* 00110000 */
	0x78, /* 01111000 */
	0x30, /* 00110000 */
	0x30, /* 00110000 */
	0x30, /* 00110000 */
	0x30, /* 00110000 */
	0x78, /* 01111000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 103 0x67 'g' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x76, /* 01110110 */
	0xcc, /* 11001100 */
	0xcc, /* 11001100 */
	0xcc, /* 11001100 */
	0xcc, /* 11001100 */
	0xcc, /* 11001100 */
	0x7c, /* 01111100 */
	0x0c, /* 00001100 */
	0xcc, /* 11001100 */
	0x78, /* 01111000 */
	0x00, /* 00000000 */

	/* 104 0x68 'h' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0xe0, /* 11100000 */
	0x60, /* 01100000 */
	0x60, /* 01100000 */
	0x6c, /* 01101100 */
	0x76, /* 01110110 */
	0x66, /* 01100110 */
	0x66, /* 01100110 */
	0x66, /* 01100110 */
	0x66, /* 01100110 */
	0xe6, /* 11100110 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 105 0x69 'i' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x00, /* 00000000 */
	0x38, /* 00111000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x3c, /* 00111100 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 106 0x6a 'j' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x06, /* 00000110 */
	0x06, /* 00000110 */
	0x00, /* 00000000 */
	0x0e, /* 00001110 */
	0x06, /* 00000110 */
	0x06, /* 00000110 */
	0x06, /* 00000110 */
	0x06, /* 00000110 */
	0x06, /* 00000110 */
	0x06, /* 00000110 */
	0x66, /* 01100110 */
	0x66, /* 01100110 */
	0x3c, /* 00111100 */
	0x00, /* 00000000 */

	/* 107 0x6b 'k' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0xe0, /* 11100000 */
	0x60, /* 01100000 */
	0x60, /* 01100000 */
	0x66, /* 01100110 */
	0x6c, /* 01101100 */
	0x78, /* 01111000 */
	0x78, /* 01111000 */
	0x6c, /* 01101100 */
	0x66, /* 01100110 */
	0xe6, /* 11100110 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 108 0x6c 'l' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x38, /* 00111000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x3c, /* 00111100 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 109 0x6d 'm' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0xec, /* 11101100 */
	0xfe, /* 11111110 */
	0xd6, /* 11010110 */
	0xd6, /* 11010110 */
	0xd6, /* 11010110 */
	0xd6, /* 11010110 */
	0xc6, /* 11000110 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 110 0x6e 'n' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0xdc, /* 11011100 */
	0x66, /* 01100110 */
	0x66, /* 01100110 */
	0x66, /* 01100110 */
	0x66, /* 01100110 */
	0x66, /* 01100110 */
	0x66, /* 01100110 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 111 0x6f 'o' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x7c, /* 01111100 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0x7c, /* 01111100 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 112 0x70 'p' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0xdc, /* 11011100 */
	0x66, /* 01100110 */
	0x66, /* 01100110 */
	0x66, /* 01100110 */
	0x66, /* 01100110 */
	0x66, /* 01100110 */
	0x7c, /* 01111100 */
	0x60, /* 01100000 */
	0x60, /* 01100000 */
	0xf0, /* 11110000 */
	0x00, /* 00000000 */

	/* 113 0x71 'q' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x76, /* 01110110 */
	0xcc, /* 11001100 */
	0xcc, /* 11001100 */
	0xcc, /* 11001100 */
	0xcc, /* 11001100 */
	0xcc, /* 11001100 */
	0x7c, /* 01111100 */
	0x0c, /* 00001100 */
	0x0c, /* 00001100 */
	0x1e, /* 00011110 */
	0x00, /* 00000000 */

	/* 114 0x72 'r' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0xdc, /* 11011100 */
	0x76, /* 01110110 */
	0x66, /* 01100110 */
	0x60, /* 01100000 */
	0x60, /* 01100000 */
	0x60, /* 01100000 */
	0xf0, /* 11110000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 115 0x73 's' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x7c, /* 01111100 */
	0xc6, /* 11000110 */
	0x60, /* 01100000 */
	0x38, /* 00111000 */
	0x0c, /* 00001100 */
	0xc6, /* 11000110 */
	0x7c, /* 01111100 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 116 0x74 't' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x10, /* 00010000 */
	0x30, /* 00110000 */
	0x30, /* 00110000 */
	0xfc, /* 11111100 */
	0x30, /* 00110000 */
	0x30, /* 00110000 */
	0x30, /* 00110000 */
	0x30, /* 00110000 */
	0x36, /* 00110110 */
	0x1c, /* 00011100 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 117 0x75 'u' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0xcc, /* 11001100 */
	0xcc, /* 11001100 */
	0xcc, /* 11001100 */
	0xcc, /* 11001100 */
	0xcc, /* 11001100 */
	0xcc, /* 11001100 */
	0x76, /* 01110110 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 118 0x76 'v' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0x6c, /* 01101100 */
	0x38, /* 00111000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 119 0x77 'w' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xd6, /* 11010110 */
	0xd6, /* 11010110 */
	0xd6, /* 11010110 */
	0xfe, /* 11111110 */
	0x6c, /* 01101100 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 120 0x78 'x' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0xc6, /* 11000110 */
	0x6c, /* 01101100 */
	0x38, /* 00111000 */
	0x38, /* 00111000 */
	0x38, /* 00111000 */
	0x6c, /* 01101100 */
	0xc6, /* 11000110 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 121 0x79 'y' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0xc6, /* 11000110 */
	0x7e, /* 01111110 */
	0x06, /* 00000110 */
	0x0c, /* 00001100 */
	0xf8, /* 11111000 */
	0x00, /* 00000000 */

	/* 122 0x7a 'z' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0xfe, /* 11111110 */
	0xcc, /* 11001100 */
	0x18, /* 00011000 */
	0x30, /* 00110000 */
	0x60, /* 01100000 */
	0xc6, /* 11000110 */
	0xfe, /* 11111110 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 123 0x7b '{' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x0e, /* 00001110 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x70, /* 01110000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x0e, /* 00001110 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 124 0x7c '|' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 125 0x7d '}' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x70, /* 01110000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x0e, /* 00001110 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x18, /* 00011000 */
	0x70, /* 01110000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 126 0x7e '~' */
	0x00, /* 00000000 */
	0x76, /* 01110110 */
	0xdc, /* 11011100 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
};

this is text printer:

#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <fcntl.h>

static int				ww, hh, xres = 1920, yres = 1080, xx, yy, buf_fd;
static int				ii, jj, p;
static int				col, txtcolor = 0xffffffff, bgcolor = 0;
static char				*txt;

#include "font.c"
#define font_widht  8
#define font_height  16

// xx -> xpos
// yy -> ypos
// buf -> mapped shm buffer

static inline void printstring(void){
	for(p=0; *txt; p++, txt++) for(ii = 0; ii < font_height; ii++) for(jj = 0; jj<font_widht; jj++){
		if(bmp[(*txt<<4)+ii] & (1 << (font_widht-jj-1))) buf[(ii+yy)*xres+xx+p*font_widht+jj] = txtcol;
		else buf[(ii+yy)*xres+xx+p*font_widht+jj] = bgcol;
	}
}

So you can make your app as tray icon / backround service with very little resource usage.

NB: that codes not AI generated but need some fix or adopt .

NB2: that xgd.h is generated by wayland-scanner from wayland core xdg-shell protocol. you have to generate it.

NB3: that above "bmp" means "bitmap_ascii_8x16_font" from font.c posted above.

Last edited by wert (2025-12-16 09:17:01)

Offline

#84 2025-12-16 12:00:55

fsmithred
Administrator
Registered: 2016-11-25
Posts: 2,787  

Re: ALSA-only purists: Question, new GUI app for the mixer and EQ?

Alsatoggle works. While watching the changes in alsamixer, it occured to me that there needs to be a way to un-mute channels in AlsaTune. If a channel is muted, the slider won't do anything and there's no way to know that without opening alsamixer. (or did I miss something?)

Oh yeah, I did this in i386. BTW, when I try to run the 32-bit program in a 64-bit system, I get an error message that says 'file not found' but it doesn't tell me what file it's looking for. I don't know strace well, so maybe someone can tell me what options to add to get better output. Here's what I got:

$ ./mxeq-i386 
-bash: ./mxeq-i386: cannot execute: required file not found

$ strace ./mxeq-i386 
execve("./mxeq-i386", ["./mxeq-i386"], 0x7fffcd583e70 /* 20 vars */) = -1 ENOENT (No such file or directory)
strace: exec: No such file or directory
+++ exited with 1 +++

$ ./alsatoggle 
-bash: ./alsatoggle: cannot execute: required file not found

$ strace ./alsatoggle 
execve("./alsatoggle", ["./alsatoggle"], 0x7ffc3bdfafc0 /* 20 vars */) = -1 ENOENT (No such file or directory)
strace: exec: No such file or directory
+++ exited with 1 +++

Even stranger, when I try to run it on chimaera (amd64) I get this:

$ ./mxeq-i386 
bash: ./mxeq-i386: No such file or directory

# Oh, really?

$ ls -l mxeq-i386 
-rwxr-xr-x 1 fsmith fsmith 42664 Dec 14 09:49 mxeq-i386

Offline

#85 2025-12-16 15:09:57

greenjeans
Member
Registered: 2017-04-07
Posts: 1,367  
Website

Re: ALSA-only purists: Question, new GUI app for the mixer and EQ?

While watching the changes in alsamixer, it occured to me that there needs to be a way to un-mute channels in AlsaTune. If a channel is muted, the slider won't do anything and there's no way to know that without opening alsamixer. (or did I miss something?)

You did. Right-click any one of the sliders themselves in AlsaTune. wink You know it's muted if the slider turns red/black striped. Check the screenie on page 3 towards the bottom.

I mentioned this in my last post, in the 2.1 version muting/unmuting is enabled via right-click on the sliders themselves.

But I never made it clear in the gui itself that you could do that, my bad, so I added a tooltip just for the sliders that have a  mute function in version 3 that i'm working on, that let's you know you can right-click to mute.

Really appreciate you testing!!! It's hard with just a couple machines and those all being old,low spec, and basically all the same lol. I'm sure there's more tweaks to be done in the future. But after a couple long days working the new version i'm really happy with the progress.

Last edited by greenjeans (2025-12-16 15:25:27)


https://sourceforge.net/projects/vuu-do/ New Vuu-do isos uploaded October 2025!
Vuu-do GNU/Linux, minimal Devuan-based Openbox and Mate systems to build on. Also a max version for OB.
Devuan 5 mate-mini iso, pure Devuan, 100% no-vuu-do. wink Devuan 6 version also available for testing.
Please donate to support Devuan and init freedom! https://devuan.org/os/donate

Offline

#86 2025-12-16 15:22:25

greenjeans
Member
Registered: 2017-04-07
Posts: 1,367  
Website

Re: ALSA-only purists: Question, new GUI app for the mixer and EQ?

Great job. Have you considered adding capture? Could be handy for people using jitsi etc. I couldn't figure out why the mic wasn't working and it turned out capture was not enabled.

Hey buddy! Yeah I did actually, the script now scans for all channels on the backend including capture, got a nice little slider for it even on my ancient laptop.

The latest 2.1 and 3.0 scripts and now also the alsatoggle script, poll the backend every time you start them up and pull everything that exists and use that to populate the gui, so even if you change the physical sound card on a given system, the next time you open AlsaTune (or alsatoggle) all your new stuff will be what's there.

Last edited by greenjeans (2025-12-16 15:23:17)


https://sourceforge.net/projects/vuu-do/ New Vuu-do isos uploaded October 2025!
Vuu-do GNU/Linux, minimal Devuan-based Openbox and Mate systems to build on. Also a max version for OB.
Devuan 5 mate-mini iso, pure Devuan, 100% no-vuu-do. wink Devuan 6 version also available for testing.
Please donate to support Devuan and init freedom! https://devuan.org/os/donate

Offline

#87 2025-12-16 15:27:59

greenjeans
Member
Registered: 2017-04-07
Posts: 1,367  
Website

Re: ALSA-only purists: Question, new GUI app for the mixer and EQ?

too much gtk and too little alsa
that gtk is going to kill you.

You are sooooo right!!! Not just gtk though, css is wearing me out too. Those two things cost me several hours of flailing about the last two days. arrrgh.

#include <wayland-client-protocol.h>

Ummm...no....just...no. Not happening ever.

Last edited by greenjeans (2025-12-16 15:37:32)


https://sourceforge.net/projects/vuu-do/ New Vuu-do isos uploaded October 2025!
Vuu-do GNU/Linux, minimal Devuan-based Openbox and Mate systems to build on. Also a max version for OB.
Devuan 5 mate-mini iso, pure Devuan, 100% no-vuu-do. wink Devuan 6 version also available for testing.
Please donate to support Devuan and init freedom! https://devuan.org/os/donate

Offline

#88 2025-12-16 18:16:34

fanderal
Member
Registered: 2017-01-14
Posts: 109  

Re: ALSA-only purists: Question, new GUI app for the mixer and EQ?

Had alsamixer and alsamixer -D equal in the menu but replaced both with your app... polished, easy to use and presets. Thanks greenjeans!

Offline

#89 2025-12-16 18:48:16

wert
Member
Registered: 2025-10-30
Posts: 11  

Re: ALSA-only purists: Question, new GUI app for the mixer and EQ?

just after posted i figured out i posted a wayland-only code.

Since so you target X11 and not interested wayland;
then ask AI to give you pure X11 boilerplate code with some input event included (with tray icon?) or look at google/github you can find.
then get rid of gtk.

that gtk is a bit too heavy for your toy app, and make you anxiety and your app as cumbersome, bloated and fragile.
just informed/take not. i am saying for the sake of saying btw.

Offline

#90 2025-12-16 19:02:11

greenjeans
Member
Registered: 2017-04-07
Posts: 1,367  
Website

Re: ALSA-only purists: Question, new GUI app for the mixer and EQ?

Had alsamixer and alsamixer -D equal in the menu but replaced both with your app... polished, easy to use and presets. Thanks greenjeans!

Thank you, you just made my day! Yep I did the same thing for a long time, menu entries to open the terminal versions...then it just became another itch I couldn't scratch and I felt I could make something better.


https://sourceforge.net/projects/vuu-do/ New Vuu-do isos uploaded October 2025!
Vuu-do GNU/Linux, minimal Devuan-based Openbox and Mate systems to build on. Also a max version for OB.
Devuan 5 mate-mini iso, pure Devuan, 100% no-vuu-do. wink Devuan 6 version also available for testing.
Please donate to support Devuan and init freedom! https://devuan.org/os/donate

Offline

#91 2025-12-16 19:06:26

greenjeans
Member
Registered: 2017-04-07
Posts: 1,367  
Website

Re: ALSA-only purists: Question, new GUI app for the mixer and EQ?

cumbersome, bloated

@wert, bro, the deb package for the current 2.1 version is 21.8 kb,and that includes the main script, the helper script, a giant readme, the entirety of the source code, a .desktop, an asoundrc file, and a test tone .wav file that's larger than the main script itself.... in what world is that considered "bloated"??


https://sourceforge.net/projects/vuu-do/ New Vuu-do isos uploaded October 2025!
Vuu-do GNU/Linux, minimal Devuan-based Openbox and Mate systems to build on. Also a max version for OB.
Devuan 5 mate-mini iso, pure Devuan, 100% no-vuu-do. wink Devuan 6 version also available for testing.
Please donate to support Devuan and init freedom! https://devuan.org/os/donate

Offline

#92 Yesterday 00:41:06

greenjeans
Member
Registered: 2017-04-07
Posts: 1,367  
Website

Re: ALSA-only purists: Question, new GUI app for the mixer and EQ?

You can click the below thumbnail to get the fullsize version:

7skkk4.jpg


https://sourceforge.net/projects/vuu-do/ New Vuu-do isos uploaded October 2025!
Vuu-do GNU/Linux, minimal Devuan-based Openbox and Mate systems to build on. Also a max version for OB.
Devuan 5 mate-mini iso, pure Devuan, 100% no-vuu-do. wink Devuan 6 version also available for testing.
Please donate to support Devuan and init freedom! https://devuan.org/os/donate

Offline

#93 Yesterday 23:42:15

greenjeans
Member
Registered: 2017-04-07
Posts: 1,367  
Website

Re: ALSA-only purists: Question, new GUI app for the mixer and EQ?

If you want a copy of this, grab it now, i'll be taking both versions down from Sourceforge in the morning.


https://sourceforge.net/projects/vuu-do/ New Vuu-do isos uploaded October 2025!
Vuu-do GNU/Linux, minimal Devuan-based Openbox and Mate systems to build on. Also a max version for OB.
Devuan 5 mate-mini iso, pure Devuan, 100% no-vuu-do. wink Devuan 6 version also available for testing.
Please donate to support Devuan and init freedom! https://devuan.org/os/donate

Offline

Board footer