:sound: Play and Record Sound with Python :snake:

Overview
Comments
  • adds error codes to PortAudioErrors and a new HostAPIError type

    adds error codes to PortAudioErrors and a new HostAPIError type

    Attach portaudio error codes to portaudio errors to allow for better error handling. This would allow users to handle specific portaudio and host api error codes. The _check function was also updated to use these new exceptions. The from_errno and from_errinfo are a convenience that I thought might make it easier for users to raise an exception with a default message. Hopefully this doesn't add too much complexity to the code.

    opened by tgarc 39
  • Core Audio for interfaces with large #'s of channels

    Core Audio for interfaces with large #'s of channels

    These 3 commits access PA's Core Audio API from pa_mac_core.h, and provide a "get_channel_name" function for querying names of individual device channels along with MacCoreSettings (for use with extra_settings) to expose additional Core Audio capabilities. (See doc string in MacCoreSettings.)

    My specific need for these extensions is that I have an RME Fireface UFX+ with a large number of input & output channels, and I didn't want to have to open many channels when only a couple are required. The get_channel_name function lets me display obtain a set of user-friendly channel names from the underlying device driver (via PortAudio), which I may display to the operator / user.

    I'm open for input to help get these changes incorporated into python-sounddevice.

    Thank you, David

    opened by dholl 24
  • ModuleNotFoundError: No module named '_sounddevice_data'

    ModuleNotFoundError: No module named '_sounddevice_data'

    Hi, I'm very new to Python and Spyder. I'm getting this on the Spyder console, seems related to #110 but I'm not sure what to make of it.

    import sounddevice as sd Traceback (most recent call last):

    File "", line 1, in import sounddevice as sd

    File "C:\Users\James\Anaconda3\lib\site-packages\sounddevice.py", line 73, in import _sounddevice_data

    ModuleNotFoundError: No module named '_sounddevice_data'

    opened by sprocket1 23
  • Sounddevice records too much noise

    Sounddevice records too much noise

    Hello, I'm trying to record audio with sounddevice library (latest version) on RaspberryPi 3 model B v1.2 with raspbian installed and updated. I'm using usb sound card for microphone input. Here is the simple script for recording: sound.zip

    My problem is that sounddevice records so much noise, that it hurts my ears when I listen to the recorded file. Sometimes after fresh RPi boot, the first recording works ok, but when I try to record second time, then it records the noise. Other times (most of the time), it records the noise even after fresh boot.

    I don't think its because of the usb sound card, because the script I'm using works ok with that card on my desktop pc (arch linux) and with the same version of the sounddevice.

    I've tired recording with arecord program, which uses alsa and it works ok every time and I've also tried recording with audacity, which uses portaudio library and it also works ok. Do you have any idea why is this happening?

    Thanks

    opened by ghost 21
  • Sounddevice doesn't play if a program that uses sound is opened.

    Sounddevice doesn't play if a program that uses sound is opened.

    Hello

    I am on Arch Linux and I started using SD today. My initial tests worked just fine. But when I opened another application like Spotify that play music (It is just opened but it doesn't play anything) and then tried to play a sound, it doesn't work anymore. Even if I closed Spotify it won't work till I restart my PC.

    Devices are listed normally and it doesn't return any errors. Is this a normal behaviour or is it a bug?

    And just a small question, Can I play during the playing of another sound? For instance, if a sound's duration is 1s, can I play the sound then after 0.5s play it again without the second sound killing the first sound (I want them to play at the same time).

    Thanks.

    opened by OmarEmaraDev 19
  • ogg files arent played on Ubuntu 16.04 but on RaspberryPi with Jessie

    ogg files arent played on Ubuntu 16.04 but on RaspberryPi with Jessie

    Hi, i have a strange problem, but i cant see how to come closer to the cause.

    I use two (software) systems: yours and pydub see: https://github.com/jiaaro/pydub And i have two hardware systems: one is Ubuntu 16.04 and the other a Jessie for RaspPi(3).

    If i let sounddevice play a ogg fiel on Rasp, it works. But it fails on ubuntu (i hear noise). If i do the same with pydub no problem with Ubuntu and on RaspPi , its in worse quality (not useful, but i can guess the voice file - whereas on first, its just noise).

    Jürgen

    opened by LocutusOfPenguin 19
  • python 2.7: query_devices() fails with non ASCII characters

    python 2.7: query_devices() fails with non ASCII characters

    On a german Windows 7 machine with sounddevice 0.3.3, I get a traceback (see below) when I call:

    python -m sounddevice

    The reason seems to be that a german Windows version has non ASCII characters in the device name. (e.g.: 'Primärer Soundaufnahmetreiber').

    Possible Solution:

    Line 1806: Change name=info['name'], To: name=repr(info['name']),

    Traceback (most recent call last):
      File "C:\Python27\lib\runpy.py", line 162, in _run_module_as_main
        "__main__", fname, loader, pkg_name)
      File "C:\Python27\lib\runpy.py", line 72, in _run_code
        exec code in run_globals
      File "C:\Python27\lib\site-packages\sounddevice.py", line 2536, in <module>
        print(query_devices())
      File "C:\Python27\lib\site-packages\sounddevice.py", line 1810, in __repr__
        for idx, info in enumerate(self))
      File "C:\Python27\lib\site-packages\sounddevice.py", line 1810, in <genexpr>
        for idx, info in enumerate(self))
    UnicodeEncodeError: 'ascii' codec can't encode character u'\ufffd' in position 18: ordinal not in range(128)
    
    bug 
    opened by raecke 19
  • Clarify exception for samplerate mismatch with WASAPI shared mode

    Clarify exception for samplerate mismatch with WASAPI shared mode

    When using WASAPI shared mode in Windows, it is necessary to match the samplerate in sounddevice and Control Panel > Sound > device > Properties > Advanced tab > Default Format. In sounddevice v0.3.5, a samplerate mismatch throws an exception "sounddevice.PortAudioError: Error opening RawOutputStream: Invalid device". I propose to instead detect the mismatch to the device default samplerate and clarify the exception message. This will better help users understand and fix this type of problem. Often, they will want to change the Windows setting.

    opened by hiccup7 18
  • Thoughts on an asyncio interface to sounddevice

    Thoughts on an asyncio interface to sounddevice

    python-sounddevice already has a nice callback interface. Do you think it would be possible to add a module within sounddevice that exposes an asyncio interface for it? This would let you do things like:

    import sounddevice._async as sd
    
    async def some_coroutine():
        async for chunk in sd.Stream(channels=2):
            # Process chunk, but let Python do things while waiting for the next chunk
    

    I'd be happy to implement this if there's any interest. If not I'll write a separate async wrapper module that imports python-sounddevice. Let me know!

    opened by multimeric 17
  • query_devices() name decoding problem (MME, DirectSound)

    query_devices() name decoding problem (MME, DirectSound)

    query_devices() crashes:

        File "C:\Program Files\Anaconda3\lib\site-packages\sounddevice.py", line 712, in query_devices
        _lib.Pa_HostApiTypeIdToHostApiIndex(_lib.paMME)) else 'utf-8'),
       UnicodeDecodeError: 'mbcs' codec can't decode bytes in position 0--1: No mapping for the Unicode   character exists in the target code page.
    

    Changing the "mbcs" at line 710 to "utf-8" fixed the problem in my environment.

    OS: Windows 7 SP1 and Windows 10 (Japanese) Python 3.5 sounddevice ver 0.3.6 (wheel from http://www.lfd.uci.edu/~gohlke/pythonlibs/)

    opened by Takashi-T 17
  • Simplify deriving from _StreamBase

    Simplify deriving from _StreamBase

    People who want to create their own callback-based stream classes can directly inherit from _StreamBase, avoiding the unnecessary (and non-functional) read() and write() methods.

    Also, if desired, they can quite easily implement a single stream class that (based on constructor arguments) supports only inputs, only outputs, or both inputs and outputs.

    opened by mgeier 16
  • Running rec_unlimited.py within other Python code

    Running rec_unlimited.py within other Python code

    I am trying to write/use your code to make a recording that terminates when either 1) there is a keyboard press, or 2) there is a (configurable) number of seconds that have passed without any speech.

    Normally when I want to run one python file within another, I will use the subprocess function. But when I try to use subprocess to run rec_unlimited.py, I can't use KeyboardInterrupt to stop the recording b/c it will simply stop the subprocess rather than the recording.

    Does this make sense? Sorry I am a psychologist - not a computer scientist. Do you have any suggestions or resources you can point me towards to get what I described in the first paragraph?

    Thanks :)

    opened by bwinsto2 1
  • python3 -m sounddevice not listing pcms

    python3 -m sounddevice not listing pcms

    Is there a method to list asound.conf pcms?

    pcm.donglein {
        type=plug
        slave = {
        pcm "plughw:3,0"
        channels 1
        rate 4800}
    }
    

    It will list everything else but the pcm I want to use (rate change)

    (venv) [email protected]:~/g-kws$ python3 -m sounddevice --help
       0 Loopback: PCM (hw:0,0), ALSA (32 in, 32 out)
       1 Loopback: PCM (hw:0,1), ALSA (32 in, 32 out)
       2 HDA Intel PCH: ALC221 Analog (hw:1,0), ALSA (2 in, 2 out)
       3 HDA Intel PCH: ALC221 Alt Analog (hw:1,2), ALSA (2 in, 0 out)
       4 HDA NVidia: HDMI 0 (hw:2,3), ALSA (0 in, 8 out)
       5 HDA NVidia: HDMI 1 (hw:2,7), ALSA (0 in, 2 out)
       6 HDA NVidia: HDMI 2 (hw:2,8), ALSA (0 in, 8 out)
       7 HDA NVidia: HDMI 3 (hw:2,9), ALSA (0 in, 8 out)
       8 HDA NVidia: HDMI 4 (hw:2,10), ALSA (0 in, 8 out)
       9 HDA NVidia: HDMI 5 (hw:2,11), ALSA (0 in, 8 out)
      10 HDA NVidia: HDMI 6 (hw:2,12), ALSA (0 in, 8 out)
      11 VIA USB Dongle: Audio (hw:3,0), ALSA (2 in, 2 out)
      12 USB Audio Device: - (hw:4,0), ALSA (1 in, 2 out)
      13 sysdefault, ALSA (128 in, 128 out)
      14 front, ALSA (0 in, 32 out)
      15 surround21, ALSA (32 in, 32 out)
      16 surround40, ALSA (0 in, 32 out)
      17 surround41, ALSA (0 in, 32 out)
      18 surround50, ALSA (0 in, 32 out)
      19 surround51, ALSA (0 in, 32 out)
      20 surround71, ALSA (0 in, 32 out)
      21 lavrate, ALSA (128 in, 128 out)
      22 samplerate, ALSA (128 in, 128 out)
      23 speexrate, ALSA (128 in, 128 out)
      24 pulse, ALSA (32 in, 32 out)
      25 speex, ALSA (1 in, 1 out)
      26 upmix, ALSA (8 in, 8 out)
      27 vdownmix, ALSA (6 in, 6 out)
      28 pipewire, ALSA (64 in, 64 out)
      29 dmix, ALSA (0 in, 2 out)
    * 30 default, ALSA (32 in, 32 out)
    

    Maybe it has something to do with Pulseaudio or there is a limit on devices returned?

    Just tried a lite version on a pi3 that doesn't have pulseaudio running

    * 0 VIA USB Dongle: Audio (hw:1,0), ALSA (2 in, 2 out)
      1 ladspa, ALSA (128 in, 128 out)
      2 deepfilter, ALSA (128 in, 128 out)
      3 donglein, ALSA (128 in, 128 out)
    

    All those are alsa pcms that just don't show on my x86 machine with pulseaudio / desktop install, but list fine on the pi

    opened by StuartIanNaylor 2
  • C++ Compiled Application Data Queue Empty?

    C++ Compiled Application Data Queue Empty?

    Hi,

    I can run the python code directly no problem from python. C++ compiled code run from Terminal (macos) Unix file also works. I am having some trouble when double clicking the package created by cmake for sounddevice to receive data.

            q = queue.Queue()
            def callback(indata, frames, time, status):
                q.put(bytes(indata))
            if args.samplerate is None:
                device_info = sd.query_devices(args.device, 'input')
                args.samplerate = int(device_info['default_samplerate'])
            with sd.RawInputStream(samplerate=args.samplerate, blocksize = 8000, device=args.device, dtype='int16',
                                        channels=1, callback=callback):
             ....
    

    In c++ code:

        Py_Initialize();
        fp = _Py_wfopen("test.py", L"r");
        PyRun_SimpleFile(fp, "test.py");
        Py_Finalize();
    

    Where test.py is the working python code. Compiled everything runs fine when running the file from terminal but when compiled into a "dragndrop" from cmake it can get the device information (and sample rate) but it gets no data in the "q" variable.

    Any ideas what I might be missing?

    Thanks!

    opened by msj121 1
  • Redirect stderr with os.dup2() instead of CFFI calls

    Redirect stderr with os.dup2() instead of CFFI calls

    I'm not quite sure yet if we should do this, this has to be tested thoroughly.

    With a bit of luck, this might fix #90.

    However, it might also have bad side effects ...

    opened by mgeier 1
  • fail to load asio driver with a thread

    fail to load asio driver with a thread

    I want to use a pyqt5 GUI to playback a sound with a soundcard. The index of my asio Fireface USB is 66.

    import sounddevice as sd
    data, fs = sf.read(....)
    asio_out = sd.AsioSettings(channel_selectors=[1, 2, 3, 4, 5,6,7,8])
    sd.default.extra_settings = None,asio_out
    sd.default.device[1] = 66
    # mapping from 1 to 8
    sd.play(data, samplerate=fs,mapping=[1])
    sd.wait()
    

    its work.so i try to use this function within a pyqt5 GUI and create a thread to control.

    
    class New_thread(Qthread):
         def __init__(self,wave_dir,flag):
               super(New_thread,self).__init__()
               self.flag = flag
               self.wave_dir = wave_dir
         def run(self):
               if self.flag:
                     # run 
                     data,fs = soundfile.read(self.weave_dir)
                     asio_out = sd.AsioSetting(channel_selections = [1,2,3,4,5,6,7,8])
                     sd.default.extra_setting = None,asio_out
                     sd.default.device[1] = 66
                     sd.play(data, samplerate=fs,mapping=[1])
                     sd.wait()
               else:
                     # create new thread to stop playing back
                     data = np.empty((1000))
                     sd.default.device[1] = 66
                     sd.play(data, samplerate=48000,mapping=[1])
                     sd.stop()
    

    but its fail.

    Traceback (most recent call last):
      File ".\GUI_FOR_LISTENING_TEST.py", line 64, in run
        sd.play(data, samplerate=fs,mapping=[1])
      File "D:\Users\Administrator\miniconda3\envs\listening3.8\lib\site-packages\sounddevice.py", line 175, in play
        ctx.start_stream(OutputStream, samplerate, ctx.output_channels,
      File "D:\Users\Administrator\miniconda3\envs\listening3.8\lib\site-packages\sounddevice.py", line 2582, in start_stream
        self.stream = StreamClass(samplerate=samplerate,
      File "D:\Users\Administrator\miniconda3\envs\listening3.8\lib\site-packages\sounddevice.py", line 1494, in __init__
        _StreamBase.__init__(self, kind='output', wrap_callback='array',
      File "D:\Users\Administrator\miniconda3\envs\listening3.8\lib\site-packages\sounddevice.py", line 898, in __init__
        _check(_lib.Pa_OpenStream(self._ptr, iparameters, oparameters,
      File "D:\Users\Administrator\miniconda3\envs\listening3.8\lib\site-packages\sounddevice.py", line 2745, in _check
        raise PortAudioError(errormsg, err, hosterror_info)
    sounddevice.PortAudioError: Error opening OutputStream: Unanticipated host error [PaErrorCode -9999]: 'Failed to load ASIO driver' [ASIO error 0]
    

    how can we fix it,thanks a lot.

    soundcare info:Fireface UFX, connected with 8 loudspeakers 0fb2f1d303bbc74500cd3a8b0a0e419 3 2

    opened by SoulProficiency 1
  • how to playback audios with 4 loudspeakers by useing “sounddevic.play()”?

    how to playback audios with 4 loudspeakers by useing “sounddevic.play()”?

    good day,my bro! i just want to playback some audios and meet some probles,to be specific,could you tell us the usage of sounddevic.play(,,mapping=), especially the "mapping=". thanks a lot!

    opened by SoulProficiency 1
Releases(0.4.5)
  • 0.4.5(Aug 21, 2022)

    https://pypi.org/project/sounddevice/0.4.5/

    • Add index field to device dict
    • Require Python >= 3.7
    • Add PaWasapi_IsLoopback() to cdef (high-level interface not yet available)
    Source code(tar.gz)
    Source code(zip)
  • 0.4.4(Dec 31, 2021)

  • 0.4.3(Oct 20, 2021)

    https://pypi.org/project/sounddevice/0.4.3/

    • Fix dimension check in Stream.write()
    • Provide "universal" (x86_64 and arm64) .dylib for macOS
    Source code(tar.gz)
    Source code(zip)
  • 0.4.2(Jul 18, 2021)

  • 0.4.1(Sep 26, 2020)

  • 0.4.0(Jul 18, 2020)

    https://pypi.org/project/sounddevice/0.4.0/

    • Drop support for Python 2.x
    • Fix memory issues in play(), rec() and playrec()
    • Example application play_stream.py
    Source code(tar.gz)
    Source code(zip)
  • 0.3.15(Mar 18, 2020)

  • 0.3.14(Sep 25, 2019)

  • 0.3.13(Feb 27, 2019)

  • 0.3.12(Sep 2, 2018)

  • 0.3.11(May 7, 2018)

  • 0.3.10(Dec 22, 2017)

  • 0.3.9(Oct 25, 2017)

  • 0.3.8(Jul 11, 2017)

    https://pypi.python.org/pypi/sounddevice/0.3.8

    • Add more ignore_errors arguments
    • Add sounddevice.PortAudioError.args
    • Add sounddevice.CoreAudioSettings
    Source code(tar.gz)
    Source code(zip)
  • 0.3.7(Feb 16, 2017)

  • 0.3.6(Dec 19, 2016)

  • 0.3.5(Sep 12, 2016)

    https://pypi.python.org/pypi/sounddevice/0.3.5

    • Add extra_settings option for host-API-specific stream settings
    • Add sounddevice.AsioSettings and sounddevice.WasapiSettings
    Source code(tar.gz)
    Source code(zip)
  • 0.3.4(Aug 5, 2016)

  • 0.3.3(Apr 11, 2016)

  • 0.3.2(Mar 16, 2016)

    https://pypi.python.org/pypi/sounddevice/0.3.2

    • mapping=[1] works now on all host APIs
    • Example application plot_input.py showing the live microphone signal(s)
    • Device substrings are now allowed in sounddevice.query_devices()
    Source code(tar.gz)
    Source code(zip)
  • 0.3.1(Jan 4, 2016)

    https://pypi.python.org/pypi/sounddevice/0.3.1

    • Add sounddevice.check_input_settings() and sounddevice.check_output_settings()
    • Send PortAudio output to /dev/null (on Linux and OSX)
    Source code(tar.gz)
    Source code(zip)
  • 0.3.0(Oct 28, 2015)

    https://pypi.python.org/pypi/sounddevice/0.3.0

    • Remove sounddevice.print_devices(), sounddevice.query_devices() can be used instead, since it now returns a sounddevice.DeviceList object.
    Source code(tar.gz)
    Source code(zip)
  • 0.2.2(Oct 21, 2015)

  • 0.2.1(Oct 12, 2015)

    https://pypi.python.org/pypi/sounddevice/0.2.1

    • Example applications wire.py (based on PortAudio's patest_wire.c) and spectrogram.py (based on code by Mauris Van Hauwe)
    Source code(tar.gz)
    Source code(zip)
  • 0.2.0(Jul 3, 2015)

    https://pypi.python.org/pypi/sounddevice/0.2.0

    • support for wheels including a dylib for Mac OS X and DLLs for Windows. The code for creating the wheels is largely taken from PySoundFile.
    • remove logging (this seemed too intrusive)
    • return callback status from sounddevice.wait() and add the new function sounddevice.get_status()
    • sounddevice.playrec(): Rename the arguments input_channels and input_dtype to channels and dtype, respectively
    Source code(tar.gz)
    Source code(zip)
  • 0.1.0(Jun 20, 2015)

    https://pypi.python.org/pypi/sounddevice/0.1.0

    Initial release.

    Some ideas are taken from PySoundCard. Thanks to Bastian Bechtold for many fruitful discussions during the development of several features which python-sounddevice inherited from there.

    Source code(tar.gz)
    Source code(zip)
Algorithmic Multi-Instrumental MIDI Continuation Implementation

Matchmaker Algorithmic Multi-Instrumental MIDI Continuation Implementation Taming large-scale MIDI datasets with algorithms This is a WIP so please ch

Alex 2 Mar 11, 2022
Inner ear models for Python

cochlea cochlea is a collection of inner ear models. All models are easily accessible as Python functions. They take sound signal as input and return

98 Jan 05, 2023
Praat in Python, the Pythonic way

Parselmouth - Praat in Python, the Pythonic way Parselmouth is a Python library for the Praat software. Though other attempts have been made at portin

Yannick Jadoul 786 Jan 09, 2023
Python module for handling audio metadata

Mutagen is a Python module to handle audio metadata. It supports ASF, FLAC, MP4, Monkey's Audio, MP3, Musepack, Ogg Opus, Ogg FLAC, Ogg Speex, Ogg The

Quod Libet 1.1k Dec 31, 2022
A simple python script to play bell sound in your system infinitely, just for fun and experimental purposes

A simple python script to play bell sound in your system infinitely, just for fun and experimental purposes

نافع الهلالي 1 Oct 29, 2021
IDing the songs played on the do you radio show

IDing the songs played on the do you radio show

Rasmus Jones 36 Nov 15, 2022
NovaMusic is a music sharing robot. Users can get music and music lyrics using inline queries.

A music sharing telegram robot using Redis database and Telebot python library using Redis database.

Hesam Norin 7 Oct 21, 2022
OpenClubhouse - A third-part web application based on flask to play Clubhouse audio.

OpenClubhouse - A third-part web application based on flask to play Clubhouse audio.

1.1k Jan 05, 2023
Codes for "Efficient Long-Range Attention Network for Image Super-resolution"

ELAN Codes for "Efficient Long-Range Attention Network for Image Super-resolution", arxiv link. Dependencies & Installation Please refer to the follow

xindong zhang 124 Dec 22, 2022
Simple discord bot by @merive 🤖

Parzibot Powerful and Useful Discord Bot on Python. The source code of the bot is available to everyone. Parzibot uses English language. This is free

merive_ 3 Dec 28, 2022
Guide & Examples to create deeplearning gstreamer plugins and use them in your pipeline

upai-gst-dl-plugins Guide & Examples to create deeplearning gstreamer plugins and use them in your pipeline Introduction Thanks to the work done by @j

UPAI.IO 11 Dec 11, 2022
:speech_balloon: SpeechPy - A Library for Speech Processing and Recognition: http://speechpy.readthedocs.io/en/latest/

SpeechPy Official Project Documentation Table of Contents Documentation Which Python versions are supported Citation How to Install? Local Installatio

Amirsina Torfi 870 Dec 27, 2022
Powerful, simple, audio tag editor for GNU/Linux

puddletag puddletag is an audio tag editor (primarily created) for GNU/Linux similar to the Windows program, Mp3tag. Unlike most taggers for GNU/Linux

341 Dec 26, 2022
Mousai is a simple application that can identify song like Shazam

Mousai is a simple application that can identify song like Shazam. It saves the artist, album, and title of the identified song in a JSON file.

Dave Patrick 662 Jan 07, 2023
Cobra is a highly-accurate and lightweight voice activity detection (VAD) engine.

On-device voice activity detection (VAD) powered by deep learning.

Picovoice 88 Dec 16, 2022
An app made in Python using the PyTube and Tkinter libraries to download videos and MP3 audio.

yt-dl (GUI Edition) An app made in Python using the PyTube and Tkinter libraries to download videos and MP3 audio. How do I download this? Windows: Fi

1 Oct 23, 2021
Analysis of voices based on the Mel-frequency band

Speaker_partition_module Analysis of voices based on the Mel-frequency band. Goal: Identification of voices speaking (diarization) and calculation of

1 Feb 06, 2022
Terminal-based audio-to-text converter

att Terminal-based audio-to-text converter Project description A terminal-based audio-to-text converter written in python, enabling you to convert .wa

Sven Eschlbeck 4 Dec 15, 2022
music library manager and MusicBrainz tagger

beets Beets is the media library management system for obsessive music geeks. The purpose of beets is to get your music collection right once and for

beetbox 11.3k Dec 31, 2022
praudio provides audio preprocessing framework for Deep Learning audio applications

praudio provides objects and a script for performing complex preprocessing operations on entire audio datasets with one command.

Valerio Velardo 105 Dec 26, 2022