User:E.zn/special issue X: Difference between revisions
(→Txx.uo) |
|||
(48 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
== | __NOTOC__ | ||
''' | <div style="background-color:black; padding:10px; padding-bottom:50px; color:white; font-family:ocr"> | ||
=<span style="color:white">Txx.uo</span>= | |||
[[File:Txx.uo_Final.jpeg|500px|right]] | |||
[[File:Txx.uo_.gif|500px|right]] | |||
''Txx.uo'' consolidates two contrasting radio frequency implementation modes: RFID reader scans the cards/objects containing RFID tags using radio waves and LCD screen displays a [https://www.giangrandi.org/electronics/radio/qcode.shtml#qcodefull Q-code]* [internationally established three-letter abbreviation used in radio communication].<br> | |||
<span>*</span>''A particular Q-code denotes a question when it is followed by a question mark and references an answer [statement] when it's not:''<br> | |||
'''QRT?''' : ''Shall I cease or suspend operation?''<br> | |||
'''QRT''' : ''I am suspending operation.''<br> | |||
The RFID technology is used for object identification, authentication and security reasons, whereas Q-code is transmitted on a specific radio frequency by a radio operator and can be intercepted by anyone, who is tuned in to the same frequency. | |||
This module converts the data received from a scanned card into a sound• and binary code••. This Binary signal is then transfigured into LED••• blinking and is also funneled to another module through an output•• channel. Top row of an LCD screen displays a specific question from the list of a Q-code, depending on a knob position and when receiving•••• a signal from another module, a random Q-code answer is shown on the second row of the screen. All other textual output can be sent to another module via Tx•••••.<br><br> | |||
•D5 o1 out<br> | |||
•• D3 o2 out<br> | |||
•• LED 2 D7<br> | |||
••• D5 o1 out<br> | |||
•••• D8 o5 in<br> | |||
••••• Tx o3 out<br><br><br><br><br><br><br><br><br><br><br><br> | |||
[[File:Txx_sc.png|500px|right]] | |||
==<span style="color:white">Components and configuration</span>== | |||
<br> | |||
+ : Solder<br> | |||
> : Plug into<br><br> | |||
+ 15x1 female header [x2] -- PCB [Nano]<br> | |||
+ 15x1 male header [x2] -- Nano<br> | |||
+ 4x1 female header -- PCB [LCD1602-I2C]<br> | |||
+ 1602 I2C LCD display -- LCD1602-I2C<br> | |||
+ 8x1 Female Header -- PCB [RFID]<br> | |||
+ 8x1 male header -- RFID<br> | |||
+ 10k ohm potentiometer -- A1 P in<br> | |||
+ LED -- LED2 D7<br> | |||
+ 10k ohm resistor-- R1<br> | |||
+ 220 ohm resistor -- R3<br> | |||
+ 220 ohm resistor -- R3<br> | |||
+ 3.5mm mono jack socket -- D5 o1 out<br> | |||
+ 3.5mm mono jack socket -- D3 o2 out<br> | |||
+ 3.5mm mono jack socket -- T5 o3 out<br> | |||
+ 3.5mm mono jack socket -- A2 o4 out<br> | |||
+ 3.5mm mono jack socket -- D8 o5 in<br> | |||
+ 2 pins of 4-pin tactile push button switch -- Reset<br> | |||
+ 5x2 male header 🢒🢒 JP [bridge the second row by soldering them together]<br> | |||
+ Vactrol : place the heads of LED and LDR in a heat shrink tube. Heat up the tube and then:<br> | |||
_ + LED -- LED 1 [long leg of LED 🢒🢒 square hole]<br> | |||
_ + LDR -- LDR<br><br> | |||
> RFID 8x1 male header -- 8x1 11mm female header [bend the pins] -- 8x1 11mm female header -- 8x1 11mm female header [bend the pins] -- 8x1 female header.<br> | |||
> LCD -- 4x1 female header<br> | |||
> NANO -- 2 15x1 female headers | |||
<br><br><br> | |||
<!-- ⯐ 🢗 --> | |||
< | |||
==<span style="color:white">Printed Manual</span>== | |||
<br> | |||
[[File:Manual.jpg|770px]] | |||
<br><br> | |||
< | ==<span style="color:white">Perfboard prototype</span>== | ||
<br> | <br> | ||
[[File:Txx.uo_Prototype_1.jpg|770px]] | |||
</div><br><br> | |||
<!--[[File:Txx.uo.gif|797px|right]] | |||
<br><br> | |||
[[File:Txx.uo.gif|200px|right]]<br><br>--> | |||
==.ino== | |||
<source lang="cpp"> | |||
#include <SPI.h> | |||
#include <MFRC522.h> | |||
#define SS_PIN 10 | |||
#define RST_PIN 9 | |||
#define CHECK_BIT(var,pos) ((var) & (1<<(pos))) | |||
<br><br><br> | MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance. | ||
< | |||
[[ | #include <LiquidCrystal_I2C.h> | ||
//LiquidCrystal_I2C lcd(0x38, BACKLIGHT_PIN, POSITIVE); // Set the LCD I2C address | |||
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address | |||
const int RFIDled = 6; | |||
const int RFIDSound = 5; | |||
const int RFIDbin = 3; | |||
const int signalIN = A0; | |||
const int TextKnob = A1; | |||
const int textSound = A2; | |||
long randNumber; | |||
void setup() | |||
{ | |||
Serial.begin(9600); // Initiate a serial communication | |||
SPI.begin(); // Initiate SPI bus | |||
lcd.begin(16, 2); // initialize the lcd | |||
mfrc522.PCD_Init(); // Initiate MFRC522 | |||
Serial.println(); | |||
pinMode(RFIDled, OUTPUT); | |||
pinMode(RFIDSound, OUTPUT); | |||
pinMode(RFIDbin, OUTPUT); | |||
pinMode(signalIN, INPUT); | |||
pinMode(TextKnob, INPUT); | |||
pinMode(textSound, OUTPUT); | |||
} | |||
void readCard() { | |||
// Look for new cards | |||
if ( ! mfrc522.PICC_IsNewCardPresent()) | |||
{ | |||
return; | |||
} | |||
// Select one of the cards | |||
if ( ! mfrc522.PICC_ReadCardSerial()) | |||
{ | |||
return; | |||
} | |||
//Show UID on serial monitor | |||
Serial.print("UID tag :"); | |||
String content = ""; // for tag + sound | |||
String binary = ""; // for binary + LED | |||
for (int i = 0; i < mfrc522.uid.size; i++) | |||
{ | |||
Serial.print(mfrc522.uid.uidByte[i], DEC); | |||
content.concat(String(mfrc522.uid.uidByte[i], DEC)); | |||
if (content.charAt(i) == '0') { | |||
tone(RFIDSound, 40, 2250); | |||
delay(100); | |||
} | |||
else if (content.charAt(i) == '1') { | |||
tone(RFIDSound, 15, 2250); | |||
delay(100); | |||
} | |||
else if (content.charAt(i) == '2') { | |||
tone(RFIDSound, 25, 1500); | |||
delay(100); | |||
} | |||
else if (content.charAt(i) == '3') { | |||
tone(RFIDSound, 17, 150); | |||
delay(100); | |||
} | |||
else if (content.charAt(i) == '4') { | |||
tone(RFIDSound, 30, 1000); | |||
delay(100); | |||
} | |||
else if (content.charAt(i) == '5') { | |||
tone(RFIDSound, 27, 1590); | |||
delay(100); | |||
} | |||
else if (content.charAt(i) == '6') { | |||
tone(RFIDSound, 28, 1500); | |||
delay(100); | |||
} | |||
else if (content.charAt(i) == '7') { | |||
tone(RFIDSound, 10, 1500); | |||
delay(100); | |||
} | |||
else if (content.charAt(i) == '8') { | |||
tone(RFIDSound, 13, 1050); | |||
delay(100); | |||
} | |||
else if (content.charAt(i) == '9') { | |||
tone(RFIDSound, 7, 1000); | |||
delay(100); | |||
} | |||
} | |||
for (int b = 0; b < mfrc522.uid.size; b++) | |||
{ | |||
Serial.println(mfrc522.uid.uidByte[b], BIN); | |||
char r = mfrc522.uid.uidByte[b]; | |||
for (int j = 8; j >= 0; j--) { | |||
if CHECK_BIT(r, j) { | |||
digitalWrite(RFIDled, HIGH); | |||
digitalWrite(RFIDbin, HIGH); | |||
delay(100); | |||
} else { | |||
digitalWrite(RFIDled, LOW); | |||
digitalWrite(RFIDbin, LOW); | |||
delay(100); | |||
} | |||
delay(100); | |||
} | |||
} | |||
Serial.println(); | |||
delay(100); | |||
} | |||
//Q-code questions | |||
const char *Qs[] = { | |||
"", | |||
"", | |||
"QRB?:How far are you from my station?", | |||
"QRL?:Are you busy?", | |||
"QRZ?:Who is calling me?", | |||
"QRH?:Does my frequency vary?", | |||
"QRI?:How is the tone of my transmission?", | |||
"QRK?:What is the readability of my signals?", | |||
"QRM?:Do you have interference?", | |||
"QRN?:Are you troubled by static noise?", | |||
"QRQ?:Shall I send faster?", | |||
"QRT?:Shall I cease or suspend operation?", | |||
"QRU?:Have you anything for me?", | |||
"QRV?:Are you ready?", | |||
"QRX?:Shall I standby?", | |||
"QSA?:What is the strength of my signals?", | |||
"QSB?:Are my signals fading?", | |||
"QSD?:Is my keying defective?", | |||
"QSL?:Can you acknowledge receipt?" | |||
}; | |||
//Q-code answers/statements | |||
const char *As[] = { | |||
"QRH:Your frequency varies.", | |||
"QRL:I am busy. Please do not interfere.", | |||
"QRM:I have interference.", | |||
"QRM:I am troubled by static noise.", | |||
"QRO:Please increase transmit power.", | |||
"QRQ:Please send faster.", | |||
"QRS:Please send more slowly", | |||
"QRT:I am suspending operation.", | |||
"QRU:I have nothing for you.", | |||
"QRV:I am ready.", | |||
"QRX:Please standby.", | |||
"QSB:Your signals are fading.", | |||
"QSD:Your keying is defective.", | |||
"QSK:I can hear you between my signals (while transmitting); break in on my transmission.", | |||
"QSL:I am acknowledging receipt.", | |||
"QSM:Repeat the last telegram which you sent me", | |||
"QSY:Please change transmission frequency.", | |||
"QSZ:Send each word or group twice." | |||
}; | |||
void loop() | |||
{ | |||
readCard(); | |||
int textnumber; | |||
int text = analogRead(TextKnob); | |||
textnumber = map(text, 1, 1023, 0, 18); | |||
if (textnumber > 1) { //when the knob is turned from the 'position 0' | |||
Serial.println(Qs[textnumber]); | |||
String question = Qs[textnumber]; | |||
lcd.setCursor(0, 0); //Set the lcd cursor to the upper left corner | |||
lcd.print(Qs[textnumber]); //Display the specific Q-question on the fisrt row of LCD | |||
for (int positionCounter = 0; positionCounter < question.length(); positionCounter++) { | |||
lcd.scrollDisplayLeft(); //Q-question scrolls to the left | |||
delay(230); | |||
} | |||
char* specQs = Qs[textnumber]; | |||
// loop over each character of question | |||
for (int a = 0; a < strlen(specQs); a++ ) { | |||
char c = specQs[a]; | |||
//Serial.print(c); | |||
//Serial.print(" "); | |||
Serial.print(specQs[a], BIN); | |||
//Serial.println(); | |||
// sonify the bits... | |||
for (int i = 7; i >= 0; i--) { | |||
if CHECK_BIT(c, i) { | |||
tone(textSound, 440, 100); | |||
} else { | |||
tone(textSound, 220, 100); | |||
} | |||
delay(100); | |||
} | |||
} | |||
} | |||
// give an answer | |||
randNumber = random(0, 17); | |||
int readSignal = digitalRead(signalIN); | |||
String randomQ = As[randNumber]; | |||
if (readSignal) { //If the module receives a signal via A2 o4 input channel... | |||
Serial.println(As[randNumber]); | |||
lcd.setCursor(0, 1); //Set the lcd cursor to the lower left corner | |||
lcd.print(randomQ); //Displayes a random Q-answer from the answers array | |||
for (int counter = 0; counter < randomQ.length(); counter++) { | |||
lcd.scrollDisplayLeft(); //Q-answer dissapears in the left side of the LCD | |||
delay(230); | |||
} | |||
} | |||
delay(500); | |||
} | |||
</source> | |||
=Collaboration, Conflict & Consent= | |||
'''A two-day [https://pzwiki.wdka.nl/mediadesign/Xpub1_Collaboration,_Conflict_%26_Consent/ workshop] with [http://eleanorg.org/ Eleanor Greenhalgh]''' [[File:Nor.gif|200px|thumb|right]] | |||
_ Applying various methods of decision-making and evaluating the outcomes.<br> | |||
_ Practicing listening in teams of three [each having a specific role].<br> | |||
_ Playing group games, like [https://dramaresource.com/count-to-20/ counting to 20].<br> | |||
_ Creating a consensual artwork.<br><br><br> | |||
=Module= | |||
'''Building a module with a guest tutor [http://dennisdebel.nl/ Dennis de Bel]''' | |||
__ [https://learn.sparkfun.com/tutorials/voltage-current-resistance-and-ohms-law/all Voltage, Current, Resistance, and Ohm's Law ] | |||
==Referneces [Dennis]== | |||
[https://uxdesign.cc/the-worst-volume-control-ui-in-the-world-60713dc86950 The worst volume control UI in the world]<br> | |||
[https://www.youtube.com/watch?v=1KVyFio8gw4&app=desktop Dark Patterns: User Interfaces Designed to Trick People] | |||
<br><br> | <br><br> | ||
=Sound= | |||
'''Sound / music / listening / methods with [https://olliaarni.bandcamp.com/ Olli Aarni]''' | |||
[[File:Sound-making.gif|200px|thumb|right]] | |||
==References [Olli]== | |||
[https://monoskop.org/images/6/6b/Cage_John_Silence_Lectures_and_Writings_1973.pdf John Cage - Silence]<br> | |||
[https://1819.mywdka.nl/SPCD23/wp-content/uploads/sites/300/2018/07/pauline-oliveros-deep-listening-a-composers-sound-practice.pdf Pauline Oliveros - Deep Listening - A Composer's Sound Practice]<br> | |||
[https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=2ahUKEwi_2NP747LmAhVB-aQKHZBfD2kQFjAAegQIAxAC&url=https%3A%2F%2Fwww.onlineopen.org%2Fdownload.php%3Fid%3D259&usg=AOvVaw0a91DW4tKp0b8KSYeUgUMB Mark Bain - Psychosonics and the Modulationof Public Space, On Subversive Sonic Techniques]<br><br> | |||
Latest revision as of 13:33, 21 June 2021
Txx.uo
Txx.uo consolidates two contrasting radio frequency implementation modes: RFID reader scans the cards/objects containing RFID tags using radio waves and LCD screen displays a Q-code* [internationally established three-letter abbreviation used in radio communication].
*A particular Q-code denotes a question when it is followed by a question mark and references an answer [statement] when it's not:
QRT? : Shall I cease or suspend operation?
QRT : I am suspending operation.
The RFID technology is used for object identification, authentication and security reasons, whereas Q-code is transmitted on a specific radio frequency by a radio operator and can be intercepted by anyone, who is tuned in to the same frequency.
This module converts the data received from a scanned card into a sound• and binary code••. This Binary signal is then transfigured into LED••• blinking and is also funneled to another module through an output•• channel. Top row of an LCD screen displays a specific question from the list of a Q-code, depending on a knob position and when receiving•••• a signal from another module, a random Q-code answer is shown on the second row of the screen. All other textual output can be sent to another module via Tx•••••.
•D5 o1 out
•• D3 o2 out
•• LED 2 D7
••• D5 o1 out
•••• D8 o5 in
••••• Tx o3 out
Components and configuration
+ : Solder
> : Plug into
+ 15x1 female header [x2] -- PCB [Nano]
+ 15x1 male header [x2] -- Nano
+ 4x1 female header -- PCB [LCD1602-I2C]
+ 1602 I2C LCD display -- LCD1602-I2C
+ 8x1 Female Header -- PCB [RFID]
+ 8x1 male header -- RFID
+ 10k ohm potentiometer -- A1 P in
+ LED -- LED2 D7
+ 10k ohm resistor-- R1
+ 220 ohm resistor -- R3
+ 220 ohm resistor -- R3
+ 3.5mm mono jack socket -- D5 o1 out
+ 3.5mm mono jack socket -- D3 o2 out
+ 3.5mm mono jack socket -- T5 o3 out
+ 3.5mm mono jack socket -- A2 o4 out
+ 3.5mm mono jack socket -- D8 o5 in
+ 2 pins of 4-pin tactile push button switch -- Reset
+ 5x2 male header 🢒🢒 JP [bridge the second row by soldering them together]
+ Vactrol : place the heads of LED and LDR in a heat shrink tube. Heat up the tube and then:
_ + LED -- LED 1 [long leg of LED 🢒🢒 square hole]
_ + LDR -- LDR
> RFID 8x1 male header -- 8x1 11mm female header [bend the pins] -- 8x1 11mm female header -- 8x1 11mm female header [bend the pins] -- 8x1 female header.
> LCD -- 4x1 female header
> NANO -- 2 15x1 female headers
Printed Manual
Perfboard prototype
.ino
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9
#define CHECK_BIT(var,pos) ((var) & (1<<(pos)))
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.
#include <LiquidCrystal_I2C.h>
//LiquidCrystal_I2C lcd(0x38, BACKLIGHT_PIN, POSITIVE); // Set the LCD I2C address
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address
const int RFIDled = 6;
const int RFIDSound = 5;
const int RFIDbin = 3;
const int signalIN = A0;
const int TextKnob = A1;
const int textSound = A2;
long randNumber;
void setup()
{
Serial.begin(9600); // Initiate a serial communication
SPI.begin(); // Initiate SPI bus
lcd.begin(16, 2); // initialize the lcd
mfrc522.PCD_Init(); // Initiate MFRC522
Serial.println();
pinMode(RFIDled, OUTPUT);
pinMode(RFIDSound, OUTPUT);
pinMode(RFIDbin, OUTPUT);
pinMode(signalIN, INPUT);
pinMode(TextKnob, INPUT);
pinMode(textSound, OUTPUT);
}
void readCard() {
// Look for new cards
if ( ! mfrc522.PICC_IsNewCardPresent())
{
return;
}
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial())
{
return;
}
//Show UID on serial monitor
Serial.print("UID tag :");
String content = ""; // for tag + sound
String binary = ""; // for binary + LED
for (int i = 0; i < mfrc522.uid.size; i++)
{
Serial.print(mfrc522.uid.uidByte[i], DEC);
content.concat(String(mfrc522.uid.uidByte[i], DEC));
if (content.charAt(i) == '0') {
tone(RFIDSound, 40, 2250);
delay(100);
}
else if (content.charAt(i) == '1') {
tone(RFIDSound, 15, 2250);
delay(100);
}
else if (content.charAt(i) == '2') {
tone(RFIDSound, 25, 1500);
delay(100);
}
else if (content.charAt(i) == '3') {
tone(RFIDSound, 17, 150);
delay(100);
}
else if (content.charAt(i) == '4') {
tone(RFIDSound, 30, 1000);
delay(100);
}
else if (content.charAt(i) == '5') {
tone(RFIDSound, 27, 1590);
delay(100);
}
else if (content.charAt(i) == '6') {
tone(RFIDSound, 28, 1500);
delay(100);
}
else if (content.charAt(i) == '7') {
tone(RFIDSound, 10, 1500);
delay(100);
}
else if (content.charAt(i) == '8') {
tone(RFIDSound, 13, 1050);
delay(100);
}
else if (content.charAt(i) == '9') {
tone(RFIDSound, 7, 1000);
delay(100);
}
}
for (int b = 0; b < mfrc522.uid.size; b++)
{
Serial.println(mfrc522.uid.uidByte[b], BIN);
char r = mfrc522.uid.uidByte[b];
for (int j = 8; j >= 0; j--) {
if CHECK_BIT(r, j) {
digitalWrite(RFIDled, HIGH);
digitalWrite(RFIDbin, HIGH);
delay(100);
} else {
digitalWrite(RFIDled, LOW);
digitalWrite(RFIDbin, LOW);
delay(100);
}
delay(100);
}
}
Serial.println();
delay(100);
}
//Q-code questions
const char *Qs[] = {
"",
"",
"QRB?:How far are you from my station?",
"QRL?:Are you busy?",
"QRZ?:Who is calling me?",
"QRH?:Does my frequency vary?",
"QRI?:How is the tone of my transmission?",
"QRK?:What is the readability of my signals?",
"QRM?:Do you have interference?",
"QRN?:Are you troubled by static noise?",
"QRQ?:Shall I send faster?",
"QRT?:Shall I cease or suspend operation?",
"QRU?:Have you anything for me?",
"QRV?:Are you ready?",
"QRX?:Shall I standby?",
"QSA?:What is the strength of my signals?",
"QSB?:Are my signals fading?",
"QSD?:Is my keying defective?",
"QSL?:Can you acknowledge receipt?"
};
//Q-code answers/statements
const char *As[] = {
"QRH:Your frequency varies.",
"QRL:I am busy. Please do not interfere.",
"QRM:I have interference.",
"QRM:I am troubled by static noise.",
"QRO:Please increase transmit power.",
"QRQ:Please send faster.",
"QRS:Please send more slowly",
"QRT:I am suspending operation.",
"QRU:I have nothing for you.",
"QRV:I am ready.",
"QRX:Please standby.",
"QSB:Your signals are fading.",
"QSD:Your keying is defective.",
"QSK:I can hear you between my signals (while transmitting); break in on my transmission.",
"QSL:I am acknowledging receipt.",
"QSM:Repeat the last telegram which you sent me",
"QSY:Please change transmission frequency.",
"QSZ:Send each word or group twice."
};
void loop()
{
readCard();
int textnumber;
int text = analogRead(TextKnob);
textnumber = map(text, 1, 1023, 0, 18);
if (textnumber > 1) { //when the knob is turned from the 'position 0'
Serial.println(Qs[textnumber]);
String question = Qs[textnumber];
lcd.setCursor(0, 0); //Set the lcd cursor to the upper left corner
lcd.print(Qs[textnumber]); //Display the specific Q-question on the fisrt row of LCD
for (int positionCounter = 0; positionCounter < question.length(); positionCounter++) {
lcd.scrollDisplayLeft(); //Q-question scrolls to the left
delay(230);
}
char* specQs = Qs[textnumber];
// loop over each character of question
for (int a = 0; a < strlen(specQs); a++ ) {
char c = specQs[a];
//Serial.print(c);
//Serial.print(" ");
Serial.print(specQs[a], BIN);
//Serial.println();
// sonify the bits...
for (int i = 7; i >= 0; i--) {
if CHECK_BIT(c, i) {
tone(textSound, 440, 100);
} else {
tone(textSound, 220, 100);
}
delay(100);
}
}
}
// give an answer
randNumber = random(0, 17);
int readSignal = digitalRead(signalIN);
String randomQ = As[randNumber];
if (readSignal) { //If the module receives a signal via A2 o4 input channel...
Serial.println(As[randNumber]);
lcd.setCursor(0, 1); //Set the lcd cursor to the lower left corner
lcd.print(randomQ); //Displayes a random Q-answer from the answers array
for (int counter = 0; counter < randomQ.length(); counter++) {
lcd.scrollDisplayLeft(); //Q-answer dissapears in the left side of the LCD
delay(230);
}
}
delay(500);
}
Collaboration, Conflict & Consent
A two-day workshop with Eleanor Greenhalgh
_ Applying various methods of decision-making and evaluating the outcomes.
_ Practicing listening in teams of three [each having a specific role].
_ Playing group games, like counting to 20.
_ Creating a consensual artwork.
Module
Building a module with a guest tutor Dennis de Bel
__ Voltage, Current, Resistance, and Ohm's Law
Referneces [Dennis]
The worst volume control UI in the world
Dark Patterns: User Interfaces Designed to Trick People
Sound
Sound / music / listening / methods with Olli Aarni
References [Olli]
John Cage - Silence
Pauline Oliveros - Deep Listening - A Composer's Sound Practice
Mark Bain - Psychosonics and the Modulationof Public Space, On Subversive Sonic Techniques