initial commit

This commit is contained in:
rozodru 2025-07-18 10:11:45 -04:00
parent 19e48d3a5a
commit 314787210e
6 changed files with 200 additions and 0 deletions

139
README.md Normal file
View File

@ -0,0 +1,139 @@
# NoisyPC
Bring the glorious chaos of the 90s back to your modern Linux machine.
**NoisyPC** is a small Linux utility that plays retro computer sounds—like hard drive clicks, modem screeches, and fan whines—based on real system activity. It's like installing a sound skin for your PC that turns disk I/O, CPU load, and more into an ambient nostalgia trip.
![Retro PC](https://upload.wikimedia.org/wikipedia/commons/3/32/IBM_PS2_Model_25.jpg)
> Remember when opening a file _sounded like_ opening a file? Yeah, I do too.
---
## 🧰 Features
- 💽 Plays hard drive seek/spin sounds based on real disk access
- 📡 Optional modem screech on network activity (coming soon)
- 🧠 Customizable sound themes (HDD, modem, CPU, etc.)
- 🔧 Lightweight Python script that runs quietly in the background
- ☠️ Zero actual impact on performance or I/O—its all fake noise, for fun
---
## 🔧 Installation
### 1. Install Dependencies
You'll need Python 3 and `ffplay` from the `ffmpeg` package:
```bash
# Arch Linux
sudo pacman -S ffmpeg
# Debian/Ubuntu
sudo apt install ffmpeg
# Fedora
sudo dnf install ffmpeg
```
### 2. Clone the Repo
```bash
git clone https://github.com/rozodru/noisypc.git
cd noisypc
```
### 3. Add Some Sounds
Create the sound directory and drop in some `.wav` or `.mp3` files:
```bash
mkdir -p ~/.config/noisypc/sounds/hdd
cp ./sounds/hdd1.wav ~/.config/noisypc/sounds/hdd/
```
You can find retro PC sound effects from:
- [https://freesound.org](https://freesound.org)
- [https://archive.org/details/RetroComputerSounds](https://archive.org/details/RetroComputerSounds)
### 4. Run It
```bash
python3 noisypc.py
```
Or make it executable:
```bash
chmod +x noisypc.py
./noisypc.py
```
---
## 📁 Directory Structure
```
~/.config/noisypc/
└── sounds/
└── hdd/
├── hdd1.wav
├── hdd2.wav
└── ...
```
---
## ⚙️ Configuration (Coming Soon)
In the next release: config file support for:
- Disk device selection
- Volume and cooldown
- Sound themes
- Toggling features
---
## 🧠 Why?
Because silent computers are boring.
Because SSDs are too fast.
Because we _miss_ the sound of our machine _doing something_.
---
## 💡 Roadmap
- [x] Disk I/O-triggered HDD sounds
- [ ] Network activity-triggered modem sounds
- [ ] CPU load-triggered fan or coil whine
- [ ] Config file support (TOML/YAML)
- [ ] GUI/TUI toggle or system tray icon
- [ ] Theme packs: IBM, Gateway, Packard Bell
---
## 👤 Author
**andrew@andmc.ca**
Retro computing enthusiast, Linux tinkerer, chaos enjoyer.
---
## 🧡 Contributing
PRs welcome! Especially if you:
- Want to add new sound trigger types
- Have a great archive of retro sounds
- Can build out systemd or autostart support
---
## 📜 License
MIT License.
Make noise, not spyware.

BIN
hdd1.wav Normal file

Binary file not shown.

BIN
hdd2.wav Normal file

Binary file not shown.

BIN
hdd3.wav Normal file

Binary file not shown.

BIN
hdd4.wav Normal file

Binary file not shown.

61
noisypc.py Executable file
View File

@ -0,0 +1,61 @@
#!/usr/bin/env python3
import time
import os
import random
import subprocess
DISK_DEVICE = "nvme0n1" # or sdb, nvme0n1, etc.
SOUND_DIR = os.path.expanduser("~/.config/noisypc/sounds/hdd")
SOUND_COOLDOWN = 1.5 # seconds between sounds to avoid rapid-fire
CHECK_INTERVAL = 0.5 # how often to check disk stats
def get_disk_stats(device):
with open("/proc/diskstats", "r") as f:
for line in f:
if device in line:
parts = line.split()
# Read sectors: field 5, Write sectors: field 9
read_sectors = int(parts[5])
write_sectors = int(parts[9])
return read_sectors, write_sectors
return 0, 0
def play_random_sound():
if not os.path.isdir(SOUND_DIR):
return
sounds = [f for f in os.listdir(SOUND_DIR) if f.endswith((".wav", ".mp3"))]
if not sounds:
return
sound_file = os.path.join(SOUND_DIR, random.choice(sounds))
subprocess.Popen(
["ffplay", "-nodisp", "-autoexit", "-loglevel", "quiet", sound_file]
)
def main():
print("NoisyPC is running... Ctrl+C to quit.")
last_read, last_write = get_disk_stats(DISK_DEVICE)
last_played = 0
while True:
time.sleep(CHECK_INTERVAL)
current_read, current_write = get_disk_stats(DISK_DEVICE)
delta_read = current_read - last_read
delta_write = current_write - last_write
last_read, last_write = current_read, current_write
if (delta_read > 10 or delta_write > 10) and (
time.time() - last_played > SOUND_COOLDOWN
):
play_random_sound()
last_played = time.time()
if __name__ == "__main__":
try:
main()
except KeyboardInterrupt:
print("\nExiting NoisyPC.")