From 20f2e30df280238fbbd1d4c19382140ff8684e21 Mon Sep 17 00:00:00 2001 From: "Salvador E. Tropea" Date: Wed, 16 Jul 2025 08:55:26 -0300 Subject: [PATCH] [Added][Audio Join][Audio Split] New nodes with test and example --- README.md | 28 ++++++ example_workflows/join_and_split.jpg | Bin 0 -> 10713 bytes example_workflows/join_and_split.json | 1 + source/nodes/nodes_audio.py | 115 +++++++++++++++++++++++ source/tests/test_audio_join_split.py | 126 ++++++++++++++++++++++++++ 5 files changed, 270 insertions(+) create mode 100644 example_workflows/join_and_split.jpg create mode 100644 example_workflows/join_and_split.json create mode 100644 source/tests/test_audio_join_split.py diff --git a/README.md b/README.md index 0099c69..38400d4 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,8 @@ workflows, especially when dealing with multiple audio inputs or outputs. - [9. Audio Blend](#9-audio-blend) - [10. Audio Test Signal Generator](#10-audio-test-signal-generator) - [11. Audio Musical Note](#11-audio-musical-note) + - [12. Audio Join 2 Channels](#12-audio-join-2-channels) + - [13. Audio Split 2 Channels](#13-audio-split-2-channels) - [🚀 Installation](#-installation) - [📦 Dependencies](#-dependencies) - [🖼️ Examples](#️-examples) @@ -195,6 +197,32 @@ workflows, especially when dealing with multiple audio inputs or outputs. - **Output:** - `frequency` (FLOAT): The calculated frequency of the note in Hz. +### 12. Audio Join 2 Channels + - **Display Name:** `Audio Join 2 Channels` + - **Internal Name:** `SET_AudioJoin2Channels` + - **Category:** `audio/manipulation` + - **Description:** Combines two separate audio inputs into a single stereo audio output, treating the first input as the left channel and the second as the right. It intelligently handles misaligned inputs. + - **Inputs:** + - `audio_left` (AUDIO): The audio signal for the left channel. If it's stereo or multi-channel, it will be automatically converted to mono before being used. + - `audio_right` (AUDIO): The audio signal for the right channel. Will also be converted to mono. + - **Output:** + - `audio_out` (AUDIO): A stereo audio signal. + - **Behavior Details:** + - **Channel Conversion:** Both `audio_left` and `audio_right` are first forced into mono to ensure they each represent a single channel stream. + - **Alignment:** The two mono signals are then aligned to have the same sample rate and length, using the same logic as the "Batch Audios" node (resamples to match `audio_left`'s SR, pads to match the longest duration). + - **Batch Handling:** If the inputs have different batch sizes, the last item of the shorter batch is repeated to match the length of the longer batch. + +### 13. Audio Split 2 Channels + - **Display Name:** `Audio Split 2 Channels` + - **Internal Name:** `SET_AudioSplit2Channels` + - **Category:** `audio/manipulation` + - **Description:** Takes a stereo audio input and separates it into two mono audio outputs, one for the left channel and one for the right. + - **Inputs:** + - `audio` (AUDIO): The stereo audio signal to be split. **The node will raise an error if the input is not 2-channel stereo.** + - **Outputs:** + - `audio_left` (AUDIO): A mono audio signal containing only the left channel data. + - `audio_right` (AUDIO): A mono audio signal containing only the right channel data. + ## 🚀 Installation You can install the nodes from the ComfyUI nodes manager, the name is *Audio Batch*, or just do it manually: diff --git a/example_workflows/join_and_split.jpg b/example_workflows/join_and_split.jpg new file mode 100644 index 0000000000000000000000000000000000000000..709c17616b39f52cbf5888f62663393460674001 GIT binary patch literal 10713 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 b!