Designing an FM Drum Synth from Scratch
How it started: a simple repair job on a Roland drum machine. How it ended: a scratch-built FM drum synth module that’s completely analog, and completely cool.
[Moritz Klein]’s journey down the analog drum machine rabbit hole started with a Roland TR-909, a hybrid drum machine from the mid-80s that combined sampled sounds with analog synthesis. The unit [Moritz] picked up was having trouble with the decay on the kick drum, so he spread out the gloriously detailed schematic and got to work. He breadboarded a few sections of the kick drum circuit to aid troubleshooting, but one thing led to another and he was soon in new territory.
The video below is on the longish side, with the first third or so dedicated to recreating the circuits used to create the 909’s iconic sound, slightly modifying some of them to simplify construction. Like the schematic that started the whole thing, this section of the video is jam-packed with goodness, too much to detail here. But a few of the gems that caught our eye were the voltage-controlled amplifier (VCA) circuit that seems to make appearances in multiple places in the circuit, and the dead-simple wave-shaper circuit, which takes some of the harmonics out of the triangle wave oscillator’s output with just a couple of diodes and some resistors.
Once the 909’s kick and toms section had been breadboarded, [Moritz] turned his attention to adding something Roland hadn’t included: frequency modulation. He did this by adding a second, lower-frequency voltage-controlled oscillator (VCO) and using that to modulate the drum section. That resulted in a weird, metallic sound that can be tuned to imitate anything from a steel drum to a bell. He also added a hi-hat and cymbal section by mixing the square wave outputs on the VCOs through a funky XOR gate made from discrete components and a high-pass filter.
There’s a lot of information packed into this video, and by breaking everything down into small, simple blocks, [Moritz] makes it easy to understand analog synths and the circuits behind them.
youtube.com/embed/Xbl1xwFR3eg?…
Inheritance in Python: la chiave per scrivere codice pulito e collaborativo nel Machine Learnin
Molte persone che si avvicinano al machine learning non hanno un forte background in ingegneria del software, e quando devono lavorare su un prodotto reale, il loro codice può risultare disordinato e difficile da gestire. Per questo motivo, raccomando sempre vivamente di imparare a usare le coding best practices, che ti permetteranno di lavorare senza problemi all’interno di un team e di migliorare il livello del progetto su cui stai lavorando. Oggi voglio parlare dell’inheritance di Python e mostrare alcuni semplici esempi di come utilizzarla nel campo del machine learning.
Nello sviluppo software e in altri ambiti dell’informatica, il technical debt (noto anche come design debt o code debt) rappresenta il costo implicito di future rielaborazioni dovuto a una soluzione che privilegia la rapidità rispetto a un design a lungo termine.
Se sei interessato a saperne di più sui design patterns, potresti trovare utili alcuni dei miei articoli precedenti.
Python Inheritance
L’Inheritance non è solo un concetto di Python, ma un concetto generale nell’Object Oriented Programming. Quindi, in questo tutorial, dovremo lavorare con classei e oggetti, che rappresentano un paradigma di sviluppo non molto utilizzato in Python rispetto ad altri linguaggi come Java.
Nell’OOP, possiamo definire una classe generale che rappresenta qualcosa nel mondo, ad esempio una Persona, che definiamo semplicemente con un nome, un cognome e un’età nel seguente modo.
class Person:
def __init__(self, name, surname, age):
self.name = name
self.surname = surname
self.age = age
def __str__(self):
return f"Name: {self.name}, surname: {self.surname}, age: {self.age}"
def grow(self):
self.age +=1
In questa classe, abbiamo definito un semplice costruttore (init). Poi abbiamo definito il method str, che si occuperà di stampare l’oggetto nel modo che desideriamo. Infine, abbiamo il method grow() per rendere la persona di un anno più vecchia.
Ora possiamo instanziare un oggetto e utilizzare questa classe.
person = Person("Marcello", "Politi", 28)
person.grow()
print(person)
# output wiil be
# Name: Marcello, surname: Politi, age: 29
E se volessimo definire un particolare tipo di persona, ad esempio un operaio? Possiamo fare la stessa cosa di prima, ma aggiungiamo un’altra variabile di input per aggiungere il suo stipendio.
class Worker:
def __init__(self, name, surname, age, salary):
self.name = name
self.surname = surname
self.age = age
self.salary = salary
def __str__(self):
return f"Name: {self.name}, surname: {self.surname}, age: {self.age}, salary: {self.salary}"
def grow(self):
self.age +=1
Tutto qui. Ma è questo il modo migliore per implementarlo? Vedete che la maggior parte del codice del lavoratore è uguale a quello della persona, perché un lavoratore è una persona particolare e condivide molte cose in comune con una persona.
Quello che possiamo fare è dire a Python che il lavoratore deve ereditare tutto da Persona, e poi aggiungere manualmente tutte le cose di cui abbiamo bisogno, che una persona generica non ha.
class Worker(Person):
def __init__(self, name, surname, age, salary):
super().__init__(name, surname, age)
self.salary = salary
def __str__(self):
text = super().__str__()
return text + f",salary: {self.salary}"
Nella classe worker, il costruttore richiama il costruttore della classe person sfruttando la parola chiave super() e poi aggiunge anche la variabile salary.
La stessa cosa avviene quando si definisce il metodo str. Utilizziamo lo stesso testo restituito da Person usando la parola chiave super e aggiungiamo il salario quando stampiamo l’oggetto.
Ereditarietà nel Machine Learning
Non ci sono regole su quando usare l’ereditarietà nell’machine learning . Non so a quale progetto stiate lavorando, né come sia il vostro codice. Voglio solo sottolineare il fatto che dovreste adottare un paradigma OOP nel vostro codice. Tuttavia, vediamo alcuni esempi di utilizzo dell’ereditarietà.
Definire un BaseModel
Sviluppiamo una classe di base per il modello di ML, definita da alcune variabili standard. Questa classe avrà un metodo per caricare i dati, uno per addestrare, un altro per valutare e uno per preelaborare i dati. Tuttavia, ogni modello specifico preelaborerà i dati in modo diverso, quindi le sottoclassi che erediteranno il modello di base dovranno riscrivere il metodo di preelaborazione.
Attenzione, il modello BaseMLModel stesso eredita la classe ABC. Questo è un modo per dire a Python che questa classe è una classe astratta e non deve essere usata, ma è solo un modello per costruire sottoclassi.
Lo stesso vale per il metodo preprocess_train_data, che è contrassegnato come @abstactmethod. Ciò significa che le sottoclassi devono reimplementare questo metodo.
Guardate questo video per saperne di più su classi e metodi astratti:
youtube.com/embed/UDmJGvM-OUw?…
from abc import ABC, abstractmethod
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
import numpy as np
class BaseMLModel(ABC):
def __init__(self, test_size=0.2, random_state=42):
self.model = None # This will be set in subclasses
self.test_size = test_size
self.random_state = random_state
self.X_train = None
self.X_test = None
self.y_train = None
self.y_test = None
def load_data(self, X, y):
self.X_train, self.X_test, self.y_train, self.y_test = train_test_split(
X, y, test_size=self.test_size, random_state=self.random_state
)
@abstractmethod
def preprocess_train_data(self):
"""Each model can define custom preprocessing for training data."""
pass
def train(self):
self.X_train, self.y_train = self.preprocess_train_data()
self.model.fit(self.X_train, self.y_train)
def evaluate(self):
predictions = self.model.predict(self.X_test)
return accuracy_score(self.y_test, predictions)
Vediamo ora come ereditare da questa classe. Per prima cosa, possiamo implementare un LogisticRegressionModel. Che avrà il suo algoritmo di preelaborazione.
class LogisticRegressionModel(BaseMLModel):
def __init__(self, **kwargs):
super().__init__()
self.model = LogisticRegression(**kwargs)
def preprocess_train_data(self):
#Standardize features for Logistic Regression
mean = self.X_train.mean(axis=0)
std = self.X_train.std(axis=0)
X_train_scaled = (self.X_train - mean) / std
return X_train_scaled, self.y_train
Poi possiamo definire tutte le sottoclassi che vogliamo. Qui ne definisco una per una Random Forest.
class RandomForestModel(BaseMLModel):
def __init__(self, n_important_features=2, **kwargs):
super().__init__()
self.model = RandomForestClassifier(**kwargs)
self.n_important_features = n_important_features
def preprocess_train_data(self):
#Select top `n_important_features` features based on variance
feature_variances = np.var(self.X_train, axis=0)
top_features_indices = np.argsort(feature_variances)[-self.n_important_features:]
X_train_selected = self.X_train[:, top_features_indices]
return X_train_selected, self.y_train
Ora usiamo tutto nella funzione main.
if __name__ == "__main__":
# Load dataset
data = load_iris()
X, y = data.data, data.target
# Logistic Regression
log_reg_model = LogisticRegressionModel(max_iter=200)
log_reg_model.load_data(X, y)
log_reg_model.train()
print(f"Logistic Regression Accuracy: {log_reg_model.evaluate()}")
# Random Forest
rf_model = RandomForestModel(n_estimators=100, n_important_features=3)
rf_model.load_data(X, y)
rf_model.train()
print(f"Random Forest Accuracy: {rf_model.evaluate()}")
Conclusioni
Uno dei principali vantaggi dell’ereditarietà di Python nei progetti ML è nella progettazione di codici modulari, mantenibili e scalabili. L’ereditarietà aiuta a evitare codice ridondante, scrivendo la logica comune in una classe base, come BaseMLModel, riducendo quindi la duplicazione del codice. L’inheritance rende anche facile incapsulare comportamenti comuni in una classe base, permettendo alle subclasses di definire dettagli specifici.
Il principale vantaggio, a mio avviso, è che una codebase ben organizzata e orientata agli oggetti consente a più sviluppatori all’interno di un team di lavorare indipendentemente su parti separate. Nel nostro esempio, un ingegnere capo potrebbe definire il modello base, e poi ogni sviluppatore potrebbe concentrarsi su un singolo algoritmo e scrivere la subclass.
Prima di immergerti in design patterns complessi, concentrati sull’utilizzo delle best practices nell’OOP. Farlo ti renderà un programmatore migliore rispetto a molti altri nel campo dell’AI!
L'articolo Inheritance in Python: la chiave per scrivere codice pulito e collaborativo nel Machine Learnin proviene da il blog della sicurezza informatica.
#Libano, fuoco sulla Resistenza
Libano, fuoco sulla Resistenza
Nonostante sia ufficialmente in vigore un cessate il fuoco dallo scorso novembre, in Libano stanno proseguendo le operazioni militari ingiustificate da parte di Israele e con il totale appoggio degli Stati Uniti.www.altrenotizie.org
Scuola di Liberalismo 2025: Alberto Mingardi – Luigi Einaudi e il liberalismo per l’uomo comune
@Politica interna, europea e internazionale
Alberto Mingardi è Professore Associato di “Storia delle dottrine politiche” all’Università IULM di Milano e, oltre a ciò, ricopre il ruolo di Presidential Fellow in Political Theory presso la Chapman University e
Politica interna, europea e internazionale reshared this.
USA: Google deve adottare un approccio rispettoso dei diritti dopo che il tribunale ha dichiarato monopolista la sua funzione AdTech
Rispondendo alla sentenza di un tribunale statunitense che ha dichiarato illegale il monopolio pubblicitario online di Google, Agnès Callamard, Segretaria generale di Amnesty International, ha dichiarato:
"Una rottura del monopolio di Google nel rispetto dei diritti umani potrebbe essere un primo passo importante verso un mondo online rispettoso dei diritti umani. Erodendo il dominio di una singola azienda e indebolendo il controllo di Google sui nostri dati, si crea uno spazio che deve essere colmato da attori impegnati a tutelare i diritti umani."
reshared this
Donald Trump riceve Giorgia Meloni alla Casa bianca: “Persona eccezionale”. La premier: “Accordo possibile sui dazi. Aumenteremo la spesa militare fino al 2% del Pil”
@Politica interna, europea e internazionale
Il presidente degli Stati Uniti Donald Trump ha ricevuto oggi la premier Giorgia Meloni alla Casa bianca. “È una persona eccezionale”, ha detto il magnate repubblicano rivolgendosi
Politica interna, europea e internazionale reshared this.
Ministero dell'Istruzione
🏆 #EGMO2025: l’Italia conquista l’oro europeo alla quattordicesima edizione dell’Olimpiade Matematica Femminile.Telegram
Il liberalismo europeo e l’idea d’Europa
@Politica interna, europea e internazionale
Una riflessione a partire da Giovanni Malagodi (1904-1991). Di Renata Gravina (ricercatrice FLE). Un ciclo di seminari in modalità webinar, dal 12 al 30 maggio 2025, per gli istituti e le scuole secondarie superiori. Liceo Mangino Pagani (Salerno), Liceo Vanoni Vimercate (Monza-Brianza), Facoltà di Scienze Politiche,
Politica interna, europea e internazionale reshared this.
Programma Europa digitale: i primi 4 inviti da 140 milioni di euro, focus su cyber e AI
@Informatica (Italy e non Italy 😁)
Nell’ambito del programma Europa digitale, la Commissione europea invita a presentare proposte al fine di promuovere la diffusione delle tecnologie digitali fondamentali. Ecco i dettagli
L'articolo Programma Europa digitale: i primi 4
Informatica (Italy e non Italy 😁) reshared this.
ACN: a marzo 28 attacchi ransomware, in calo gli attacchi DDoS
@Informatica (Italy e non Italy 😁)
Secondo i nostri esperti, la flessione complessiva negli attacchi non deve trarre in inganno perché, nonostante il lodevole sforzo dell'ACN, forse non riusciamo a pieno a tracciare l’incidenza delle minacce sulle PMI del Paese, come succede altrove. Ecco i dettagli del rapporto ACN di marzo 2025
L'articolo ACN: a marzo 28
Informatica (Italy e non Italy 😁) reshared this.
Giovanni Malagodi, il rigore di un liberale
@Politica interna, europea e internazionale
19 maggio 2025, ore 18:00 In diretta sui canali social della Fondazione. Interverranno Giammarco Brenelli Enzo Palumbo Nicola Rossi Modera Andrea Cangini
L'articolo Giovanni Malagodi, il rigore di un liberale proviene da Fondazione Luigi fondazioneluigieinaudi.it/giov…
Politica interna, europea e internazionale reshared this.
Musk punta al Golden dome, lo scudo spaziale Usa
@Notizie dall'Italia e dal mondo
Il progetto Golden Dome, l’ambizioso scudo missilistico promosso da Donald Trump, inizia a prendere forma. Secondo quanto riportato da Reuters, SpaceX, l’azienda aerospaziale di Elon Musk, sarebbe in una posizione di vantaggio per assumere un ruolo primario nello sviluppo della componente spaziale del futuro sistema di
Notizie dall'Italia e dal mondo reshared this.
Così rubano criptovalute usando smartphone Android contraffatti con un finto WhatsApp
@Informatica (Italy e non Italy 😁)
È stata ribattezzata Shibai la nuova campagna malevola in cui i criminali informatici diffondono smartphone Android contraffatti con una versione di WhatsApp modificata con un trojan e progettata per rubare criptovalute. Ecco tutti i
Informatica (Italy e non Italy 😁) reshared this.
Nel Mediterraneo i migranti si respingono con droni ed aerei
L'articolo proviene dal blog di @Davide Tommasin ዳቪድ ed è stato ricondiviso sulla comunità Lemmy @Notizie dall'Italia e dal mondo
L’agenzia europea Frontex ha messo in piedi un sistema che taglia fuori le ONG e permette alla Libia e alla Tunisia di ilpost.it/2025/04/17/mediterra…
reshared this
Leaked: Palantir’s Plan to Help ICE Deport People
Internal Palantir Slack chats and message boards obtained by 404 Media show the contracting giant is helping find the location of people flagged for deportation, that Palantir is now a “more mature partner to ICE,” and how Palantir is addressing empl…Joseph Cox (404 Media)
Gli Usa non abbandoneranno la Nato, ma l’Europa deve fare di più. L’intervento di Cavo Dragone
@Notizie dall'Italia e dal mondo
“Non sappiamo ancora dove il Pendolo della Storia interromperà le sue oscillazioni. Ma è sempre importante ribadire alcuni elementi fattuali per evitare che il proliferare di narrative e strategie di disinformazione ne possano alterare
Notizie dall'Italia e dal mondo reshared this.
Elon Musk travolge il Pentagono: dimissioni di massa nel team tech, rischio sicurezza nazionale
Il Defense Digital Service (DDS), centro dellinnovazione tecnologica del Pentagono, chiude dopo le dimissioni di quasi tutto il personale.Hardware Upgrade
freezonemagazine.com/news/jame…
Quando suo padre morì nel 2021, James McMurtry frugò tra i suoi effetti personali e scoprì uno schizzo a matita di se stesso da bambino. “Sapevo che era mio, ma non avevo capito chi l’avesse disegnato. Ho dovuto chiedere alla mia matrigna, e lei mi ha detto che assomigliava al lavoro di Ken Kesey negli […]
L'articolo
Sudan, inizia il 3° anno di guerra & la più grande crisi umanitaria dimenticata
L'articolo proviene dal blog di @Davide Tommasin ዳቪድ ed è stato ricondiviso sulla comunità Lemmy @Notizie dall'Italia e dal mondo
Sudan, i milioni di persone stanno vivendo e subendo ancora oggi, 27 aprile 2025, la guerra iniziata 2 anni fa, il 15 aprile 2023. Metà del Paese, 25 milioni
reshared this
Tech e Privacy, la I settimana di Aprile newsletter di @Claudia Giulia
Cinque storie che intrecciano IA, giornalismo, medicina, criptovalute e sicurezza: un viaggio nel futuro che è già qui. L’intelligenza artificiale scuote il giornalismo, si insinua nella medicina tra rischi e promesse, si distilla in versioni più agili tra innovazione e guerre di potere, si trasforma in dollari digitali mentre inciampa su Signal rivelando segreti di guerra. Cinque articoli che raccontano un mondo in bilico tra progresso e fragilità.
Informatica (Italy e non Italy 😁) reshared this.
Sudan, incendio nel campo profughi di Tunaydbah distrugge rifugi e attività commerciali
L'articolo proviene dal blog di @Davide Tommasin ዳቪድ ed è stato ricondiviso sulla comunità Lemmy @Notizie dall'Italia e dal mondo
Un incendio è scoppiato nel campo profughi di Tunaydbah, nel Sudan orientale, distruggendo decine di rifugi e piccole attività commerciali
Notizie dall'Italia e dal mondo reshared this.
la vergognosa "sinistra italiana per israele"
Ed ecco a voi Sinistra per Israele (come già noto prezzolata da Netanyahu)
Cronaca. Ieri in un dibattito in Senato si è riunita la cosiddetta “Sinistra per Israele” con Ivan Scalfarotto (Iv), Lucio Malan e Piero Fassino, Sensi e Delrio, Alfredo Bazoli e Walter Verini, Lia Quartapelle e Marianna Madia, Enza Rando e Antonio Nicita, Simona Malpezzi e Sandra Zampa; Marco Carrai, da sempre vicino a Matteo Renzi, e console onorario di Israele e Raffaella Paita, Luciano Nobili, Silvia Fregolent di IV.
L’iniziativa voleva contrastare la mozione contro Israele di Conte del giorno prima che ha visto anche la partecipazione della Shlein.
Fassino, oltre a ricordare ai presenti con orgoglio che viene definito “il sionista di sinistra”, ha ricordato anche “che va bene dire due popoli due Stati, ma che la soluzione ad ora non è praticabile”, dicendo inoltre che molte delle strutture operative di Hamas sono costruite vicino a luoghi come gli ospedali, e dunque risultano “fatali” le vittime civili. Fatali, ha usato questo termine per giustificare le conseguenze genocidiarie delle bombe israeliane. Per la cronaca - leggo da un articolo di oggi sul FQ- “una donna dal pubblico è pure intervenuta per rivendicare il fatto che l’esercito israeliano “avverte sempre dei suoi obiettivi”. Fassino l’ha rassicurata sulle sue posizioni, la sala ha applaudito”.
Cosa dire? Niente di più, se non che nella sala non aleggiava profumo di Chanel, ma di carne umana bruciata.
(Cosimo Minervini)
Poliversity - Università ricerca e giornalismo reshared this.
KENYA. I residenti occupano piantagioni di tè gestite da stranieri dall’epoca coloniale
@Notizie dall'Italia e dal mondo
Diverse comunità chiedono da tempo giustizia per le terre che furono loro sottratte durante la colonizzazione britannica e rivendicano compensazioni per le occupazioni e gli espropri
L'articolo KENYA. I residenti occupano piantagioni di
reshared this
Detenuto palestinese morto in un carcere israeliano. Oggi la Giornata dei Prigionieri Politici
@Notizie dall'Italia e dal mondo
Con la sua morte, il numero dei palestinesi deceduti nelle carceri israeliane sale a 64 dal 7 ottobre 2023. Sono 10mila i prigionieri politici palestinesi
L'articolo Detenuto palestinese morto in un carcere israeliano.
Notizie dall'Italia e dal mondo reshared this.
Gaza: le Maldive vietano l’ingresso ai turisti israeliani
@Notizie dall'Italia e dal mondo
Le Maldive hanno di nuovo deciso di proibire l'ingresso nel paese dei cittadini israeliani in solidarietà con la popolazione palestinese
L'articolo Gaza: le Maldive vietano l’ingresso ai turisti israeliani proviene da Pagine Esteri.
Notizie dall'Italia e dal mondo reshared this.
Il presidente della Repubblica Mattarella dimesso dall’ospedale Santo Spirito dopo l’operazione per l’impianto di un pacemaker
@Politica interna, europea e internazionale
Il presidente della Repubblica Sergio Mattarella è stato dimesso dall’ospedale Santo Spirito di Roma: il Capo dello Stato, che ha lasciato il nosocomio intorno alle 9 di giovedì 17 aprile per fare rientro al Quirinale a bordo di
Politica interna, europea e internazionale reshared this.
L’offensiva di Israele non risparmia l’acqua: Gaza ha sete e muore lentamente
@Notizie dall'Italia e dal mondo
I raid aerei, il blocco degli aiuti e i danni subiti dalla rete idrica hanno fatto crollare le possibilità di approvvigionamento. 1.700 km di condutture distrutti o danneggiati: l’85% è inservibile. Tre litri a testa al giorno
L'articolo L’offensiva di
Notizie dall'Italia e dal mondo reshared this.
freezonemagazine.com/rubriche/…
La finale di basket tra gli Stati Uniti e l’Unione Sovietica ai Giochi Olimpici di Monaco del 1972 è stata un evento memorabile e controverso. Gli Stati Uniti, che avevano dominato il basket olimpico fino a quel momento, si sono trovati di fronte a una squadra sovietica molto competitiva. La partita è stata caratterizzata da […]
L'articolo Emiliano Poddi – Le vittorie
#Ecuador, miracolo statistico
Ecuador, miracolo statistico
Questa domenica il mondo ha assistito a un miracolo senza precedenti nella storia politica mondiale. Il secondo turno delle elezioni presidenziali, che vedeva contrapposti il “candidato-presidente” - così chiamato perché Daniel Noboa, milionario e pr…www.altrenotizie.org
L'UE si è impegnata a migliorare la cooperazione in materia di GDPR e l'ha peggiorata Il regolamento procedurale GDPR dell'UE avrebbe dovuto risolvere procedure troppo complesse e migliorare la cooperazione. Ora, invece, potrebbe compromettere l'applicazione delle norme mickey17 April 2025
#introduction
like this
da Radio Popolare:
Gli “indesiderabili” secondo Trump. Come l’amministrazione Usa identifica e deporta le persone migranti
11 APRILE 2025 | DI MARCO SCHIAFFINO
radiopopolare.it/gli-indesider…
#radiopopolare #controlloglobale #deportazioni #privacy #tecnologiedicontrollo #migranti #USA
reshared this
Golfo-Israele, l'asse del genocidio
Golfo-Israele, l’asse del genocidio
Dalle armi al commercio, passando per logistica e spionaggio, le monarchie del Golfo Persico stanno silenziosamente finanziando la guerra dello stato ebraico contro Gaza.www.altrenotizie.org
#Trump contro #Harvard, democrazia in gioco
Harvard, democrazia in gioco
La prestigiosa università privata di Harvard è stata questa settimana la prima istituzione accademica americana a rifiutarsi di cedere alle “richieste” dell’amministrazione Trump di sottoporre di fatto al controllo governativo le attività didattiche …www.altrenotizie.org
Signor Amministratore ⁂
in reply to giorovv • •Benvenuto Giorovv e benvenuto tra noi.
Friendica non è facilissimo da usare, ma ci vuole un po' di pazienza per sfruttarlo al meglio. A questo proposito, approfitto per segnalarti questo post riepilogativo:
informapirata.it/2025/02/02/i-…
Lorenzo Vujade likes this.
Lorenzo Vujade
in reply to giorovv • •