VBO multipli con OpenGL ES 2.0

Emscripten e WebAssembly

Di recente ho iniziato un nuovo progettino, per il quale sto usando SDL e OpenGL ES 2.0.

Durante il lockdown, avevo imparato a fare qualcosa di base con OpenGL 3.3, e avevo usato sempre SDL e un po’ Bullet, ma poi avevo lasciato stare il tutto. Adesso ho ricominciato, ma con OpenGL ES 2.0 perché offre una possibilità molto interessante: con Emscripten, si può compilare il progetto per WebAssembly, e GLES 2.0 viene trasformato direttamente in WebGL.

Pur non essendo più molto appassionato di sviluppo web, questa cosa mi attrae particolarmente. Innanzitutto, pubblicando sul web si possono raggiungere più persone, anche per il solo fatto che aspettare qualche secondo che si carichi una pagina è molto meno impegnativo che far scaricare uno zip, decompattarlo, e far avviare il programma. E non parliamo nemmeno degli installanti…

Il codice può essere sviluppato praticamente in qualsiasi linguaggio (C, C++, o qualcosa che abbia un interprete/una VM scritta in questi linguaggi), ma poi si può interfacciare al JavaScript che gira nel browser. Questo vuol dire che potrei fare le parti di rendering 3D in C++, ma le parti di UI in HTML, CSS e JavaScript. Le ultime volte che ho provato a fare qualcosa in JS mi sono stufato subito, però, per fare UI, lo stack web ha pochi eguali. … [Leggi il resto]

Python custom exceptions in C(++) extensions

Python is a nice scripting language, but it has the fame of being difficult to embed and interact with existing projects.

Until now, I have been able to embed it in the software I work on with pybind11 and Binder (half of my MS degree thesis is about that), I had some problems, but I was able to solve most of them. But recently I have experienced a problem that is quite uncommon on the Internet: declaring a new exception in a native (C++/C module) with some custom methods/properties.

The existing proposal

I quickly looked on the Internet for the problem. The Python C API makes creating an exception type possible with PyObject *PyErr_NewException(const char *name, PyObject *bases, PyObject *dict): the first parameter is the name of the exception, in the modulename.ExceptionName format, the second parameter is the base or bases of the new exception (can be a PyType, or a tuple of PyTypes), and a dictionary of custom members and methods for the new type.

However both the second and third parameter can be left to NULL: in this case the new type will inherit from PyExc_Exception and will not have customizations. This is the majority of the cases, and by a search on the CPython code I could not find any reference that could use as an example on how to use the dict parameter. … [Leggi il resto]

Guitar Biro

Tempo fa, avevo annunciato di voler creare un auto tabulatore per la chitarra.

È passato un po’ di tempo, però alla fine qualcosa ho fatto, e ne è uscito un bel proof of concept.

Come algoritmo alla fine ho scelto l’auto correlazione, quindi un’analisi nel dominio del tempo. Avevo fatto delle prove con la trasformata di Fourier, ma ottenevo dei risultati effettivamente peggiori, come riportato anche su degli studi su IEEEXplore e su vari siti. Inoltre per Fourier in C esistono delle librerie ma sono più difficili da usare dell’autocorrelazione.

L’autocorrelazione permetterebbe anche di determinare il punto su cui la nota è stata suonata, cosa che con l’assunzione che si suoni più o meno sopra i pickup, permetterebbe anche di trovare in quale corda è stata suonata la nota. Però questa è un’assunzione forte e spesso c’erano risultati non proprio corretti.

Quindi ho preferito mostrare tutte le posizioni in cui una nota può essere suonata e non consente di salvare i risultati ottenuti.

Mi spiace dover rilasciare sotto la GNU GPL v3, rilascerei volentieri sotto una licenza più leggera, come la MIT, però ho usato RSVG (da GNOME) per mostrare l’immagine del manico della chitarra. Se qualcuno riuscisse a togliere questa dipendenza potrebbe considerare tranquillamente il codice rilasciato sotto licenza MIT, e magari potrebbe farmi un pull su GitHub 😊 .

Il software è stato scritto senza prediligere una piattaforma, però per il momento l’ho testato solo su Debian.

Inoltre mancano numerose funzionalità, una su tutte la possibilità di scegliere l’accordatura dello strumento, sebbene io l’abbia realizzata in modo parametrico.

Detto tutto ciò, su GitHub potete trovare tutto il codice sorgente.

Invece in esclusiva per il sito, pubblico la relazione sul progeto per l’esame.

Nuovo progetto: auto tablatore per chitarra

Ultimamente il tempo che posso dedicare a sperimentare e in generale nerdare è abbastanza poco, però potrò, come si suol dire, unire l’utile al dilettevole.

Infatti dovrò realizzare un progetto in C per un corso all’Università, quindi ho deciso di realizzare un’idea che mi era venuta abbastanza tempo fa, ma che avevo sempre lasciato stare: scrivere un software in grado di riconoscere che nota è stata suonata a partire dall’audio della chitarra, in realtime, quindi visualizzarlo e magari poter esportare la tablatura.

Ancora non so quante feature riuscirò/avrò tempo per implementare. Probabilmente sarà in grado di riconoscere solo note singole, in quanto gli algoritmi che permettono di riconoscere toni di una frequenza singola (comprese le armoniche, eventualmente) sono diversi da quelli che permettono il riconoscimento di accordi.

Come moduli comprenderà sicuramente un’interfaccia con la scheda audio, probabilmente basato su Libsoundio, oppure, in alternativa, su PortAudio.

L’altro modulo sarà il riconoscimento della frequenza fondamentale. Ci sono diverse soluzioni, perlopiù basate sulla trasformata di Fourier e sull’autocorrelazione. Sul secondo metodo ho già trovato un’implementazione abbastanza semplice, pulita e comprensibile. … [Leggi il resto]

Libavformat + Libavcodec + OpenAL = AVStream

Oggi volevo parlarvi del mio ultimo programma, AVStream, uno streamer di audio che si basa su Libavformat, Libavcodec e OpenAL.

In pratica per un mio altro programma mi serviva la possibilità di poter far sentire dell’audio 3D. Così ho scoperto che OpenAL è la cosa migliore, perché, nata nel 1999, è si prefigge di essere l’OpenGL dell’audio, ovvero una specifica di API da usare per fare lo stream audio.

Il progetto è stato portato avanti da Creative, che poi però l’ha abbandonato. Attualmente solo Apple la include (anche se in una directory sbagliata) ufficialmente; una buona implementazione per gli altri sistemi, rilasciata sotto LGPL, è OpenAL Soft. In pratica come API non cambia niente, cioè sono tutte le funzioni della specifica OpenAL 1.1, solo che è tenuta aggiornata e perciò funziona con molte configurazioni diverse. Io l’ho provata su Linux con PulseAudio, OSS e ALSA.

Inizialmente volevo usare il codec libero Vorbis, però il tutorial che avevo trovato voleva far caricare in RAM tutto l’audio decompresso, quindi riprodurlo. Era una cosa inaccettabile però per i miei scopi: potrei aver bisogno di molti suoni, non potrei tenerli tutti in RAM, neanche se pesassero poco. … [Leggi il resto]