RaagaX v1.9.1 is live for Android!Direct APK Download
v1.9.1 • Android 8.0+|IMPLEMENTED
Download Android APK Nowv1.9.1 Signed • ~38.4 MB • Android 8.0+

RaagaX

Music playback, engineered beyond the surface.

An independent Android music experience built around immersive playback, high-quality audio, synchronized lyrics, offline listening, real-time listening sessions, and cross-device control.

Explore the Engineering Architecture
CR
Engineered by Chandra Reddy (@Astrionix)Kotlin • Jetpack Compose • Media3 • Liquid Glass GPU Shader • Go Jam Hub
RaagaX Real Android Screen Capture via ADB

Real Device Capture

1.5K AMOLED • 1220×2712

ADB LIVE
Official DistributionIMPLEMENTED

Try RaagaX

Download the latest Android build and experience the application yourself. Engineered with hardware-accelerated shaders, gapless playback, and native audio analysis.

Latest Versionv1.9.1
Android Version8.0+ (API 26+)
Package Size~38.4 MB
Build TargetAndroid 15 (API 36)
NDK / C++ ToolchainNDK 27 / CMake
Binary Verification Signed Release

Installation Note: Android may ask you to allow installation from your browser or file manager when installing an APK outside Google Play. The APK is cryptographically signed with the official project release key.

The Architecture of Experience

Not just another music player.

RaagaX was built as a complete playback experience — from audio delivery and media controls to synchronized lyrics, offline storage, real-time sessions, and device handoff.

RaagaX Listen Now Screen
01 • Listen Now
RaagaX Now Playing Screen
02 • Now Playing
Native Android 14+ Jetpack ComposeVerified on Hardware
Playback Journey Stage 4 of 7IMPLEMENTED

Now Playing

Immersive mesh gradient backdrop with custom controls

Real-time color extraction from album art into a 60fps GPU-accelerated backdrop, Media3 session, and gapless crossfade.
Feature 01 — Playback ArchitectureIMPLEMENTED

Playback is the product.

Built around Android Media3 with a playback architecture designed to remain reliable beyond the foreground UI. Background execution operates within a first-class Android foreground service, integrating with system media controls, Bluetooth audio sinks, and system audio managers.

Gapless PlaybackZero silence between consecutive tracks
True CrossfadeConfigurable 0–12s curve blending
Skip Silence & Speed0.5x to 2.0x pitch-neutral playback
Equalizer & Sleep TimerSystem equalizer & track-end auto-stop
Media3 Foreground Engine
ACTIVE SESSION

Resonance of Infinity

Astrionix Masterworks • Session ID: #9042

ExoPlayer 1.4.1 • AudioSink: DirectTrack

02:4404:12
Crossfade4s
Speed1.0x
Volume Normalization: On
Audio Pipeline Monitor
CodecFLAC
Bit Depth24-bit
Sample Rate96 kHz
ChannelsStereo (2.0)
Signal Path Flow
Source StreamFloat DSP ChainMedia3 SinkAudioTrack Hardware

* Note: Quality metrics reflect active source resolution. Fallbacks dynamically negotiate to 320kbps AAC/Opus when FLAC is unavailable.

Feature 02 — High-Fidelity AudioIMPLEMENTED

Built for serious listening.

RaagaX supports pluggable sources capable of delivering lossless audio streams (FLAC / ALAC) with YouTube Music as an automatic fallback. An integrated 32-bit float DSP chain handles volume leveling, dynamic range control, and equalizer filtering before passing directly to the hardware AudioSink.

Truthful Audio Metrics: Displays actual decoded bit depth and sample rates rather than arbitrary marketing promises.

Per-Network Quality Governor: Configurable bit-rate ceilings for Wi-Fi vs. Mobile data to conserve bandwidth.

Feature 03 — Syllable EngineIMPLEMENTED

Every word has a moment.

RaagaX supports synchronized lyrics with word/syllable-level highlighting from multiple sources. The lyric engine resolves across LRCLIB, Musixmatch, Kugou, and Genius, anchoring timings directly to the playback clock.

Multiple Provider Ingestion:
• LRCLIB (LRC format)
• Musixmatch (RichSync)
• Kugou (KRC syllable parser)
• Genius (Annotations fallback)

* Note: Word-level highlighting is rendered when syllable-level timing metadata is supplied by providers.

KARAOKE ENGINE

Live Word-Level Sync Demonstration

Icanfeelthemusicinmyveins
Current Syllable Offset: +120ms60 FPS Compose Shader
Real Android Lyrics Screen
Real Device Screen CapturePhysical Xiaomi POCO F6 hardware running word-synced lyrics with Romanized script translation.
Artwork Palette ExtractorCrimson Velvet
♪

Neon Odyssey

Astral Drift

Extracted Dominant Hues (Material 3 Dynamic Theming):
Click to test palette switch:
Feature 04 — Dynamic ThemingIMPLEMENTED

The interface listens to the artwork.

When a track begins playing, RaagaX extracts dominant harmonic colors from the album cover and recalculates the ambient backdrop in real time. Using hardware-accelerated shaders, the entire screen breathes with the tone of the music.

1. Album Artwork Bitmap Ingestion
2. Android Palette Color Extraction & Tone Clamping
3. Dynamic Material 3 Surface Palette Generation
4. Skia / Haze RenderEffect GPU Mesh Shader
Feature 05 — Offline ArchitectureIMPLEMENTED

Your library, even offline.

RaagaX provides an offline storage pipeline with full metadata preservation. Songs, album art, synchronized lyrics, and ID3 tags are persisted to device storage for instant, zero-latency local playback.

Embedded MetadataArtist, title, album, and embedded cover art
Local Device ScannerSeamless integration of existing local audio
Local Download Transaction
1. Audio Payload (Opus/FLAC)✓ Cached (12.4 MB)
2. Embedded High-Res Artwork✓ Injected (1400x1400)
3. Synced LRC / Word Timings✓ Bundled
4. Room SQLite Catalog Entry✓ Indexed
Ready for zero-network playback with full offline queue support.
Real Android Library Screen
Real Device Library & Downloads CaptureLocal database with 1,355+ minutes tracked, offline downloaded FLACs, and WebDAV server connections.
The Engineering CenterpieceIMPLEMENTED

Listening together is a distributed systems problem.

Instead of telling every device to “play now”, RaagaX synchronizes playback using a shared server-time anchor. Network delays can vary by hundreds of milliseconds across cellular towers — but a time-anchored playhead converges authoritatively.

Listen Together Mesh Topology

Go WebSocket Hub • Single-port Render Cluster • In-Memory Party State

Configured party capacity: 5 devices

Host Controller

Android Client (Phone A)

Authoritative Token Holder
State Anchor Hub

Go Party Hub

WebSocket /ws/parties/{code}

Monotonic Server Clock (Zero NTP Steps)

Member Renderers

Up to 4 additional joined clients

Independent Playhead Calculus
The Playhead Formula

How every client converges without polling

Each client calculates where playback should be right now instead of waiting for another network packet to arrive. Even if a packet is delayed, the server-time anchor guarantees deterministic playhead alignment.

// Authoritative State Broadcast from Server:
positionMs = 42000;
anchorMs = 1757630001234; // Server timestamp
isPlaying = true;
// Client-Side Autonomous Resolution:
serverNow = deviceNow + clockOffset;
playhead = positionMs + max(0, serverNow - anchorMs);
⚡ Designed to minimize playback drift across diverse mobile networks.

Network Latency Drift Simulator

Test packet delay impact on audio playhead

Select packet transit delay:
Packet Transit Time:120 ms
Arrival Offset vs Anchor:+120 ms in the past
Calculated Playhead:42,120 ms
✓ Playhead immediately accounts for elapsed time. Both phones play in sync without waiting for a re-transmission!

NTP-Style Clock Synchronization

Device clocks are never assumed to be identical. Each client measures its exact offset: serverMs - (t0 + t1) / 2. Error is bounded by half the round-trip time, retaining the sample with the smallest RTT over cellular.

Device Ping RTT:48 ms
Estimated Clock Offset:-14 ms
Clock Offset Status:Synchronized

5-Second Authoritative Heartbeat

Lost packets, OS power-save doze cycles, or Wi-Fi to cellular handovers do not announce themselves. Every 5 seconds (JAM_STATE_HEARTBEAT_MS), the Go party server unprompted re-states the authoritative truth to all members.

Continuous Heartbeat Interval:
0sSync Check
5sSync Check
10sSync Check
15sSync Check
20sSync Check

Lightweight Queue Mutation Sync

Delta mutations (Move, Remove, Append) over wire instead of transferring full 500-track arrays

▶ NOW PLAYING3:45
01 Midnight Echoes
Kavinsky
POSITION 024:12
02 Solar Drift
Tycho
POSITION 033:58
03 Neon Velocity
Gunship
POSITION 044:30
04 Cybernetic Calm
Lorn
POSITION 053:20
05 Astral Pulse
Com Truise
Last Broadcast Protocol Frame:PARTY_QUEUE_INIT
Cross-Device Playback SubsystemPLANNED / SPECIFICATION

Move the music, not the session.

A comprehensive architectural specification and 30-scenario test harness governing multi-device session discovery, remote control, and atomic playback handoff without audio stutter or duplicate playback.

The 4-Phase Atomic Handoff Transaction

Zero audio interruption • Fallback rollback timeout: 8s

SOURCE DEVICEACTIVE RENDERER (02:31)

Google Pixel 9 Pro

Playing: Ethereal Echoes

TARGET DEVICEIDLE CONTROLLER

MacBook Pro M-Series

Status: Ready to acquire lease

Transaction Step Sequence:
1. PREPARELaptop loads audio URL into memory
2. LOADMediaCodec pipeline pre-buffers track
3. SEEKTarget seek position aligned to 02:31
4. COMMITServer Lease RPC locks active renderer
5. STARTLaptop hardware AudioSink begins output
6. ACKLaptop broadcasts completion token to mesh
7. TRANSFERPhone relinquishes lease and pauses audio
Rule 1: Zero Autoplay on Device Open
Rule 4: Single Active Audio Renderer
Rule 8: Failed Handoff Rollback

Cross-Device Acceptance Test Matrix

30 Formally Specified Scenarios (CD-001 to CD-030)
CD-001

Phone plays, Laptop opens

Laptop displays 'Playing on Phone' in paused state. Zero audio plays on laptop (Zero Autoplay Rule).

CD-002

Phone plays, Laptop taps 'Play Here'

Laptop prepares audio, acquires lease, begins playback at current position. Phone relinquishes and pauses.

CD-003

Laptop playing, Phone taps Pause

Remote PAUSE command dispatched → Laptop pauses → ACK broadcast → Phone UI updates synchronously.

CD-008

Target device buffering fails

8-second timeout triggers rollback coordinator → Phone retains lease and audio continues uninterrupted.

CD-011

Simultaneous 'Play Here' on 2 devices

Server serializes requests via atomic lease revision; exactly one lease committed; zero dual-playback.

CD-026

Bluetooth disconnect on active renderer

Audio safely halts on active renderer; session pause state propagated across observer devices.

System ArchitectureIMPLEMENTED

Under the interface.

RaagaX is structured as a layered system where UI components remain completely isolated from playback state, cloud network failures never interrupt local audio, and native C++ handles high-throughput audio computation.

Select Architecture Layer to Inspect:

Playback & Audio Engine

Android Media3 • ExoPlayer • MediaSession

IMPLEMENTED

Low-latency playback architecture decoupling audio decoding from UI lifecycles through a persistent Android foreground media session service.

Core Responsibilities & Implementation Details:
True 0–12 second gapless crossfade with custom sinusoidal curves
32-bit float software DSP chain with 10-band equalizer and volume leveling
System audio focus negotiation, Bluetooth sink tracker, and auto-pause on headphone unplug
Multi-source stream resolver falling back to YouTube audio when lossless sources are unreachable
Representative Repository Code Files:
file:///app/src/main/java/com/music/raaga/playback/PlaybackService.kt
file:///app/src/main/java/com/music/raaga/playback/audio/PrecisionAudioSink.kt
file:///app/src/main/java/com/music/raaga/playback/audio/FloatDspChain.kt
Native C++ Audio EngineeringIMPLEMENTED

Where Kotlin meets native audio.

For computationally heavy audio analysis tasks such as beat tracking, spectral extraction, and tempo discovery, RaagaX bypasses JVM garbage collection overheads by compiling optimized C++ routines directly through CMake and Android NDK.

6-Stage Native C++ Audio Analysis Pipeline

Compiled via Android NDK 27.2.12479018 • CMake 3.22.1

native/analyzer/
Stage 3: Spectral AnalysisSource: native/analyzer/audio_analysis.cpp

Short-Time Fourier Transform (STFT) with Hanning windowing generating frequency bin energy tensors.

Zero Garbage CollectionFixed-size scratch buffers allocated during song load
SIMD & VectorizationTargeting ARM NEON registers on arm64-v8a devices
JNI Bridge BoundaryStrict JNI boundary passing direct NIO ByteBuffers
Go Jam Hub BackendIMPLEMENTED

Small backend. Serious synchronization.

The party server is written in Go: one WebSocket per device, in-memory room state, zero database overhead, and sub-millisecond execution. Deployed as a single high-throughput service designed to keep up to five signed-in devices in perfect lockstep.

REST & WebSocket Endpoints:
GET /api/time
REST

Instant monotonic server clock reading providing mobile clients a bootstrap time anchor before upgrading to a WebSocket.

HTTP/1.1 200 OK
Content-Type: application/json

{
  "serverMs": 1757630042120,
  "monotonicNanoseconds": 9482018402120
}
Go 1.22 Runtime • Zero Alloc Protocol ParserRender Single-Port Deploy
Architectural Rationale

Decisions behind the experience.

Every layer in RaagaX was deliberately chosen to solve a concrete engineering problem — prioritizing deterministic playback, cellular efficiency, and real-world audio fidelity.

DECISION 01

Why server-time anchors?

Broadcasting 'play now' creates audible drift across heterogeneous mobile networks.

If a server commands five phones to 'play now', a packet arriving 40ms late on Wi-Fi and 300ms late on mobile data causes them to start a quarter-second apart. Re-sending packets only compounds drift. By transmitting a fixed position anchored to an authoritative server timestamp, every device calculates playhead = positionMs + (serverNow - anchorMs) locally and converges autonomously.

Verified in active production repository
DECISION 02

Why separate queue state?

Queue mutations are low-frequency events that must not bloat recurring heartbeats.

Playback position and active playback state must be refreshed frequently (every 5 seconds) to heal packet drops and clock drift. However, playlist queues can contain hundreds of tracks. Sending the entire track array with every heartbeat would consume substantial cellular data. Decoupling queue state into delta mutations (Append, Remove, Move) preserves network bandwidth.

Verified in active production repository
DECISION 03

Why WebSockets over HTTP polling?

Real-time party sessions require continuous sub-50ms bidirectional interactivity.

HTTP polling introduces connection handshake overheads, HTTP header tax, and unpredictable polling latency. A single persistent WebSocket connection per device enables instantaneous host command dispatch (seek, pause, skip) and deterministic NTP-style ping/pong round-trip time sampling.

Verified in active production repository
DECISION 04

Why Android Media3 / ExoPlayer?

First-class integration with Android OS media sessions and hardware audio sinks.

Media3 provides seamless background audio execution within a proper foreground service, lockscreen transport controls, Android Auto compatibility, and hardware volume key interception. Its customizable AudioSink architecture enables zero-gap crossfades and 32-bit floating-point DSP chaining directly before DAC output.

Verified in active production repository
DECISION 05

Why native C++ for audio analysis?

Intensive Fourier transforms require deterministic memory and SIMD vectorization.

Computing Short-Time Fourier Transforms (STFT), 128-band Mel spectrograms, and autocorrelation tempo detection across thousands of PCM audio frames generates intense heap allocation pressure in the JVM. Compiling optimized C++ algorithms via CMake and NDK executes within pre-allocated scratch buffers with ARM NEON SIMD vectorization without triggering garbage collection pauses.

Verified in active production repository
Automated Test Suite & Verification

Built to survive real playback.

Music playback apps fail under real conditions: phones enter battery doze mode, Bluetooth headphones disconnect, and cell towers drop WebSocket frames. RaagaX is backed by 84+ verified test suites and 30 formal cross-device acceptance specifications.

PASSAudio Pipeline

PrecisionAudioSinkTest.kt

Media3 DirectTrack audio sink zero-underrun verification

PASSAudio DSP

FloatDspChainTest.kt

32-bit float equalizer bands, pre-amp clamping, and dynamic leveling

PASSGo Backend Hub

party_test.go

Time-anchor drift calculations, monotonic clock assertions, and member token auth

PASSListen Together

LocalJamHostServerTest.kt

Local room creation, client join handshake, and heartbeat state reassertion

PASSQueue Sync

PartyQueueMoveTest.kt

Deterministic resolution of concurrent queue delta operations across devices

PASSDeterministic Queue

QueueShuffleTierTest.kt

Pseudo-random seed preservation across session restarts and handoffs

PASSOffline Engine

OfflineDashTest.kt

Segmented media caching, atomic file writes, and corrupted stream recovery

PASSDownload Store

DownloadSessionTest.kt

Network state transitions (cellular vs Wi-Fi) and automatic download throttling

PASSCross-Device Spec

CD-001 Zero Autoplay

Opening second device displays remote status without triggering audio playback

PASSCross-Device Spec

CD-002 Play Here Handoff

Atomic lease transfer preserves playhead within 150ms drift tolerance

PASSCross-Device Spec

CD-008 Buffering Rollback

8-second target buffer failure coordinator rolls back lease to source device

PASSLyrics Engine

WordSyncTest.kt

Sub-millisecond syllable interpolation and LRC time offset bounds checking

Representative Production Stress Scenarios

Zero Inverted State Guarantees
1. Remote Pause

Renderer receives and acknowledges pause state without rewinding playback buffer.

2. Concurrent Queue Move

Multiple users reordering songs concurrently resolve deterministically against central epoch.

3. Network Handover

Wi-Fi to LTE drop recovers via 45-second socket grace period without kicking user from party.

4. Monotonic Clock Leap

Host OS NTP clock stepping does not perturb playback anchor or cause audio stutter.

Application Gallery100% Real Device Screenshots

Real Device Interface Gallery.

Captured directly via ADB from physical Android hardware running the production release APK. Explore the real application interface across core user flows.

RaagaX Home / Listen Now Screen Capture via ADB
SCREEN 01 / 09IMPLEMENTED

Home / Listen Now

Curated playlists, recent releases, dynamic mood carousels, and quick resume triggers over a reactive Compose LazyColumn.

Engineering Architecture

Material 3 LazyColumn with floating Liquid Glass navigation bar

Stack Tag:Jetpack Compose • 120Hz Fluid Scroll
Production Technology Matrix

An engineered stack from metal to UI.

Every technology in RaagaX was picked for reliability, determinism, and performance. No superficial wrapper frameworks — true native code at every tier.

GROUP 01 — ANDROID
Kotlin 2.0+Coroutines, StateFlow, Serialization
Jetpack ComposeDeclarative UI with Compose BOM 2024
Material 3Dynamic color & expressive components
Android SDK (API 26–36)Backwards-compatible modern runtime
GROUP 02 — PLAYBACK
Android Media3Modern unified media architecture
ExoPlayer 1.4+DASH/HLS/Progressive stream engine
MediaSessionForeground service & system controls
Custom Float DSPGapless crossfade & 10-band EQ
GROUP 03 — BACKEND
Go (Golang) 1.22Low-overhead concurrency runtime
WebSocket HubSub-50ms full-duplex client streams
In-Memory StoreZero-latency party rooms & tokens
REST EndpointsHealthz & monotonic time bootstrapping
GROUP 04 — DATA
Room SQLiteEncrypted offline tracks & playlists
OkHttp 4 & RetrofitHTTP/2 connection pooling & cache
Supabase CloudUser sync & remote metadata backup
Coil3Hardware-accelerated bitmap caching
GROUP 05 — NATIVE
Modern C++ (C++17)STFT, Mel spectrograms, tempo lag
CMake 3.22.1Native build orchestration
Android NDK 27Direct ARM NEON SIMD acceleration
JNI Zero-CopyDirect byte buffer bridging
GROUP 06 — BUILD
Gradle 8.7+Incremental modularized build daemon
Kotlin DSLType-safe build scripts (build.gradle.kts)
R8 ProguardAggressive dead-code elimination & minification
GitHub Actions CIAutomated test suites & APK release tagging
Engineering Milestones

The development journey.

From the initial audio decoding experiments to a distributed WebSocket cluster and native C++ spectral analyzers — an iterative journey of systems engineering.

STAGE 01

Discovery & Audio Prototyping

Prototyped multi-source audio resolvers connecting JioSaavn catalog metadata and YouTube streaming fallbacks.

Milestone 1
STAGE 02

UI Design System & Haze

Built edge-to-edge Material 3 design system in Jetpack Compose with custom Haze frosted-glass shaders.

Milestone 2
STAGE 03

Media3 Playback Engine

Constructed foreground media session service with 0–12s gapless crossfade and 32-bit float DSP chain.

Milestone 3
STAGE 04

Synchronized Lyrics Engine

Implemented sub-millisecond syllable and word-level karaoke parser supporting LRCLIB, Musixmatch, and Kugou.

Milestone 4
STAGE 05

Offline Storage Architecture

Engineered segmented media downloader with ID3 tag injection and Room SQLite local database persistence.

Milestone 5
STAGE 06

Listen Together (Go Hub)

Developed high-concurrency Go party hub with monotonic server-time anchors and NTP clock synchronization.

Milestone 6
STAGE 07

Cross-Device Subsystem Spec

Authored formal 30-scenario acceptance test specification (CD-001 to CD-030) and 4-phase lease transfer coordinator.

Milestone 7
STAGE 08

Native C++ Audio Analyzer

Integrated CMake and Android NDK 27 for SIMD-accelerated Mel spectrogram and tempo beat tracking.

Milestone 8
STAGE 09

Comprehensive Test Harness

Validated 84 unit and integration test suites covering DSP sinks, queue shuffles, and party state regressions.

Milestone 9
STAGE 10

120Hz Performance Hardening

Eliminated root Compose recompositions, throttled download StateFlow emissions, and optimized GPU shaders.

Milestone 10
Authorship & Systems Ownership

I didn’t just design the interface.

RaagaX required working across multiple layers of the stack — from Android UI and media playback to real-time synchronization, backend services, offline storage, and native audio processing.

Android UI & Composition

10 core screens in declarative Jetpack Compose with Material 3 styling
Custom Haze frosted-glass blur shaders running at 120Hz without stutter
Sub-millisecond word and syllable karaoke lyrics highlighting canvas
Built & Maintained by Chandra Reddy

Playback & DSP Engine

Android Media3 / ExoPlayer integration inside a persistent foreground service
0–12s gapless crossfade with custom sinusoidal curve blending
32-bit float software DSP chain with 10-band equalizer and volume leveling
Built & Maintained by Chandra Reddy

Go Distributed Backend

High-throughput WebSocket party hub written in Go
Monotonic server-time anchors ensuring zero NTP clock step disruptions
In-memory party state with unguessable security tokens and 45s grace periods
Built & Maintained by Chandra Reddy

Real-Time Sync Protocol

Autonomous playhead calculus: playhead = positionMs + (serverNow - anchorMs)
NTP-style ping/pong offset estimation bounding latency drift over cellular
5-second authoritative state heartbeats and delta queue mutation messages
Built & Maintained by Chandra Reddy

Native C++ Audio Analyzer

SIMD-accelerated C++ routines compiled via CMake and Android NDK 27
Short-Time Fourier Transforms and 128-band Mel spectrograms without GC pauses
Autocorrelation tempo detection and beat-grid analysis
Built & Maintained by Chandra Reddy

Data, Storage & Verification

Room SQLite local store with automatic ID3 tag injection for offline playback
84 verified unit & integration test suites in Android and Go
30 formal cross-device acceptance test specifications (CD-001 to CD-030)
Built & Maintained by Chandra Reddy
Ready for Sideloading

Experience RaagaX.

Download the Android build and explore the project for yourself. Engineered with modern Jetpack Compose, native C++ audio analysis, and sub-second Listen Together synchronization.

Signed Release Build (Code 33)•Requires Android 8.0+ (Oreo, API 26+)•Size: ~38.4 MB•NDK 27 / CMake 3.22
Open Source Repository

Everything starts with the code.

Inspect the complete Kotlin, Go, and C++ source code. Built under the GNU General Public License v3.0, ensuring transparency, reproducibility, and freedom of research.

Astrionix/RaagaX

Modern Android music streaming and playback platform

GPL-3.0 License

Contains the complete native Android Jetpack Compose client, ExoPlayer Media3 audio pipeline, Go WebSocket jam server, C++ spectral audio analysis routines, and CMake compilation scripts.

Language Composition:
Kotlin (Jetpack Compose) Go (WebSocket Party Hub) C++ (STFT / Mel Analyzer)