Category Archives: Music

ARDUINO CONCERTINA – POC 2

See also

Potmeter needs some tweaking

New code

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#include <Keypad.h>
int buzzer=9;
int lastsensorread;
int prevkey;
int push=450;
int pull=550;
const byte ROWS = 8; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'#','0','*'},
{'A','B','C'},
{'D','E','F'},
{'G','H','I'},
{'J','K','L'}
};
byte rowPins[ROWS] = {5, 6, 7, 8, 10, 11, 12, 13}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {2, 3, 4 }; //connect to the column pinouts of the keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
void setup(){
Serial.begin(9600);
pinMode(buzzer,OUTPUT);
}
void loop(){
char key = keypad.getKey();
// if (key == NO_KEY){
// key = prevkey;
// }
// if (key != NO_KEY){
int freq = 0;
int sensorValue = analogRead(A0);
//sensorValue = ((sensorValue+4)/5)*5;
if (sensorValue > push && sensorValue < pull ) {
// Serial.println("No pull or push");
noTone(buzzer);
}
else if (key == NO_KEY){
switch (keypad.getState()){
case RELEASED:
noTone(buzzer);
}
}
else
{
if (key == '1' && sensorValue < push ) { tone(buzzer,415); }; // G push
if (key == '1' && sensorValue > pull ) { tone(buzzer,466); }; // A pull
if (key == '2' && sensorValue < push ) { tone(buzzer,392); }; // G push
if (key == '2' && sensorValue > pull ) { tone(buzzer,440); }; // A pull
if (key == '3' && sensorValue < push ) { tone(buzzer,587); }; // G push
if (key == '3' && sensorValue > pull ) { tone(buzzer,659); }; // A pull
if (key == '4' && sensorValue < push ) { tone(buzzer,440); };
if (key == '4' && sensorValue > pull ) { tone(buzzer,392); };
if (key == '5' && sensorValue < push ) { tone(buzzer,329); };
if (key == '5' && sensorValue > pull ) { tone(buzzer,349); };
if (key == '6' && sensorValue < push ) { tone(buzzer,493); };
if (key == '6' && sensorValue > pull ) { tone(buzzer,523); };
//8l f/e
if (key == '8' && sensorValue < push ) { tone(buzzer,261); };
if (key == '8' && sensorValue > pull ) { tone(buzzer,587); };
if (key == 'A' && sensorValue < push ) { tone(buzzer,783); };
if (key == 'A' && sensorValue > pull ) { tone(buzzer,739); };
if (key == 'B' && sensorValue < push ) { tone(buzzer,523); };
if (key == 'B' && sensorValue > pull ) { tone(buzzer,493); };
if (key == 'D' && sensorValue < push ) { tone(buzzer,987); };
if (key == 'D' && sensorValue > pull ) { tone(buzzer,880); };
if (key == 'E' && sensorValue < push ) { tone(buzzer,659); };
if (key == 'E' && sensorValue > pull ) { tone(buzzer,587); };
if (key == 'H' && sensorValue < push ) { tone(buzzer,783); };
if (key == 'H' && sensorValue > pull ) { tone(buzzer,698); };
//tone(buzzer,freq);
}
Serial.println(sensorValue);
Serial.println(key);
Serial.println(freq);
// lastsensorread = sensorValue;
prevkey = key;
// }
}
#include <Keypad.h> int buzzer=9; int lastsensorread; int prevkey; int push=450; int pull=550; const byte ROWS = 8; //four rows const byte COLS = 3; //three columns char keys[ROWS][COLS] = { {'1','2','3'}, {'4','5','6'}, {'7','8','9'}, {'#','0','*'}, {'A','B','C'}, {'D','E','F'}, {'G','H','I'}, {'J','K','L'} }; byte rowPins[ROWS] = {5, 6, 7, 8, 10, 11, 12, 13}; //connect to the row pinouts of the keypad byte colPins[COLS] = {2, 3, 4 }; //connect to the column pinouts of the keypad Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); void setup(){ Serial.begin(9600); pinMode(buzzer,OUTPUT); } void loop(){ char key = keypad.getKey(); // if (key == NO_KEY){ // key = prevkey; // } // if (key != NO_KEY){ int freq = 0; int sensorValue = analogRead(A0); //sensorValue = ((sensorValue+4)/5)*5; if (sensorValue > push && sensorValue < pull ) { // Serial.println("No pull or push"); noTone(buzzer); } else if (key == NO_KEY){ switch (keypad.getState()){ case RELEASED: noTone(buzzer); } } else { if (key == '1' && sensorValue < push ) { tone(buzzer,415); }; // G push if (key == '1' && sensorValue > pull ) { tone(buzzer,466); }; // A pull if (key == '2' && sensorValue < push ) { tone(buzzer,392); }; // G push if (key == '2' && sensorValue > pull ) { tone(buzzer,440); }; // A pull if (key == '3' && sensorValue < push ) { tone(buzzer,587); }; // G push if (key == '3' && sensorValue > pull ) { tone(buzzer,659); }; // A pull if (key == '4' && sensorValue < push ) { tone(buzzer,440); }; if (key == '4' && sensorValue > pull ) { tone(buzzer,392); }; if (key == '5' && sensorValue < push ) { tone(buzzer,329); }; if (key == '5' && sensorValue > pull ) { tone(buzzer,349); }; if (key == '6' && sensorValue < push ) { tone(buzzer,493); }; if (key == '6' && sensorValue > pull ) { tone(buzzer,523); }; //8l f/e if (key == '8' && sensorValue < push ) { tone(buzzer,261); }; if (key == '8' && sensorValue > pull ) { tone(buzzer,587); }; if (key == 'A' && sensorValue < push ) { tone(buzzer,783); }; if (key == 'A' && sensorValue > pull ) { tone(buzzer,739); }; if (key == 'B' && sensorValue < push ) { tone(buzzer,523); }; if (key == 'B' && sensorValue > pull ) { tone(buzzer,493); }; if (key == 'D' && sensorValue < push ) { tone(buzzer,987); }; if (key == 'D' && sensorValue > pull ) { tone(buzzer,880); }; if (key == 'E' && sensorValue < push ) { tone(buzzer,659); }; if (key == 'E' && sensorValue > pull ) { tone(buzzer,587); }; if (key == 'H' && sensorValue < push ) { tone(buzzer,783); }; if (key == 'H' && sensorValue > pull ) { tone(buzzer,698); }; //tone(buzzer,freq); } Serial.println(sensorValue); Serial.println(key); Serial.println(freq); // lastsensorread = sensorValue; prevkey = key; // } }
#include <Keypad.h>
int buzzer=9;
int lastsensorread;
int prevkey;
int push=450;
int pull=550;

const byte ROWS = 8; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'#','0','*'},
  {'A','B','C'},
  {'D','E','F'},
  {'G','H','I'},
  {'J','K','L'}
};
byte rowPins[ROWS] = {5, 6, 7, 8, 10, 11, 12, 13}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {2, 3, 4 }; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){
  Serial.begin(9600);
  pinMode(buzzer,OUTPUT);

}
  
void loop(){
  char key = keypad.getKey();
//  if (key == NO_KEY){
 //   key = prevkey;
   //   }
      
  
 // if (key != NO_KEY){
    int freq = 0;
    int sensorValue = analogRead(A0);
    //sensorValue = ((sensorValue+4)/5)*5;



    
    if (sensorValue > push && sensorValue < pull   ) {
    // Serial.println("No pull or push");
    noTone(buzzer);
    }
    else if (key == NO_KEY){
      switch (keypad.getState()){
            case RELEASED:
             noTone(buzzer);
      }
    }
    else 
    {
    if (key == '1' && sensorValue < push ) { tone(buzzer,415); }; // G push
    if (key == '1' && sensorValue > pull ) { tone(buzzer,466); }; // A pull
    if (key == '2' && sensorValue < push ) { tone(buzzer,392); }; // G push
    if (key == '2' && sensorValue > pull ) { tone(buzzer,440); }; // A pull
    if (key == '3' && sensorValue < push ) { tone(buzzer,587); }; // G push
    if (key == '3' && sensorValue > pull ) { tone(buzzer,659); }; // A pull
    
    if (key == '4' && sensorValue < push ) { tone(buzzer,440); };
    if (key == '4' && sensorValue > pull ) { tone(buzzer,392); };
    if (key == '5' && sensorValue < push ) { tone(buzzer,329); };
    if (key == '5' && sensorValue > pull ) { tone(buzzer,349); };
    if (key == '6' && sensorValue < push ) { tone(buzzer,493); };
    if (key == '6' && sensorValue > pull ) { tone(buzzer,523); };
      //8l f/e
    if (key == '8' && sensorValue < push ) { tone(buzzer,261); };
    if (key == '8' && sensorValue > pull ) { tone(buzzer,587); };

    if (key == 'A' && sensorValue < push ) { tone(buzzer,783); };
    if (key == 'A' && sensorValue > pull ) { tone(buzzer,739); };
    if (key == 'B' && sensorValue < push ) { tone(buzzer,523); };
    if (key == 'B' && sensorValue > pull ) { tone(buzzer,493); };

    if (key == 'D' && sensorValue < push ) { tone(buzzer,987); };
    if (key == 'D' && sensorValue > pull ) { tone(buzzer,880); };
    if (key == 'E' && sensorValue < push ) { tone(buzzer,659); };
    if (key == 'E' && sensorValue > pull ) { tone(buzzer,587); };

    if (key == 'H' && sensorValue < push ) { tone(buzzer,783); };
    if (key == 'H' && sensorValue > pull ) { tone(buzzer,698); };
    //tone(buzzer,freq);
    }
    Serial.println(sensorValue);
    Serial.println(key);
    Serial.println(freq);
 //   lastsensorread = sensorValue;
    prevkey = key;
      
 // }
}

Wanted to make a mini Sid Player, and failed

UPDATE: https://www.henriaanstoot.nl/2024/05/30/c64-mobile-sid-player-using-raspberry/

I’ve got an old Speaker Phat, and a Raspberry Zero

An audio add-on board for Raspberry ( same size as the Zero )
Connections

My initial idea was to have the “High Voltage Sid Collection” (Downloaded the 55000 pack)
On a mini device, battery operated and with a little keypad.

On the keypad i can select the Sidtune to play, or pressing
A and a number the Sids from a certain artist.

The display gives you information about the tune being played.
( The display has an I2C hat to convert 8bits to I2C )

See pinout phat above.
I’ve got three choices for I2C connection (green/blue to the Phat)

  • Direct connect and use different addresses
  • Use a I2C hub and different addresses
  • Define a secondary I2C on the raspberry

So I made the first test setup …

Underrun occurred .. So back to the drawingboard.
I probably need a better Audio Hat.
First to try .. Zero fast enough for sidplay2?
Maybe audio over hdmi works??

A Harp in the house again. JOY!

First I have to replace 4 strings.

Apparently F4 B4 F3 and D1

I’ve replaced strings before so that’s no problem. Starting all over again.

Our Folk Band Harp player wants to due some duets. So lets get playin’

http://pinnerstringquartet.com/

UPDATE: 20230119
Replaced the 4 strings yesterday, not fully tuned yet.
Gave the string some time to rest.
Looking at the harp this morning. G4 was broken .. d*mn

UPDATE: 20230126
Replaced also the G4, all done.
Tuning this kind of Harp. (Salvi Lever harp)
You have to put all levers down, and tune them from lowest note to highest.
The A B and E strings have to be tuned flat!
So by using the levers you can play in all kinds of different keys.

StringCDEFGAB
TunerCDD#/EbFGG#/AbA#/Bb

Very nice overview of the keys (harp-school.com)

Computer cards i’ve owned / used

Only cards worth mentioning.
I will add more information to this page

Graphics:

Hercules ???? – Did a lot of machinecode on this one. (Which?)
CGA/EGA Card ??? – Machinecode hacking
VGA .. first card also machine code hacking
Matrox
Some cards i knew a lot about, i did some manipulations using assembly that were very interesting, but only worked on that specific brand.

16 Bit ISA VGA card that is compatibe with 8bits slots for my XT.
see https://www.henriaanstoot.nl/2022/11/16/hercules-to-vga/

Sound:

I’ve bought a lot of Crystal Soundcards, there were breeze to install and use under linux, way back when it was hard to get supported hardware.



Firewire card (for Studio equipment):

Our old trusty mixer

Videocapture:

Video blaster – Which i used to record video (Like ‘Sepp en fash vervelen zich nooit’) and my DIY controllable webcam.

Video Blaster


Pinnacle PCTV- Brooktree Bt848

I used the firewire connection to get the footage of my Canon Video Camera

Firewire cable
Not my card but comparable


Hauppauge WinTV PVR 350


Basetech BR116 (Current) – RCA

Not really a “card”


Camlink 4K (Current) – hdmi

Other:

Stallion RS-232 card for connecting multiple serial terminals.
(Icecrew chat server on Lan Parties)

insmod istallion board0=brumby,0x350,0xcc000
/usr/lib/stallion/stlload -i 2681.sys


Wyse Multiport Serial Card

Ramvantage 16bits ISA memory expansion

PC Hardware diagnostics card

Could not find any information on this card

Catweasel

The Catweasel is a family of enhanced floppy-disk controllers from German company Individual Computers. These controllers are designed to allow more recent computers, such as PCs, to access a wide variety of older or non-native disk formats using standard floppy drives.

You could connect joysticks and there is a socket for a SID chip on the card.

Arduino Concertina – POC

As mentioned in post below

Update: https://www.henriaanstoot.nl/2023/01/17/arduino-concertina-poc-2/

So i’ve bought some needed parts and made a proof of concept.

First to try : 3×4 matrix .. later the full 30 keys version
First part Bella Ciao

Arduino Code
Needs https://playground.arduino.cc/Code/Keypad/ keypad library
Not all buttons are configured with frequencies … yet

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#include <Keypad.h>
int buzzer=9;
int lastsensorread;
int prevkey;
int push=400;
int pull=600;
const byte ROWS = 8; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'#','0','*'},
{'A','B','C'},
{'D','E','F'},
{'G','H','I'},
{'J','K','L'}
};
byte rowPins[ROWS] = {5, 6, 7, 8, 10, 11, 12, 13}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {2, 3, 4 }; //connect to the column pinouts of the keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
void setup(){
Serial.begin(9600);
pinMode(buzzer,OUTPUT);
}
void loop(){
char key = keypad.getKey();
// if (key == NO_KEY){
// key = prevkey;
// }
// if (key != NO_KEY){
int freq = 0;
int sensorValue = analogRead(A0);
//sensorValue = ((sensorValue+4)/5)*5;
if (sensorValue > push && sensorValue < pull ) {
// Serial.println("No pull or push");
noTone(buzzer);
}
else
{
if (key == '1' && sensorValue < push ) { tone(buzzer,415); }; // G push
if (key == '1' && sensorValue > pull ) { tone(buzzer,466); }; // A pull
if (key == '2' && sensorValue < push ) { tone(buzzer,392); }; // G push
if (key == '2' && sensorValue > pull ) { tone(buzzer,440); }; // A pull
if (key == '3' && sensorValue < push ) { tone(buzzer,587); }; // G push
if (key == '3' && sensorValue > pull ) { tone(buzzer,659); }; // A pull
if (key == '4' && sensorValue < push ) { tone(buzzer,440); };
if (key == '4' && sensorValue > pull ) { tone(buzzer,392); };
if (key == '5' && sensorValue < push ) { tone(buzzer,329); };
if (key == '5' && sensorValue > pull ) { tone(buzzer,349); };
if (key == '6' && sensorValue < push ) { tone(buzzer,493); };
if (key == '6' && sensorValue > pull ) { tone(buzzer,523); };
//8l f/e
if (key == '8' && sensorValue < push ) { tone(buzzer,261); };
if (key == '8' && sensorValue > pull ) { tone(buzzer,587); };
if (key == 'A' && sensorValue < push ) { tone(buzzer,783); };
if (key == 'A' && sensorValue > pull ) { tone(buzzer,739); };
if (key == 'B' && sensorValue < push ) { tone(buzzer,523); };
if (key == 'B' && sensorValue > pull ) { tone(buzzer,493); };
if (key == 'D' && sensorValue < push ) { tone(buzzer,987); };
if (key == 'D' && sensorValue > pull ) { tone(buzzer,880); };
if (key == 'E' && sensorValue < push ) { tone(buzzer,659); };
if (key == 'E' && sensorValue > pull ) { tone(buzzer,587); };
//tone(buzzer,freq);
}
Serial.println(sensorValue);
Serial.println(key);
Serial.println(freq);
// lastsensorread = sensorValue;
prevkey = key;
// }
}
#include <Keypad.h> int buzzer=9; int lastsensorread; int prevkey; int push=400; int pull=600; const byte ROWS = 8; //four rows const byte COLS = 3; //three columns char keys[ROWS][COLS] = { {'1','2','3'}, {'4','5','6'}, {'7','8','9'}, {'#','0','*'}, {'A','B','C'}, {'D','E','F'}, {'G','H','I'}, {'J','K','L'} }; byte rowPins[ROWS] = {5, 6, 7, 8, 10, 11, 12, 13}; //connect to the row pinouts of the keypad byte colPins[COLS] = {2, 3, 4 }; //connect to the column pinouts of the keypad Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); void setup(){ Serial.begin(9600); pinMode(buzzer,OUTPUT); } void loop(){ char key = keypad.getKey(); // if (key == NO_KEY){ // key = prevkey; // } // if (key != NO_KEY){ int freq = 0; int sensorValue = analogRead(A0); //sensorValue = ((sensorValue+4)/5)*5; if (sensorValue > push && sensorValue < pull ) { // Serial.println("No pull or push"); noTone(buzzer); } else { if (key == '1' && sensorValue < push ) { tone(buzzer,415); }; // G push if (key == '1' && sensorValue > pull ) { tone(buzzer,466); }; // A pull if (key == '2' && sensorValue < push ) { tone(buzzer,392); }; // G push if (key == '2' && sensorValue > pull ) { tone(buzzer,440); }; // A pull if (key == '3' && sensorValue < push ) { tone(buzzer,587); }; // G push if (key == '3' && sensorValue > pull ) { tone(buzzer,659); }; // A pull if (key == '4' && sensorValue < push ) { tone(buzzer,440); }; if (key == '4' && sensorValue > pull ) { tone(buzzer,392); }; if (key == '5' && sensorValue < push ) { tone(buzzer,329); }; if (key == '5' && sensorValue > pull ) { tone(buzzer,349); }; if (key == '6' && sensorValue < push ) { tone(buzzer,493); }; if (key == '6' && sensorValue > pull ) { tone(buzzer,523); }; //8l f/e if (key == '8' && sensorValue < push ) { tone(buzzer,261); }; if (key == '8' && sensorValue > pull ) { tone(buzzer,587); }; if (key == 'A' && sensorValue < push ) { tone(buzzer,783); }; if (key == 'A' && sensorValue > pull ) { tone(buzzer,739); }; if (key == 'B' && sensorValue < push ) { tone(buzzer,523); }; if (key == 'B' && sensorValue > pull ) { tone(buzzer,493); }; if (key == 'D' && sensorValue < push ) { tone(buzzer,987); }; if (key == 'D' && sensorValue > pull ) { tone(buzzer,880); }; if (key == 'E' && sensorValue < push ) { tone(buzzer,659); }; if (key == 'E' && sensorValue > pull ) { tone(buzzer,587); }; //tone(buzzer,freq); } Serial.println(sensorValue); Serial.println(key); Serial.println(freq); // lastsensorread = sensorValue; prevkey = key; // } }
#include <Keypad.h>
int buzzer=9;
int lastsensorread;
int prevkey;
int push=400;
int pull=600;

const byte ROWS = 8; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'#','0','*'},
  {'A','B','C'},
  {'D','E','F'},
  {'G','H','I'},
  {'J','K','L'}
};
byte rowPins[ROWS] = {5, 6, 7, 8, 10, 11, 12, 13}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {2, 3, 4 }; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){
  Serial.begin(9600);
  pinMode(buzzer,OUTPUT);

}
  
void loop(){
  char key = keypad.getKey();
//  if (key == NO_KEY){
 //   key = prevkey;
   //   }
      
  
 // if (key != NO_KEY){
    int freq = 0;
    int sensorValue = analogRead(A0);
    //sensorValue = ((sensorValue+4)/5)*5;



    
    if (sensorValue > push && sensorValue < pull   ) {
    // Serial.println("No pull or push");
    noTone(buzzer);
    }
    else 
    {
    if (key == '1' && sensorValue < push ) { tone(buzzer,415); }; // G push
    if (key == '1' && sensorValue > pull ) { tone(buzzer,466); }; // A pull
    if (key == '2' && sensorValue < push ) { tone(buzzer,392); }; // G push
    if (key == '2' && sensorValue > pull ) { tone(buzzer,440); }; // A pull
    if (key == '3' && sensorValue < push ) { tone(buzzer,587); }; // G push
    if (key == '3' && sensorValue > pull ) { tone(buzzer,659); }; // A pull
    
    if (key == '4' && sensorValue < push ) { tone(buzzer,440); };
    if (key == '4' && sensorValue > pull ) { tone(buzzer,392); };
    if (key == '5' && sensorValue < push ) { tone(buzzer,329); };
    if (key == '5' && sensorValue > pull ) { tone(buzzer,349); };
    if (key == '6' && sensorValue < push ) { tone(buzzer,493); };
    if (key == '6' && sensorValue > pull ) { tone(buzzer,523); };
      //8l f/e
    if (key == '8' && sensorValue < push ) { tone(buzzer,261); };
    if (key == '8' && sensorValue > pull ) { tone(buzzer,587); };

    if (key == 'A' && sensorValue < push ) { tone(buzzer,783); };
    if (key == 'A' && sensorValue > pull ) { tone(buzzer,739); };
    if (key == 'B' && sensorValue < push ) { tone(buzzer,523); };
    if (key == 'B' && sensorValue > pull ) { tone(buzzer,493); };

    if (key == 'D' && sensorValue < push ) { tone(buzzer,987); };
    if (key == 'D' && sensorValue > pull ) { tone(buzzer,880); };
    if (key == 'E' && sensorValue < push ) { tone(buzzer,659); };
    if (key == 'E' && sensorValue > pull ) { tone(buzzer,587); };
    
    //tone(buzzer,freq);
    }
    Serial.println(sensorValue);
    Serial.println(key);
    Serial.println(freq);
 //   lastsensorread = sensorValue;
    prevkey = key;
      
 // }
}

Lets make a test holder from pieces of wood, when i’ve got the sizes correct, i’ll 3D print something

ABC to Animation for Concertina

I want to take simple ABC Music notation tunes and convert these to animations which shows you which keys to press and to push or pull.

This is a work in progress.
Script is using ImageMagick and ffmpeg

I started this in bash, and i should rewrite this in python.

Bash script which generates the images

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#!/bin/bash
convert -size 800x600 canvas:white white.png
x=55
y=55
draw=""
for xx in $(seq 1 6); do
for yy in $(seq 1 5); do
startx=$(( $x * $xx + 100))
starty=$(( $y * $yy + 200))
if [ $xx -gt 3 ] ; then startx=$(($startx + 200)) ;fi
draw="$draw -draw \"circle $startx,$starty $(( $startx - 10)),$(( $starty - 10 ))\""
done
done
echo convert $draw white.png draw_circle.png | bash
for xx in $(seq 1 6); do
for yy in $(seq 1 5); do
startx=$(( $x * $xx + 100))
starty=$(( $y * $yy + 200))
if [ $xx -gt 3 ] ; then startx=$(($startx + 200)) ;fi
convert -fill white -stroke black $draw -draw "circle $startx,$starty $(( $startx - 10)),$(( $starty - 10 ))" draw_circle.png $xx-$yy.png
convert -draw "rectangle 300,50 500,100" $xx-$yy.png push-$xx-$yy.png
convert -draw "rectangle 150,50 650,100" $xx-$yy.png pull-$xx-$yy.png
done
done
#!/bin/bash convert -size 800x600 canvas:white white.png x=55 y=55 draw="" for xx in $(seq 1 6); do for yy in $(seq 1 5); do startx=$(( $x * $xx + 100)) starty=$(( $y * $yy + 200)) if [ $xx -gt 3 ] ; then startx=$(($startx + 200)) ;fi draw="$draw -draw \"circle $startx,$starty $(( $startx - 10)),$(( $starty - 10 ))\"" done done echo convert $draw white.png draw_circle.png | bash for xx in $(seq 1 6); do for yy in $(seq 1 5); do startx=$(( $x * $xx + 100)) starty=$(( $y * $yy + 200)) if [ $xx -gt 3 ] ; then startx=$(($startx + 200)) ;fi convert -fill white -stroke black $draw -draw "circle $startx,$starty $(( $startx - 10)),$(( $starty - 10 ))" draw_circle.png $xx-$yy.png convert -draw "rectangle 300,50 500,100" $xx-$yy.png push-$xx-$yy.png convert -draw "rectangle 150,50 650,100" $xx-$yy.png pull-$xx-$yy.png done done
#!/bin/bash
convert -size 800x600 canvas:white white.png
x=55
y=55
draw=""
for xx in $(seq 1 6); do
for yy in $(seq 1 5); do
	startx=$(( $x * $xx + 100))
	starty=$(( $y * $yy + 200))
if [ $xx -gt 3 ] ; then startx=$(($startx + 200)) ;fi
draw="$draw  -draw \"circle $startx,$starty $(( $startx - 10)),$(( $starty - 10 ))\""
done
done
echo convert $draw white.png          draw_circle.png | bash

for xx in $(seq 1 6); do
for yy in $(seq 1 5); do
        startx=$(( $x * $xx + 100))
        starty=$(( $y * $yy + 200))
if [ $xx -gt 3 ] ; then startx=$(($startx + 200)) ;fi
convert -fill white -stroke black $draw  -draw "circle $startx,$starty $(( $startx - 10)),$(( $starty - 10 ))" draw_circle.png $xx-$yy.png
convert  -draw "rectangle 300,50 500,100"  $xx-$yy.png push-$xx-$yy.png
convert  -draw "rectangle 150,50 650,100"  $xx-$yy.png pull-$xx-$yy.png
done
done

Example movie generated using random notes/length pause

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
for f in $(seq 1 50) ; do
pushpull=$(shuf -n1 -e push pull)
row=$(shuf -n1 -e 1 2 2 2 2 2 3 4 4 5 5 5 6)
col=$(shuf -n1 -e 1 1 1 2 2 3)
pauze=$(shuf -n1 -e 0 0 0 0 0 0 0 0 1 )
length=$(shuf -n1 -e 1 1 1 1 2 2 3 4)
file="$pushpull-$row-$col.png"
if [ $pauze == "1" ]; then
file="draw_circle.png"
fi
for f in $(seq 1 $lenght) ; do
echo "file $file"
echo "duration 0.5"
done
done
for f in $(seq 1 50) ; do pushpull=$(shuf -n1 -e push pull) row=$(shuf -n1 -e 1 2 2 2 2 2 3 4 4 5 5 5 6) col=$(shuf -n1 -e 1 1 1 2 2 3) pauze=$(shuf -n1 -e 0 0 0 0 0 0 0 0 1 ) length=$(shuf -n1 -e 1 1 1 1 2 2 3 4) file="$pushpull-$row-$col.png" if [ $pauze == "1" ]; then file="draw_circle.png" fi for f in $(seq 1 $lenght) ; do echo "file $file" echo "duration 0.5" done done
for f in $(seq 1 50) ; do
pushpull=$(shuf -n1 -e push pull)
row=$(shuf -n1 -e 1 2 2 2 2 2 3 4 4 5 5 5 6)
col=$(shuf -n1 -e 1 1 1 2 2 3)
pauze=$(shuf -n1 -e 0 0 0 0 0 0 0 0 1 )
length=$(shuf -n1 -e 1 1 1 1 2 2 3 4)
file="$pushpull-$row-$col.png"
if [ $pauze == "1" ]; then
file="draw_circle.png"
fi
for f in $(seq 1 $lenght) ; do
echo "file $file"
echo "duration 0.5"
done
done

list to mp4

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
ffmpeg -f concat -i list -vf fps=10 -pix_fmt yuv420p test.mp4
ffmpeg -f concat -i list -vf fps=10 -pix_fmt yuv420p test.mp4
ffmpeg -f concat -i list  -vf fps=10 -pix_fmt yuv420p test.mp4

Above movie shows left and right hand. Keys to press.
And the bar above represents PULL/PUSH

Todo/In progress:

  • abc parser ( started )
  • Push/Pull as text in above movie also note to play??
  • Rewrite to python

Bella Ciao on Concertina

In post below i posted the score for Bella Ciao
https://www.henriaanstoot.nl/2022/12/09/generating-pdfs-from-abc-files-to-include-in-tunebooks/

Here is a quick ‘n dirty recording (sound a little distorted)

Edited with Kdenlive

I’ve imported the score as an image.
Drag a transform effect on the image.
Move the image to the bottom of the screen.
Add a keyframe.
Move to the end of the movie, add another keyframe.
Adjust the Y position to 0
Set opacity to a nice position and render

Arduino Concertina

Lets try to make a Electronic Concertina

UPDATE:
https://www.henriaanstoot.nl/2023/01/10/arduino-concertina-poc/
https://www.henriaanstoot.nl/2023/01/17/arduino-concertina-poc-2/

First design

So we need some pushbuttons … at least 14 .. for the most simple tunes.
A sensor for push and pull.
A buzzer or better yet .. a jack for earphones.
Arduino with enough pins to connect a keyboard matrix.
When using a keyboard matrix only single keypresses are detected.
So we cant do chords!

Generating PDFs from abc files to include in tunebooks.

see : https://www.henriaanstoot.nl/2022/11/21/tunebook-generator/

Edit or download a ABC music file

(More info about music notation programs https://www.henriaanstoot.nl/2022/08/24/music-notation-programs/ )

I wanted to learn Bella Ciao on my Concertina. I find the sound of the Concerina fitting the tune. So i used vi and conversion tools to create a pdf for my concertina tunebook.

(While being popular nowadays because it was used in La Casa de Papel (Money Heist). It has a interesting history)
https://en.wikipedia.org/wiki/Bella_ciao

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
X:
T: Bella Ciao
M: 4/4
L: 1/8
R: reel
K:C
Zz EAB | cA-A z EAB | cA-A z EAB | c2 BA c2 BA |
e2 e2 eede | ff-f2 z fed | | fe-e z edc | B2 e2 c2 B2 |
A4 z z de | ff-f2 z fed | fe-e2 z edc | B2 e2 c2 B2 |
w: "repeat\ from\ beginning"
A4 z EAB | cA-A z EAB | cA-A z EAB | c2 BA c2 BA |
e2 e2 e2 de | ff-f2 z fed | fe-e z edc | B2 e2 c2 B2 |
A4 z EAB | cA-A z EAB | cA-A z EAB | c2 BA c2 BA |
e2 e2 eede | ff-f2 z fed | fe-e2 z edc | B2 e2 c2 B2 |
A4 z ede | ff-f2 z fed | fe-e2 z edc | B2 e2 ^f2 ^g2 | a4 Zz |
X: T: Bella Ciao M: 4/4 L: 1/8 R: reel K:C Zz EAB | cA-A z EAB | cA-A z EAB | c2 BA c2 BA | e2 e2 eede | ff-f2 z fed | | fe-e z edc | B2 e2 c2 B2 | A4 z z de | ff-f2 z fed | fe-e2 z edc | B2 e2 c2 B2 | w: "repeat\ from\ beginning" A4 z EAB | cA-A z EAB | cA-A z EAB | c2 BA c2 BA | e2 e2 e2 de | ff-f2 z fed | fe-e z edc | B2 e2 c2 B2 | A4 z EAB | cA-A z EAB | cA-A z EAB | c2 BA c2 BA | e2 e2 eede | ff-f2 z fed | fe-e2 z edc | B2 e2 c2 B2 | A4 z ede | ff-f2 z fed | fe-e2 z edc | B2 e2 ^f2 ^g2 | a4 Zz |
X:
T: Bella Ciao
M: 4/4
L: 1/8
R: reel
K:C 
Zz EAB | cA-A z  EAB | cA-A z  EAB | c2 BA c2 BA | 
e2 e2 eede | ff-f2 z fed | | fe-e z edc | B2 e2 c2 B2 | 
A4 z z de | ff-f2 z fed | fe-e2 z edc | B2 e2 c2 B2 | 
w: "repeat\ from\ beginning"
A4 z EAB | cA-A z  EAB | cA-A z  EAB | c2 BA c2 BA |
e2 e2 e2 de | ff-f2 z fed | fe-e z edc | B2 e2 c2 B2 |
A4 z EAB | cA-A z  EAB | cA-A z  EAB | c2 BA c2 BA |
e2 e2 eede | ff-f2 z fed | fe-e2 z edc | B2 e2 c2 B2 | 
A4 z ede | ff-f2 z fed | fe-e2 z edc | B2 e2 ^f2 ^g2 | a4 Zz |

Using below command, I get a nicely formatted PDF

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
abcm2ps -x -O - bella.abc | ps2pdf -sPAPERSIZE=a4 - bella.pdf
abcm2ps -x -O - bella.abc | ps2pdf -sPAPERSIZE=a4 - bella.pdf
abcm2ps -x -O - bella.abc | ps2pdf  -sPAPERSIZE=a4 - bella.pdf

I’ll probably automate this, for example include this in the tunebook generator. Something like : “If abc file in subdir create pdf to include”

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# Reads every file in abcsources and writes filename.pdf in current directory
ls abcsources/*abc | while read abc ; do abcm2ps -x -O - "$abc" | ps2pdf -sPAPERSIZE=a4 - "$(echo $abc | cut -f2 -d/ | sed 's/abc/pdf/g')" ;done
# Reads every file in abcsources and writes filename.pdf in current directory ls abcsources/*abc | while read abc ; do abcm2ps -x -O - "$abc" | ps2pdf -sPAPERSIZE=a4 - "$(echo $abc | cut -f2 -d/ | sed 's/abc/pdf/g')" ;done
# Reads every file in abcsources and writes filename.pdf in current directory
ls abcsources/*abc | while read abc ; do  abcm2ps -x -O - "$abc" | ps2pdf  -sPAPERSIZE=a4 - "$(echo  $abc | cut -f2 -d/ | sed 's/abc/pdf/g')" ;done

I admire people who excel at things they do

These are my lists, but i’m open for discussions/questions
Work in progress

Actors

  • Tom Hanks
  • John Lithgow
  • Dennis Lee Hopper
  • Jack Nicholson
  • Clint Eastwood
  • Dustin Hoffman
  • Rutger Hauer (RIP) .. see “De kijk van Koolhoven” why

Art

  • H.R. Giger
  • M.C. Escher
  • César Manrique
  • Comics ( Details from  André Franquin, Dark Humor Koen Hottentot,  Don Lawrence, Don Martin ) to name a few, they are spot on
One of my comic collections – Don Martin

Classical Music

  • Paganini
  • Ludovico Einaudi

Composers

  • Ennio Morricone
  • Hans Zimmer
  • John Williams ( with a remark )
    Some of the Starwars Suite was taken from already existing music
    ( See https://www.youtube.com/watch?v=DN3vl-JnUF8 ! )
    Gustav Holst – The Planets Suite – Mars part for example

Folk/pipers (composers)

  • Gordon Duncan (RIP)
  • Fred Morrison
  • RS MacDonald
  • Paddy Keenan

A (bad) comic i drew about Gordon Duncan in 2012

Opera

Bands (non folk)

Rammstein – I know, seems like a obvious populair choice.
But hear me out.

I like classical till metal. But it has to be musically interesting.

Most (non-german) people don’t listen to the lyrics, i did not either.
I found the music okay. Then i started to listen to the lyrics.

The lyrics are surprisingly deep.
Layers in the text, word jokes like:
Du… (you)
Du hast… (you have, but sounds like hasst .. You hate)
Du hast mich… ( You have me, or sounds like you hate me)
Du hast mich…
Du hast mich gefragt… (You have asked me)

Although people think they are fascists or far-right. Coming from the punk scene, they are kind of the opposite.

Everything they do has a meaning, but sometimes you can “paste” different stories about the song.

Listen to Ohne Dich, and then see the Music Video.

Have a good listen to Germany, and Man gegen man.
There are others better in explaining .. see:

And a AI generated Music Video .. perfectly matching the Lyrics

Bonus:
Check out this YT channel, all kinds of musicians .. transcripted (is this a word?) by this dude.

https://www.youtube.com/@GeorgeCollier