ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β β±β² β±β² β±β² β±β² β±β² β±β² β±β² β β
β β β± β² β± β² β± β² β± β² β± β² β± β² β± β² β β
β β β± β²β± β²β± β²β± β²β± β²β± β²β± β² β β
β β βββΌβββββββββββββββββββββββββββββββββββββββββββββΌββ β β
β β β ANTHROSCILLOSCOPE β β β
β β β β β β
β β βββΌβββββββββββββββββββββββββββββββββββββββββββββΌββ β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β VERTICAL HORIZONTAL TRIGGER β
β βββββββ βββββββ βββββββ βββββββ βββββββ βββββββ β
β β β β β β β β β β β β β β β β β β β β
β βββββββ βββββββ βββββββ βββββββ βββββββ βββββββ β
β VOLTS/DIV POS TIME/DIV POS LEVEL MODE β
β β
β [CH1] [CH2] [MATH] [REF] [AUTO] [RUN/STOP] [SINGLE] β
β βββ βββ βββ βββ βββ βββ βββ β
β β
β β CH1 β CH2 β EXT β LINE β POWER β
β ββBNCββββBNCββββBNCββββBNCββ ON/OFF β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β±β ββ²
β± ββββββββββββββββββββββββββββββββββββββββββββ β²
β±________________________________________________β²
ββββββββ¦ββ¦ β¦β¦ββββββββββββ¦β¦ β¦ ββββββββββββββββββ
β ββ£βββ β β ββ£β β¦ββ βββββ ββ β β βββββ β ββ ββββ£
β© β©βββ β© β© β©β©ββββββββββββ©β©βββ©βββββββββββββββ© βββ
Transform your Rigol DS1104Z Plus into a powerful PC-controlled measurement station
The Rigol DS1104Z Plus drawing a spiral from pure stereo audio β sound card left/right into CH1/CH2, XY mode. The audio IS the picture.
Anthroscilloscope is a comprehensive Python toolkit that brings your Rigol DS1104Z Plus oscilloscope to life on your computer. Whether you're debugging circuits, analyzing signals, creating Lissajous patterns, or automating measurements, this suite provides everything you need for seamless remote control and data acquisition.
Main control interface with live waveform display and measurement controls
The suite composes and performs oscilloscope music (Jerobeam Fenderson style): the same two audio channels are both the sound and the picture β redraw rate is pitch, shape is timbre, amplitude is size on screen.
A heartbeat you can hear: each thump of the bass swells the figure.
Two shapes can share the screen at once β the beam is multiplexed between two independent voices, each with its own pitch, shape, motion, and position. Here's a duet performed on an analog BK Precision 2120 vector scope (heart + moon, then heart + star), beat-locked to a real song's tempo and dynamics:
![]() |
![]() |
The toolchain:
xy_shapes.pyβ closed-curve shape library (star, mushroom, Saturn, heart, spiral, rose, butterfly, moon, lightning bolt)xy_animation.pyβ timeline engine: rotation, scaling, and coherent shape-to-shape morphingxy_music.pyβ single-voice compositions (Pulse,Menagerie)xy_duet.pyβ two-voice multiplexing enginescope_composer.pyβ beat-tracks any song (librosa) and renders a duet on its real beat grid, with the track's energy curve driving figure size; motion vocabulary includes spins, direction reversals, pendulum swings, and 3D-style axis flipscomposer_ui.pyβ browser UI (port 8901): sheet-music staff for the beam. Pick a song, analyze it, and your arrangement appears as notes on wrapped staff lines β note height rides the song's loudness curve, a drum lane shows every detected kick (dots) and snare (x), and clicking a note opens its editor (shapes, motions, rates, π² reroll)xy_choreography.pyβ the visual verbs: mirrored voices, half-shapes that fuse seam-to-seam into one figure (two moons β one heart), zigzag shatters, concentric composition (Saturn's body and ring as separate voices), beat-locked breathing
The Scope Composer analyzing a Chemical Brothers track: notes ride the
loudness curve, the drum lane maps every detected kick and snare, and
each note's two emoji show which shapes the beam draws there.
π§ Under active development. The composer's audio side (beat grid, chord-following bass, kick/snare percussion voices) is settling, and the choreography language is being folded into the composer as named "moves". Expect this corner of the repo to keep evolving.
Convert text to beautiful Lissajous curves for oscilloscope XY mode display! This web-based version of the text rendering engine runs entirely in your browser - no installation required.
Features:
- Real-time text-to-Lissajous conversion (A-Z, 0-9)
- Interactive canvas with animation controls
- Export to PNG for images
- Export to WAV for oscilloscope playback (stereo audio)
- Adjustable speed and intensity
- URL sharing with parameters
How to use with oscilloscope:
- Enter your text in the web interface
- Export as WAV file
- Connect audio: Left channel β CH1 (X-axis), Right channel β CH2 (Y-axis)
- Set oscilloscope to XY mode
- Enjoy vector text on your CRT display!
- π― Real-Time Waveform Display - Stream live waveforms directly to your PC with matplotlib visualization
- πΈ Screenshot Capture - Save high-resolution oscilloscope displays as PNG files
- π Automated Measurements - Programmatically capture Vpp, Vmax, Vmin, Frequency, Period, and more
- π§ No Proprietary Drivers - Uses pure Python PyVISA backend - no NI-VISA required
- π₯οΈ Interactive CLI - User-friendly menu system for quick measurements
- π Python API - Full programmatic control for custom automation scripts
- π Ethernet/LAN Control - Fast, reliable connection over your network
- π΅ Waveform Generator - Control built-in signal generator (DS1104Z Plus -S models)
- π FFT Spectrum Analysis - Real-time frequency domain analysis with peak detection
- πΎ Deep Memory Capture - Acquire up to 12M sample points for detailed analysis
- π Auto-Discovery - Automatically find oscilloscopes on your network
- π NEW: Lissajous XY Mode - Generate and analyze mathematical art patterns with frequency ratios
- πΌ Musical Interval Detection - Identify perfect fifths, thirds, and other harmonic relationships
- π Audio Signal Generation - Create test patterns through sound card output
- β¨ Lissajous Text Rendering System - Complete interactive GUI for rendering text as oscilloscope art via XY mode audio! π¨
- Phase 1: Core text-to-audio engine with A-Z characters β
- Phase 2: Full alphanumeric support (A-Z, 0-9, punctuation) β
- Phase 3: Interactive GUI with real-time preview and controls β
- Phase 4: Advanced effects (rotation, 3D, shadows, morphing) β
- Rigol DS1104Z Plus Oscilloscope (or compatible DS1000Z series)
- Python 3.10 or higher
- Ethernet connection between PC and oscilloscope
# Clone the repository
git clone https://github.com/VonHoltenCodes/Anthroscilloscope.git
cd Anthroscilloscope
# Run the complete setup script
chmod +x anthroscilloscope_setup.sh
./anthroscilloscope_setup.sh
# Or install manually
pip3 install pyvisa pyvisa-py pyusb pyserial matplotlib numpy scipy h5py sounddevice
# Optional: pip3 install pandas zeroconfREM Clone the repository (or download ZIP from GitHub)
git clone https://github.com/VonHoltenCodes/Anthroscilloscope.git
cd Anthroscilloscope
REM Run the Windows setup script
anthroscilloscope_setup.bat
REM Or install manually
pip install pyvisa pyvisa-py pyusb pyserial matplotlib numpy scipy h5py sounddevice pandas zeroconfNote: Windows batch files are currently under development and untested. Please report any issues.
-
Configure your oscilloscope for LAN access:
Utility β I/O β LAN Config β DHCP/Static IPNote the IP address displayed
-
Create configuration file:
cp config_template.py config.py # Edit config.py with your oscilloscope IP address -
Test the connection:
python3 test_rigol_connection.py
-
Run the main control interface:
Linux/Mac:
python3 anthroscilloscope_main.py # Or use the launcher: ./anthroscilloscopeWindows:
anthroscilloscope.bat
$ python3 anthroscilloscope_main.py
ποΈ ANTHROSCILLOSCOPE MAIN CONTROL
==================================================
Main Menu:
1. Quick Scope Test (Probe Compensation)
2. Live Waveform Display
3. Single Waveform Capture
4. Save Screenshot
5. Display Measurements
6. Spectrum Analyzer (FFT)
7. Deep Memory Capture
8. Waveform Generator Control
9. Data Export
10. Interactive Lissajous Viewer
11. XY Mode Pattern Analysis
12. Frequency Ratio Calculator
13. Musical Interval Analysis
0. Exit
Select option: 10
[Interactive Lissajous pattern generator launches...]from rigol_oscilloscope_control import RigolDS1104Z
import matplotlib.pyplot as plt
# Connect to your oscilloscope
scope = RigolDS1104Z("192.168.1.100")
scope.connect()
# Capture waveform data
time_data, voltage_data = scope.get_waveform_data(channel=1)
# Make measurements
measurements = {
'Vpp': scope.get_measurement(1, 'VPP'),
'Frequency': scope.get_measurement(1, 'FREQ'),
'RMS': scope.get_measurement(1, 'VRMS')
}
print(f"Signal: {measurements['Vpp']:.3f} Vpp @ {measurements['Frequency']:.1f} Hz")
# Save oscilloscope screenshot
scope.save_screenshot("measurement_capture.png")
# Plot the waveform
plt.figure(figsize=(10, 6))
plt.plot(time_data, voltage_data)
plt.xlabel('Time (s)')
plt.ylabel('Voltage (V)')
plt.title('Captured Waveform')
plt.grid(True)
plt.show()
scope.close()
Interactive Lissajous pattern generator with real-time control
from lissajous_xy_mode import LissajousXYAnalyzer, LissajousPattern
from waveform_generator_control import WaveformGeneratorControl
# Create analyzer for oscilloscope XY mode
analyzer = LissajousXYAnalyzer("192.168.1.100")
analyzer.connect()
# Enable XY mode on oscilloscope
analyzer.set_xy_mode(True)
# Generate a 3:2 Lissajous pattern (perfect fifth)
pattern = LissajousPattern(
freq_x=660.0, # 3x base frequency
freq_y=440.0, # 2x base frequency (A440)
phase=0.0
)
# Start audio generation through sound card
generator = WaveformGeneratorControl()
generator.freq_left = pattern.freq_x
generator.freq_right = pattern.freq_y
generator.phase = pattern.phase
generator.start_generator()
# Analyze the pattern on oscilloscope
analysis = analyzer.analyze_pattern()
print(f"Detected: {analysis['ratio_simplified']} ratio")
print(f"Musical interval: {analysis['musical_interval']}")
Actual Lissajous pattern displayed on DS1104Z Plus in XY mode
# Launch the advanced GUI with effects
python3 text_gui_advanced.py
# Or use the standard GUI
python3 text_gui.pyPhase 4 Advanced Features:
- π Rotation - 0-360Β° real-time rotation
- π Independent Scaling - Separate X/Y axis control
- β¨ Skew/Italics - Shear transformation effect
- π Shadow Effect - Drop shadow with offset
- π 3D Perspective - Pseudo-3D depth and tilt
- π Wave Distortion - Sine wave effects
- π¬ Morphing - Smooth transitions between text
Phase 4 Advanced GUI - "PHASE 4" with 15Β° rotation and shadow effect
Phase 3 Core Features:
- Real-time Preview - See your text rendered as Lissajous patterns
- Font Size Control - Scale from 0.3x to 3.0x
- Speed Adjustment - Control playback speed (0.1x to 5.0x)
- Export to WAV - Generate stereo audio files for oscilloscope playback
- Save/Load Presets - Store your favorite settings
- 42 Characters - A-Z, 0-9, punctuation (. , ! ? -)
Phase 3 Standard GUI with real-time preview and controls
How it works:
- Enter text in the GUI
- Adjust rotation, scaling, and effects
- Watch real-time preview of XY pattern
- Adjust font size and speed sliders
- Export to WAV file
- Play WAV through oscilloscope in XY mode
- See your text appear on the screen with effects!
# Quick probe compensation check
from quick_scope_test import quick_probe_test
# Automatically captures and analyzes the probe compensation signal
results = quick_probe_test("192.168.1.100")
print(f"Probe compensation: {results['status']}")| Script | Description |
|---|---|
anthroscilloscope_main.py |
Main interface with all features |
rigol_oscilloscope_control.py |
Basic control interface |
rigol_display_fixed.py |
Optimized live waveform display |
test_suite.py |
Comprehensive test suite |
| Module | Description |
|---|---|
long_memory_capture.py |
Deep memory acquisition (up to 12M points) |
spectrum_analyzer.py |
FFT analysis with peak detection |
trigger_control.py |
Advanced trigger configuration |
acquisition_control.py |
Acquisition modes and sampling control |
device_discovery.py |
Auto-discovery of oscilloscopes |
| Script | Description |
|---|---|
text_gui_advanced.py |
Advanced GUI with Phase 4 effects |
text_gui.py |
Standard interactive GUI (Phase 3) |
demo_gui.py |
GUI demo with instructions |
branding.py |
Project branding and credits |
text_rendering/effects.py |
Advanced effects module (rotation, 3D, shadows) |
text_rendering/ |
Core rendering engine (Hershey fonts β audio) |
data_export.py |
Multi-format data export |
waveform_generator.py |
Built-in signal generator control (-S models) |
lissajous_xy_mode.py |
XY mode control and Lissajous pattern analysis |
frequency_math.py |
Musical interval detection and frequency mathematics |
waveform_generator_control.py |
Audio signal generation for pattern creation |
| Script | Description |
|---|---|
quick_scope_test.py |
Probe compensation verification |
capture_and_analyze.py |
Advanced waveform analysis |
test_connection_quick.py |
Quick connectivity test |
anthroscilloscope_setup.sh |
Complete installation script |
The toolkit implements the full Rigol DS1000Z SCPI command set:
:WAVeform:SOURce- Select channel source:WAVeform:DATA?- Retrieve waveform data:WAVeform:PREamble?- Get scaling parameters
:MEASure:ITEM?- Query specific measurements- Voltage:
VPP,VMAX,VMIN,VAVG,VRMS - Time:
FREQ,PERiod,RISetime,FALLtime - Pulse:
PWIDth,NWIDth,PDUTy,NDUTy
- Voltage:
:DISPlay:DATA?- Capture screenshot:CHANnel<n>:DISPlay- Enable/disable channels:AUToscale- Auto-setup signal display
# Check network connectivity
ping <oscilloscope_ip>
# Verify SCPI port is accessible
telnet <oscilloscope_ip> 5555
# Run connection test
python3 test_rigol_connection.py| Issue | Solution |
|---|---|
| No connection | Check IP address in Utility β I/O β LAN Config |
| Timeout errors | Increase timeout: scope.timeout = 10000 |
| No waveform display | Use rigol_display_fixed.py for Linux systems |
| Invalid measurements (9.9E+37) | Channel disabled or no signal present |
Anthroscilloscope/
βββ Core Control
β βββ rigol_oscilloscope_control.py # Main control class
β βββ anthroscilloscope_main.py # Main menu interface
β βββ test_rigol_connection.py # Connection utilities
βββ Display & Visualization
β βββ rigol_display_fixed.py # Live display (stable)
β βββ rigol_live_display.py # Alternative display
βββ Lissajous & XY Mode π
β βββ lissajous_xy_mode.py # XY mode analyzer
β βββ frequency_math.py # Musical intervals
β βββ waveform_generator_control.py # Audio generation
β βββ interactive_lissajous_demo.py # Interactive GUI
βββ Text Rendering System β¨
β βββ text_gui.py # Interactive GUI (Phase 3)
β βββ demo_gui.py # GUI demo launcher
β βββ branding.py # Project branding & credits
β βββ splash_screen.py # Splash screen
β βββ text_rendering/ # Core rendering engine
β βββ hershey_font.py # Vector font (42 chars)
β βββ text_to_path.py # Text β XY coordinates
β βββ path_to_audio.py # Path β stereo audio
β βββ lissajous_text_renderer.py # Main API
βββ Analysis Tools
β βββ capture_and_analyze.py # Waveform analysis
β βββ spectrum_analyzer.py # FFT analysis
β βββ quick_scope_test.py # Probe testing
βββ Setup & Configuration
β βββ config_template.py # Configuration template
β βββ anthroscilloscope_setup.sh # Dependency installer
βββ Assets
βββ readme-photo-assets/ # Screenshots & images
Contributions are welcome! Whether it's bug fixes, new features, or documentation improvements, feel free to:
- Fork the repository
- Create a feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
- Built for the Rigol DS1104Z Plus community
- PyVISA team for the excellent VISA implementation
- Hershey Font project for vector font data
- Anthropic for Claude Code and Claude Sonnet 4.5
- The entire Lissajous Text Rendering System (Phases 1-4) was developed using Claude Sonnet 4.5
- Interactive GUI design and implementation created with Claude Code
- All contributors and testers
Created by Trenton Von Holten GitHub: @VonHoltenCodes
Having issues? Found a bug? Have a feature request?
- Open an Issue
- Check existing issues for solutions
- Include your oscilloscope model and firmware version
Made with β€οΈ for the electronics community


