[ecasound] Completion for ecasound via Zsh

New Message Reply Date view Thread view Subject view Author view Other groups

Subject: [ecasound] Completion for ecasound via Zsh
From: Mario Lang (mlang@home.delysid.org)
Date: Mon Mar 26 2001 - 15:48:02 EEST


Hi Guys.

I recently switched shell to zsh, and had a serious
look at the completion system. I can tell you,
it is a hit, and bash has some years to go to
actually reach the level of customisability of Zsh.

What follows is the completion code for ecasound
I managed to write till now. Just in advance,
there are many things to do left, and I am
open to suggestions!

Quick install:
You need Zsh >3.1.6 (take the latest beta release),
the new completion system of zsh needs to get
initialized, so do something like:
autoload -U compinstall
compinstall

you will get a menu with some options to customize.

Afterwards, compinstall has written some
definitions to ~/.zshrc.

YOu need to create your own function directory
now, such as
mkdir ~/.zshfns

place the script below named _ecasound
in there and add the following line to the beginning
of your .zshrc (actually, before the compinit call):
fpath=(~/.zshfns $fpath)

now ecasound completion should work.
Do
ecasound -<TAB>
and hit tab over and over again, and be amazed :-).

This type of building command-lines for ecasound
could actually make you switch shell :-).

So, here we go. And remember, I am constantly doing
improvments, so send me any suggestions, but contact
me before you start doing work on your own.

Note that the following goes into a file _ecasound
and that #compdef ecasound has to be the first
line of the file.

#compdef ecasound

# Completion definition for ecasound under Zsh >3.1.6.
#
# by Mario Lang <mlang@delysid.org>.
#
# Please send me any improvments you make as diff
# file to the above e-mail.
#
#
# This file should be named _ecasound and placed in one of the
# fpath directories.
#
# TODO (top most = most important):
# * Implement controllers:
# Actually, it would be nice to have fx-params complete with description.
# Which means -ef1:100,50 -kl:<TAB> should show
# completing resonant bandpass filter parameters
# 1 -- center frequency
# 2 -- width (Hz)
#
# The whole parameter description mechanism (case $state in below) should
# be changed into some array which can be used for lookup.
# * Generalize the option definitons when
# doing todo-list-item above so that completion can be used
# for all eca tools (ecasignalview, ...)
# * Introduce grouping of the different option types (hmm, I once knew how this worked...)
# * Fix sort order of power-of-two completions (e.g. -b:<TAB> or -z:db,<TAB>)
# * Fix TAB behaviour with -z:db
# (db gets listed without a comma,
# this is absolutely in contrast to the rest of all
# options (e.g. -z: which indicates that there has to
# be something after -z)
# * finish io) which isnt quite correct at the time about file extensions
# * Make the awk stuff in i/o completion nicer
# * LADSPA completion (perhaps even with arguemtns from the xml desc?)
#
#

local context state line
local expl
typeset -A opt_args

_arguments \
  '-c[Start in interactive mode]' \
  '-d\:-[Debug level]:debug level' \
  '-D[Print all debug information to stderr]' \
  '-q[Quiet mode, no output]' \
  '--help[Show help]' \
  '--version[Show version information]' \
  '-n\:-[Set the name of chainsetup]:chainsetup name' \
  '-s\:-[Create a new chainsetup from file]:chainsetup file:_files' \
  '-sr\:-[Set internal sampling rate]:Internal sampling rate:(8000 11025 22050 44100 48000)' \
  '*-a\:-[Select active signal chains]:chain name' \
  '-b\:-[Sets the size of buffer in samples]:buffer size:(1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536)' \
  '-m\:-[Force use of specified mix mode]:Mix mode:((auto\:Automatic simple\:Only\ one\ input/cain/output normal\:Normal\ single-threaded\ mode))' \
  '-r[Use realtime scheduling policy (SCHED_FIFO)]' \
  '-r\:-[Use realtime scheduling policy (SCHED_FIFO)]:sched_priority' \
  '-x[Truncate outputs]' \
  '*-z\:-[Enable feature]:feature:->z' \
  '-t\:-[Set processing time in seconds]:seconds (int/float)' \
  '-tl[Enable looping]' \
  '*-f\:-[Set sampling parameters for the following input/output files]: :->f' \
  '*-y\:-[Set starting position for last specified input/output]:seconds' \
  '*-i\:-[Specifies a new input source]:input source:->io' \
  '*-o\:-[Specifies a new output source]:output source:->io' \
  '*-Md\:-[Set the active MIDI-device]:device name:_files' \
  '*-Mms\:-[Send MMC start/stop to MIDI device-id]:device id' \
  '*-mss[Sends MIDI-sync to the selected MIDI-device]' \
  '*-pf\:-[Use the first preset found from file as chain operator]:preset file:_files -g *.epp' \
  '*-pn\:-[Find preset from global preset database]:preset name:->pn' \
  '*-ev[Analyze sample data to find max apm value without clipping]' \
  '*-ezf[Find the optimal value for DC-adjusting]' \
  '*-eS\:-[Audio stamp]:stamp-id (int)' \
  '*-ea\:-[Amplify signal]:amplification value (percent)' \
  '*-eac\:-[Amplify signal of channel]: :->eac' \
  '*-eaw\:-[Amplify singal (clipping)]: :->eaw' \
  '*-eal\:-[Limits audio level]:limit (percent)' \
  '*-ec\:-[Compressor (a simple one)]: :->ec' \
  '*-eca\:-[A more advanced compressor]: :->eca' \
  '*-enm\:-[Noise gate. (each channel is processes separately)]: :-enm' \
  '*-ei\:-[Pitch shifter (modifies audio pitch by altering its length)]:pitch-shift (percent)' \
  '*-epp\:-[Normal pan effect]:panning (0=left, 50=center, 100=right)' \
  '*-ezx\:-[Adjusts the signal DC (use -ezf to find optimal values)]: :-ezx' \
  '*-eemb\:-[Pulse gate]: :-eemb' \
  '*-eemp\:-[Pulse gate (hz)]: :->eemp' \
  '*-eemt\:-[Tremolo effect]: :->eemt' \
  '*-ef1\:-[Resonant bandpass filter]: :->ef1' \
  '*-ef3\:-[Resonant lowpass filter]: :->ef3' \
  '*-ef4\:-[Resonant lowpass filter (3rd-order, 36dB)]: :->ef4' \
  '*-efa\:-[Allpass filter]: :->efa' \
  '*-efc\:-[Comb filter]: :->efc' \
  '*-efb\:-[Bandpass filter]: :->efb' \
  '*-efh\:-[Highpass filter]:cutoff frequency' \
  '*-efi\:-[Inverse comb filter]: :->efi' \
  '*-efl\:-[Lowpass filter]:cutoff frequency' \
  '*-efr\:-[Bandreject filter]: :->efr' \
  '*-efs\:-[Resonator (resonating bandpass filter)]: :->efs' \
  '*-erc\:-[Copy channel]: :->erc' \
  '*-erm\:-[Mix all channels to one channel]:to channel' \
  '*-etc\:-[Chorus]: :->etc' \
  '*-etd\:-[Delay effect]: :->etd' \
  '*-ete\:-[A more advanced reverb effect]: :-ete' \
  '*-etf\:-[Fake-stereo effect]:delay time (msec)' \
  '*-etl\:-[Flanger]: :->etl' \
  '*-etm\:-[Multitap delay]: :->etm' \
  '*-etp\:-[Phaser]: :->etp' \
  '*-etr\:-[Reverb effect]: :->etr' \
  '*-el\:-[LADSPA Plugin]: :->el' \
  '*-eli\:-[LADSPA Plugin]: :->el' \
  '*-gc\:-[Time crop gate]: :->gc' \
  '*-ge\:-[Threshold gate]: :->ge' \
  && return 0

case $state in
f)
  if compset -P '*,*,*,'; then
    _values 'interleaving' \
            'i[interleaved stream format]' \
            'n[noninterleaved]'
  elif compset -P '*,*,'; then
    _message 'sampling rate'
  elif compset -P '*,'; then
    _message 'channels'
  else
    _values 'Sampling parameters' \
            'u8[unsigned 8-bit]' \
            's16_le[signed 16-bit little endian]' \
            's16_be[signed 16-bit big endian]' \
            's24_le[signed 24-bit little endian]' \
            's24_be[signed 24-bit big endian]' \
            's32_le[signed 32-bit little endian]' \
            's32_be[signed 32-bit big endian]' \
            'f32_le[32-bit float (little endian)]' \
            'f32_be[32-bit float (big endian)]'
  fi
  ;;
z)
  if compset -P 'db,'; then
    _values 'buffer size in sample frames' \
            '0[default]' '1' '2' '4' '8' '16' #??? Kai?
  else
       db=('db:enable double-buffering')
    other=('nodb:disable double-buffering'
                 'nointbuf:prevents realtime device from doing extra internal buffering'
                 'xruns:processing will be halted when a under/overrun occurs'
                 'psr:enable the precise-sample-rates')
    _describe 'enable feature' \
       db -S ',' -- \
       other
  fi
  ;;
io)
  if compset -P 'alsa,'; then
    if [[ -e /proc/asound ]]; then
      eval `cat /proc/asound/cards|grep "^[[:digit:]]"|awk 'BEGIN {print "_values '\''ALSA device'\''" }; {print "'\''" $1 "[" $6, $7, $8, $9 "]'\''"}'||echo _message Wrong`
    else
      _message 'No ALSA information in proc filesystem'
    fi
  else
    _description files expl 'input/output files'
    _files "$expl[@]" -g '*.(aif|aiff|mid|wav|ewf|mp3|mp2)'
    _values 'streams' \
            'stdin' 'stdout'
    _values 'Realtime devices' \
            '/dev/dsp' \
            'alsa[ALSA device]' \
            'null[Null device]'
  fi
  ;;
pn)
  eval `cat /usr/share/ecasound/effect_presets|grep "^[[:alpha:]]"|awk 'BEGIN {print "_values '\''preset name'\'' "}; {print "'\''" $1 "'\''"}'`
  ;;
eac)
  if compset -P '*,'; then
    _message 'channel'
  else
    _message 'amplification value (percent)'
  fi
  ;;
eaw)
  if compset -P '*,*,'; then
    _message 'max-clipped-samples'
  elif compset -P '*,'; then
    _message 'channel'
  else
    _message 'amplification value (percent)'
  fi
  ;;
ec)
  if compset -P '*,'; then
    _message 'threshold (0.0-1.0)'
  else
    _message 'compression rate in decibels'
  fi
  ;;
eca)
  if compset -P '*,*,*,'; then
    _message 'compression rate'
  elif compset -P '*,*,'; then
    _message 'fast compression rate (0.0-1.0)'
  elif compset -P '*,'; then
    _message 'release-time (seconds)'
  else
    _message 'peak-level-%'
  fi
  ;;
enm)
  if compset -P '*,*,*,*,'; then
    _message 'release-time (msec)'
  elif compset -P '*,*,*,'; then
    _message 'post-hold-time (msec)'
  elif compset -P '*,*,'; then
    _message 'attack-time (msec)'
  elif compset -P '*,'; then
    _message 'pre-hold-time (msec)'
  else
    _message 'threshold-level-%'
  fi
  ;;
ezx)
  if compset -Q '*,'; then
    _message 'right CD fix value'
  else
    _message 'left DC fix value'
  fi
  ;;
eemb)
  if compset -P '*,'; then
    _message 'on time (msec)'
  else
    _message 'pulse frequency (beats per minute)'
  fi
  ;;
eemp)
  if compset -P '*,'; then
    _message 'on time (percent)'
  else
    _message 'pulse frequency (hz)'
  fi
  ;;
eemt)
  if compset -P '*,'; then
    _message 'depth (percent)'
  else
    _message 'tremolo speed (beats per second)'
  fi
  ;;
ef1)
  if compset -P '*,'; then
    _message 'width (Hz)'
  else
    _message 'center frequency'
  fi
  ;;
ef3)
  if compset -P '*,*,'; then
    _message 'gain'
  elif compset -P '*,'; then
    _message 'resonance'
  else
    _message 'cutoff frequency'
  fi
  ;;
ef4)
  if compset -P '*,'; then
    _message 'resonance'
  else
    _message 'cutoff'
  fi
  ;;
efa)
  if compset -P '*,'; then
    _message 'feedback (percent)'
  else
    _message 'delay (samples)'
  fi
  ;;
efc)
  if compset -P '*,'; then
    _message 'radius (0-1.0)'
  else
    _message 'delay (samples)'
  fi
  ;;
efb)
  if compset -P '*,'; then
    _message 'width (Hz)'
  else
    _message 'center frequency'
  fi
  ;;
efi)
  if compset -P '*,'; then
    _message 'radius (0-1.0)'
  else
    _message 'delay (samples)'
  fi
  ;;
efr)
  if compset -P '*,'; then
    _message 'width (Hz)'
  else
    _message 'center frequency'
  fi
  ;;
efs)
  if compset -P '*,'; then
    _message 'width (Hz)'
  else
    _message 'center frequency'
  fi
  ;;
erc)
  if compset -P '*,'; then
    _message 'to channel'
  else
    _message 'from channel'
  fi
  ;;
etc)
  if compset -Q '*,*,*,'; then
    _message 'lfo frequency'
  elif compset -P '*,*,'; then
    _message 'feedback (percent)'
  elif compset -P '*,'; then
    _message 'variance time (samples)'
  else
    _message 'delay time (msec)'
  fi
  ;;
etd)
  if compset -Q '*,*,*,'; then
    _message 'mix (wet) (percent)'
  elif compset -P '*,*,'; then
    _message 'number of delays'
  elif compset -P '*,'; then
    _values 'surround mode'
            '0[normal]'
            '1[surround]'
            '2[stereo-spread]'
  else
    _message 'delay time (msec)'
  fi
  ;;
ete)
  if compset -P '*,*,'; then
    _message 'the amount of reverbed signal added to the original (wet) (percent)'
  elif compset -P '*,'; then
    _message 'the feedback level given in percents'
  else
    _message 'room size given in meters'
  fi
  ;;
etl)
  if compset -Q '*,*,*,'; then
    _message 'lfo frequency'
  elif compset -P '*,*,'; then
    _message 'feedback (percent)'
  elif compset -P '*,'; then
    _message 'variance time (samples)'
  else
    _message 'delay time (msec)'
  fi
  ;;
etm)
  if compset -P '*,*,'; then
    _message 'mix (wet) (percents)'
  elif compset -P '*,'; then
    _message 'number of delays'
  else
    _message 'delay time (msec)'
  fi
  ;;
etp)
  if compset -Q '*,*,*,'; then
    _message 'lfo frequency'
  elif compset -P '*,*,'; then
    _message 'feedback (percent)'
  elif compset -P '*,'; then
    _message 'variance time (samples)'
  else
    _message 'delay time (msec)'
  fi
  ;;
etr)
  if compset '*,*,'; then
    _message 'feedback (percents)'
  elif compset -P '*,'; then
    _message 'surround mode'
    # We could do nice _values here, but the docu (manpage) is very unclear about
    # what one can put here
  else
    _message 'delay time (msec)'
  fi
  ;;
el)
  _message 'unique LADSPA name/number'
  # Actually this part could be full of magic.
  # * Determine LADSPA Plugin path from ecasoundrc
  # * Use some way to extract a LADSPA name/number list with descriptions.
  # * Perhaps even build up parameter descriptions
  ;;
gc)
  if compset -P '*,'; then
    _message 'length how long gate remains open'
  else
    _message 'start time'
  fi
  ;;
gc)
  if compset -P '*,*,'; then
    _values 'volume mode'
            'rms'
  elif compset -P '*,'; then
    _message 'close threshold (percents)'
  else
    _message 'open threshold (percents)'
  fi
  ;;
esac
  

-- 
CYa,
   Mario <mlang@delysid.org>
Homepage(s): http://delysid.org | http://piss.at/

Absolutely nothing should be concluded from these figures except that no conclusion can be drawn from them. -- Joseph L. Brothers, Linux/PowerPC Project)

-- To unsubscribe send message 'unsubscribe' in the body of the message to <ecasound-list-request@wakkanet.fi>.


New Message Reply Date view Thread view Subject view Author view Other groups

This archive was generated by hypermail 2b28 : Mon Mar 26 2001 - 15:56:08 EEST