Skip to main content

bs-hsv: Hit Score Visualization

PyPI version Python Version License

bs-hsv is a Pydantic-based Python module for creating, managing, and visualizing hit score judgments with beautiful, intuitive syntax. Perfect for rhythm games, scoring systems, and visualizations that require threshold-based text display.

Features

  • 🎯 Type-Safe: Built with Pydantic for robust data validation
  • 🎨 Flexible Colors: Support for hex, RGB, RGBA, and named colors
  • 📊 Intuitive API: Clean, chainable methods for a great developer experience
  • 🖼️ Image Support: Convert images to colored text art
  • 🔄 Easy Serialization: Simple JSON import/export
  • 🧩 Modular Design: Well-structured codebase with clear separation of concerns

Installation

pip install bs-hsv

Quick Start

from bs_hsv import HSVConfig, Color

# Create a new configuration
config = HSVConfig()

# Add judgments with method chaining and various color formats
config.add(115, "PERFECT", "#FF00FF", fade=True) \
      .add(110, "EXCELLENT", [0, 1, 0, 1]) \
      .add(100, "GOOD", Color(r=1, g=0.5, b=0))

# Add an image-based judgment
config.add_image(0, "logo.png", max_width=40)

# Save the configuration
config.save("hsv_config.json")

# Load a configuration
loaded_config = HSVConfig.load("hsv_config.json")
print(loaded_config)

# Get judgment for a specific score
score = 115
judgment = config.get_judgment_for_score(score)
if judgment:
    print(f"Score {score} gets judgment: {judgment.text} (color: {judgment.color})")

Core Components

Color Class

The Color class represents RGBA colors with values between 0.0 and 1.0:

from bs_hsv import Color

# Various ways to create colors
white = Color.white()  # Predefined color
red = Color.red()      # Predefined color
blue = Color.from_hex("#0000FF")  # From hex string
green = Color.from_rgb(0, 255, 0)  # From RGB values (0-255)
custom = Color(r=0.5, g=0.7, b=1.0, a=0.8)  # Direct RGBA (0-1)

# Color manipulation
lighter = custom.lighten(0.1)
darker = custom.darken(0.2)
transparent = custom.with_alpha(0.5)

# Color conversion
hex_code = custom.to_hex()           # "#80B3FF"
hex_with_alpha = custom.to_hex(include_alpha=True)  # "#80B3FFCC"
rgba_list = custom.to_rgba()         # [0.5, 0.7, 1.0, 0.8]
rgb_tuple = custom.to_rgb_tuple()    # (128, 179, 255)

Judgment Class

The Judgment class represents a hit score judgment with threshold, text, and styling:

from bs_hsv import Judgment, Color

# Create a judgment
judgment = Judgment(
    threshold=115,
    text="EXCELLENT",
    color=Color.from_hex("#00FF00"),
    fade=True
)

# Judgments are comparable based on threshold
judgments = [
    Judgment(threshold=100, text="GOOD"),
    Judgment(threshold=115, text="PERFECT"),
    Judgment(threshold=110, text="GREAT")
]
sorted_judgments = sorted(judgments, reverse=True)  # Highest threshold first

HSVConfig Class

The HSVConfig class manages a collection of judgments:

from bs_hsv import HSVConfig, Color

# Create a configuration
config = HSVConfig()

# Add judgments with method chaining
config.add(115, "PERFECT", "#FF00FF", fade=True) \
      .add(110, "EXCELLENT", [0, 1, 0, 1]) \
      .add(100, "GOOD", Color(r=1, g=0.5, b=0))

# Find a judgment for a score
score = 110
judgment = config.get_judgment_for_score(score)
if judgment:
    print(f"Text: {judgment.text}, Color: {judgment.color}")

# Remove a judgment
config.remove(100)

# Save and load
config.save("config.json")
loaded = HSVConfig.load("config.json")

# Create a copy
config_copy = config.clone()

TextArtGenerator

The TextArtGenerator class provides utilities for generating text art:

from bs_hsv import TextArtGenerator

# Create text art from an image
text_art = TextArtGenerator.from_image("logo.png", max_width=40)

# Create gradient text
gradient = TextArtGenerator.gradient_text(
    "RAINBOW TEXT",
    start_color="#FF0000",
    end_color="#0000FF"
)

# Create pattern
pattern = TextArtGenerator.create_pattern(
    width=10,
    height=3,
    pattern_type="checkerboard",
    color1="#FFFF00",
    color2="#000000"
)

Utility Functions

The HSV module includes various utility functions:

from bs_hsv.utils import merge_configs, generate_color_scheme, color_interpolate

# Merge configurations
merged = merge_configs([config1, config2], strategy="unique")

# Generate a color scheme
base_color = Color.from_hex("#3498DB")
colors = generate_color_scheme(base_color, "analogous", count=5)

# Interpolate between colors
mid_color = color_interpolate(Color.red(), Color.blue(), 0.5)

Advanced Examples

Creating a Game Scoring System

from bs_hsv import HSVConfig, Color

# Create a scoring system for a rhythm game
scoring = HSVConfig()

# Define judgments with different colors and thresholds
scoring.add(115, "PERFECT", "#FFFF00", fade=True) \
       .add(112, "EXCELLENT", "#00FFFF") \
       .add(110, "GREAT", "#00FF00") \
       .add(100, "GOOD", "#0000FF") \
       .add(99, "BAD", "#FF0000")

# Save configuration
scoring.save("rhythm_game_scoring.json")

# Example of how to use in a game
def display_hit_result(hit_score):
    judgment = scoring.get_judgment_for_score(hit_score)
    if judgment:
        # In a real game, you would display this text with the specified color
        print(f"Hit score: {hit_score} → {judgment.text}")
        
        # The judgment provides text, color, and fade information
        text = judgment.text
        color = judgment.color.to_rgba()  # [r, g, b, a] format
        fade = judgment.fade  # Whether to animate with fade effect
        
        # Game engine would use these values to display the judgment

# Test some hit scores
for score in [115, 112, 110, 100, 99]
    display_hit_result(score)

Using Image-Based Judgments

from bs_hsv import HSVConfig

# Create a configuration with image-based text art
image_config = HSVConfig()

# Add judgments with images converted to text art
image_config.add_image(115, "perfect.png", fade=True)
image_config.add_image(110, "great.png")
image_config.add_image(100, "good.png")
# Save the configuration
image_config.save("image_judgments.json")

Using Color Schemes

from bs_hsv import HSVConfig, Color
from bs_hsv.utils import generate_color_scheme

# Create a configuration with a color scheme
config = HSVConfig()

# Generate a color scheme based on a base color
base_color = Color.from_hex("#3498DB")  # Blue
color_scheme = generate_color_scheme(base_color, "triadic", count=3)

# Create judgments with different colors from the scheme
thresholds = [115, 110, 100]
texts = ["PERFECT", "GREAT", "GOOD"]

for i, (threshold, text) in enumerate(zip(thresholds, texts)):
    config.add(threshold, text, color_scheme[i])

# Save the configuration
config.save("color_scheme_config.json")

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Release files for bs-hsv 1.0.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for bs-hsv 1.0.1
File Size Uploaded
bs_hsv-1.0.1.tar.gz 15.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for bs-hsv 1.0.1
File Interpreter ABI Platform
bs_hsv-1.0.1-py3-none-any.whl Python 3 none any Details

Total release size: 29.3 kB

Release files / bs_hsv-1.0.1.tar.gz

Download URL bs_hsv-1.0.1.tar.gz
Size 15.3 kB
Tags Source
SHA-256 checksum
How to use checksums
056831128d7da56fdef6fca24b3780db873819c7844beca9036469e045cd7177
BLAKE2b-256 checksum
How to use checksums
44bf0a9756fc5023207ef3ad520f138fd96f188e9520a9ef1650b88aba9b94eb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.11.8

Release files / bs_hsv-1.0.1-py3-none-any.whl

Download URL bs_hsv-1.0.1-py3-none-any.whl
Size 14.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e848f0f4f92a52b34d683a7c450b8a52d5d9ea3c4657d3ac2749886531d9f58b
BLAKE2b-256 checksum
How to use checksums
7e32c11923edcb6d2303126bf0407e4bb916c9a53f631704033535f709edb1fd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.11.8

Release history Release notifications | RSS feed

This release

1.0.1 This release

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page