//
//      Help text
//
//        Copyright (c) 2002-2003 Jim Peters <http://uazu.net/>.
//        Released under the GNU GPL version 2 as published by the
//        Free Software Foundation.  See the file COPYING for details,
//        or visit <http://www.gnu.org/copyleft/gpl.html>.
//

extern char *helptext_src;

//
//	Generate full helptext.  Returns: StrDup'd string
//

#include "all.h"

char *
gen_helptext() {
   char *p, *q, *r;
   char list[8192];

   // Generate the list of filters
   if (!fid_list_filters_buf(list, list+sizeof(list)))
      error("gen_helptext() buffer too small for filter list");
   
   scr_zap();
   scr_wrap(78, "      ");
   p= helptext_src;
   while (*p) {
      if (p[0] == '#' && p[1] == '#' && p[2] == 'D') {
	 p += 3;
	 for (q= list; *q; ) {
	    for (r= q; *r && *r != '\n'; r++) ;
	    if (*r) *r++= 0;
	    scr_prw("%s\n", q);
	    q= r;
	 }
	 continue;
      }
      SCR_PUTC(*p++);
   }

   return scr_dup();
}

//
//	
//

#define NL "\n"

static char *helptext_src= 
NL "Welcome to Fiview, an FIR/IIR filter design, viewing and comparison tool"
NL "------------------------------------------------------------------------"
NL ""
NL "This is the help-text, which can be brought up at any point by"
NL "pressing 'h' or F1.  This is being viewed in the built-in pager, which"
NL "may be controlled using the following keys:"
NL ""
NL "  Up/Down arrow   Up or down a line at a time"
NL "  PageUp/PageDn   Up or down a page at a time"
NL "  BackSp/Space    Up or down a page at a time"
NL "  d               Down a half-page"
NL "  Return          Down a line"
NL ""
NL "This text can also be viewed using a command line pager, for example:"
NL ""
NL "  fiview -h | more"
NL ""
NL ""
NL "Legal stuff"
NL "-----------"
NL ""
NL "  Fiview: an FIR/IIR filter design, viewing and comparison tool:"
NL "  Copyright (c) 2002-2003 Jim Peters, <http://uazu.net/>, all rights"
NL "  reserved.  Released under the GNU General Public Licence version 2."
NL "  See the file COPYING for details, or visit <http://www.fsf.org>."
NL ""
NL "  The SDL library code is released under the GNU Lesser General Public"
NL "  Licence version 2 or later.  See file COPYING_LIB for details.  See"
NL "  <http://libsdl.org/> for more information about this project."
NL ""
NL "  Much of the filter design code was based on 'mkfilter' by Tony"
NL "  Fisher; see here: <http://www-users.cs.york.ac.uk/~fisher/>.  "
NL "  Dr Fisher died in February 2000 (see his site for a tribute), but"
NL "  confirmation that his code could be used was given by Anthony Moulds"
NL "  of the University of York.  See file 'fidlib/fidmkf.c'."
NL ""
NL "  \"This program is free software; you can redistribute it and/or "
NL "  modify it under the terms of the GNU General Public License "
NL "  version 2 as published by the Free Software Foundation.\""
NL ""
NL "  \"This program is distributed in the hope that it will be useful,"
NL "  but WITHOUT ANY WARRANTY; without even the implied warranty of"
NL "  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU"
NL "  General Public License for more details.\""
NL ""
NL "  \"You should have received a copy of the GNU General Public License"
NL "  along with this program; if not, write to the Free Software"
NL "  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307"
NL "  USA\""
NL ""
NL ""
NL "Keyboard and mouse control"
NL "--------------------------"
NL ""
NL "These keys apply at all times:"
NL ""
NL "  1-9         The digits switch between the different loaded filters"
NL "  Esc or q    Quit the program"
NL "  F1          Switch to this help display"
NL "  F2          Switch to the filter information display"
NL "  F3          Switch to the frequency response display"
NL "  F4          Switch to the time response display"
NL ""
NL "As you've probably noticed, the frequency and time responses are shown"
NL "constantly at the top of the screen in miniature.  The large area"
NL "where this text appears is the area in which the different displays"
NL "appear.  The filter information and help-text displays use the pager,"
NL "whose keys were listed above."
NL ""
NL "The frequency and time-response displays are controlled as follows:"
NL ""
NL "  Left/Right    Move the view left or right by 25% of the display width"
NL "  PageUp/PageDn Move the view left or right by 100% of the display width"
NL "  BackSp/Space  Move the view left or right by 100% of the display width"
NL "  Up            Zoom out"
NL "  Down          Zoom in"
NL "  a             Auto-adjust to the most interesting part of the response"
NL ""
NL "The shaded area in the miniature time or frequency display always"
NL "follows the movements in the main display, helping you keep track of"
NL "what you are looking at."
NL ""
NL "Note that the viewing window ranges stay the same as you switch"
NL "between different filters using the 1-9 keys.  This allows you to"
NL "compare the response in a critical area of two filters by simply"
NL "switching between them.  However, if they are different types of"
NL "filters, you'll probably want to press 'A' after switching to get the"
NL "interesting bit back into view."
NL ""
NL ""
NL "The frequency display"
NL "---------------------"
NL ""
NL "This shows the frequency response.  The mini display at the top shows"
NL "the range from 0.0 to 0.5 of the sampling rate.  However, the range"
NL "actually goes on beyond that (wrapping around, mirrored).  The main"
NL "display allows you to view slightly outside the 0.0 to 0.5 range to"
NL "make sense of the shape of some filter responses such as low-pass and"
NL "high-pass filters."
NL ""
NL "When the filter is first loaded it is scanned to find its major"
NL "features.  A guess is made to the type of the filter, and a certain"
NL "level is selected as representing the '100%' level for the filter."
NL "This needn't necessarily be the peak response -- for example, for a"
NL "low-pass filter, the response at 0Hz (DC) is taken to be the 100%"
NL "level, because there may be ripples away from 0Hz."
NL ""
NL "This is the meaning of the percentage values displayed as the mouse"
NL "moves over the display.  Also displayed are the frequency of that"
NL "pixel and the actual range of response values covered by that pixel."
NL ""
NL "The blue lines going across the display are the phase values.  Note"
NL "that when the response is very low (less than 1e-10 compared to the"
NL "100% level, for example), the calculated phase can become unreliable"
NL "due to the accuracy of 64-bit floating point calculation.  This should"
NL "help explain any 'noise' areas you see in the phase display.  This"
NL "noise also shows up as unexpected min/max points in the 'm' display"
NL "(see below)."
NL ""
NL "Note that the phase display depends on which point you measure from."
NL "For example, a low pass filter will often show very steep phase"
NL "changes in the passband.  However, if you take into account the delay"
NL "of the filter, these can be made to look flat, moving the steep phase"
NL "lines into the stopband."
NL ""
NL "If you press and hold the 'm' key, a number of rulers appear on the"
NL "display.  These show all the minima and maxima as calculated for the"
NL "current display, along with the -3.01dB/-6.02dB crossing points"
NL "(70.71%/50%).  The labels for each line are always attached to that"
NL "line somewhere, and response labels try to get as close to their"
NL "min/max as possible, but if there is reduced space, they might be"
NL "forced elsewhere on the display.  Zoom in if it is too confusing."
NL ""
NL "It is also possible to feed test signals to the filter using this"
NL "screen, to see how it responds.  For example, type 'ts1<Return>' to"
NL "test the filter with 1Hz/sec upwards-sweeping tones, or 'tw8<Return>'"
NL "to test it with 8-period wavelets.  Type 't<Return>' to exit testing"
NL "mode.  See the \"Filter testing mode\" section below for full details"
NL "of this."
NL ""
NL "Also log-scale views are possible by pressing the 'L' key and then a"
NL "digit to indicate the number of power-of-ten ranges to display, or "
NL "some other key to return to the normal linear display."
NL ""
NL "Summary of special frequency-display keys:"
NL ""
NL "  a     Auto-adjust to the most interesting part of the response"
NL "  m     Show rulers and min/max/-3.01dB/-6.02dB points"
NL "  t     Set a testing mode"
NL "  x     Expand the vertical range to take in any out-of-range values"
NL "  z     Zoom the vertical range to show low-response areas"
NL "  l     Change to/from log-scale view"
NL ""
NL ""
NL "The time-response display"
NL "-------------------------"
NL ""
NL "The time-response display shows which samples out of your data stream"
NL "will be taken into account by this particular filter.  Time zero is at"
NL "the right of the display, and earlier times come before."
NL ""
NL "This time-response is actually just the impulse response of the"
NL "filter reversed.  For an IIR filter, it is also the equivalent FIR"
NL "that could be used to emulate it."
NL ""
NL "When the filters are loaded, the number of data samples required for the"
NL "filter to calculate an accurate value are found (see the information"
NL "display for these details).  This information is also available when"
NL "moving the mouse over the display, along with the sample count, time and"
NL "response values."
NL ""
NL "It is useful to see how broad a chunk of data a particular filter works"
NL "on, as this will give you an idea of how much it will blur information"
NL "across time.  For example, filters with very sharp responses will"
NL "probably require a great deal of data, but that is not necessarily the"
NL "best option, because transient wave-streams might hardly show up with"
NL "such filters.  Comparing both frequency response and time-response"
NL "between different filters should help in judging the balance to make"
NL "between these factors for a particular application."
NL ""
NL "Summary of special time-display keys:"
NL ""
NL "  a     Auto-adjust to the most interesting part of the response"
NL "  z     Zoom in vertical scale to show any low-amplitude signals"
NL ""
NL ""
NL "Command-line invocation"
NL "-----------------------"
NL ""
NL "Type 'fiview' on its own to get a summary of current options (which"
NL "might include some not mentioned here).  Here are some example"
NL "command-lines:"
NL ""
NL "  fiview -i LpBe4/0.01"
NL ""
NL "This loads up a predefined filter type, a low-pass Bessel 4th order"
NL "filter, using a cut-off frequency of 0.01 times the sampling rate."
NL ""
NL "  fiview 200 -i LpBe4/2"
NL ""
NL "This loads up exactly the same filter, except in this case the"
NL "sampling rate of 200Hz is specified, and the cut-off is now given in"
NL "Hz (==2Hz).  The sampling rate is also used in the app to display"
NL "values in Hz."
NL ""
NL "  fiview 200 -i LpBe2/2, LpBe4/2, LpBe6/2, LpBe8/2"
NL ""
NL "This loads up a set of filters, which are mapped to the keys 1-4."
NL "Actually, this set of filters could be more efficiently written by"
NL "specifying the frequency using -f:"
NL ""
NL "  fiview 200 -f 2 -i LpBe2,LpBe4,LpBe6,LpBe8"
NL ""
NL "All of the filters above default to the given -f frequency of 2Hz as"
NL "no frequency is mentioned after them.  This also works for pre-defined"
NL "filters that require frequency ranges.  For example, the following two"
NL "commands are equivalent:"
NL ""
NL "  fiview 200 -i BpBe8/2-3"
NL "  fiview 200 -f 2-3 -i BpBe8"
NL ""
NL "You are not just limited to a single filter stage per display.  See"
NL "below (\"Format of filter specification files\") for more information"
NL "on this, but as an example this filter combines two band-stop filters"
NL "and a low-pass filter in one display:"
NL ""
NL "  fiview 200 -i LpBe4/20 x BsBu4/5-6 x BsBu4/9-10"
NL ""
NL "For comparing a number of filters of different types, the auto-adjust"
NL "option is useful.  This iteratively adjusts the filter half-power"
NL "points (-3.01dB or 70.71% response) to meet the frequency values you"
NL "specify, instead of using the estimates given by the filter design"
NL "routines.  Use this by prefixing the frequencies with an '=' sign,"
NL "either in the -f option, or in the filter spec themselves.  For"
NL "example:"
NL ""
NL "  fiview 200 -f =10 -i LpBe2,LpBe4,LpBu2,LpBu4"
NL "  fiview 200 -i BpBu8/3-4, BpBu8/=3-4"
NL ""
NL "In all the above examples, I have been using the -i immediate option,"
NL "which allows filters to be specified on the command line.  However,"
NL "filter specifications can also be read from files, in which case the"
NL "-i is omitted and the filenames are listed instead.  For example:"
NL ""
NL "  fiview 200 test_filters_1 test_filters_2"
NL ""
NL "You can also specify default frequencies using -f as before, in which"
NL "case they are used by any filters within the files that don't have"
NL "frequencies specified.  For example:"
NL ""
NL "  fiview 200 -f 12.5 test_filters"
NL ""
NL "@@@ Add notes about -F and -W options"
NL ""
NL ""
NL "Output files"
NL "------------"
NL ""
NL "Fiview creates two output files in the current directory whenever it"
NL "runs.  The first file \'fiview.log\' contains all the text that"
NL "appears on the filter information display for each of the filters."
NL "This includes the example code, with the analysis in the comments."
NL ""
NL "The second file \'fiview.coef\' contains all of the filters expressed"
NL "purely in terms of their FIR and IIR coefficients, and in a format"
NL "which can be re-read into Fiview on a later run as a specification"
NL "file.  This is intended to allow external tools to use Fiview to"
NL "design a filter and then get access to the resulting coefficients for"
NL "further processing.  For this application, use the -Q option to quit"
NL "Fiview once the analysis is complete, before bringing up the user"
NL "interface."
NL ""
NL ""
NL "Format of filter specification files"
NL "------------------------------------"
NL ""
NL "A filter specification file may contain one or more different filters,"
NL "separated (or terminated) by ',' or ';' characters.  Comments may also"
NL "appear, using a line of their own with '#' after any initial white"
NL "space."
NL ""
NL "A specification can be given in terms of IIR/FIR coefficients and the"
NL "predefined filter types.  For example, just using coefficients:"
NL ""
NL "  # Test filter"
NL "  0.9972 / -1 1.9955 -0.9971 x 1 -1.9985 1 "
NL "  / -1 1.9959 -0.9973 x 1 -1.9985 1"
NL ""
NL "or using a predefined filter type:"
NL ""
NL "  # Low-pass bessel, order 3"
NL "  LpBe3/0.05"
NL ""
NL "or:"
NL ""
NL "  # Band-pass butterworth, order 5"
NL "  BpBu5/=0.05-0.08"
NL ""
NL "or using combinations:"
NL ""
NL "  # Some strange filter"
NL "  0.9972 / -1 1.9955 -0.9971 x 1 -1.9985 1 x LpBe3/0.05;"
NL ""
NL "  # Some other strange filter"
NL "  LpBe3/0.05 x LpBe5/0.03"
NL ""
NL ""
NL "When a filter is given in terms of FIR/IIR coefficients, use 'x' to"
NL "start an FIR list, and '/' to start an IIR list.  The first list is"
NL "assumed to be an FIR list if no 'x' or '/' is included.  The order of"
NL "coefficients compared to time '0' is closest first to farthest last."
NL "So 'x 0 0 1' would be a delay of two samples."
NL ""
NL "For predefined filter types, remember that the frequency or frequency"
NL "range can be omitted if it is given on the command-line.  So for"
NL "example, this file could generate a selection of Bessel low-pass"
NL "filters, assuming the -f option is given on the command-line:"
NL ""
NL "  # Bessel low-pass filters of different orders"
NL "  LpBe1;"
NL "  LpBe2;"
NL "  LpBe3;"
NL "  LpBe4;"
NL ""
NL "See below for the list of predefined filters.  Predefined filters can"
NL "only be combined using 'x', but beyond that there are no limits -- you"
NL "can combine as many as you wish, with any combination of other IIR/FIR"
NL "filters."
NL ""
NL ""
NL "Filter types"
NL "------------"
NL ""
NL "(see below for notes on these filters)"
NL ""
NL "##D"
NL ""
NL ""
NL "Filter notes"
NL "------------"
NL ""
NL "Bessel: This IIR filter gives a nice domed response in frequency, and"
NL "  also a nice domed response in time.  This is something approaching"
NL "  the ideal balance between time and frequency response for the"
NL "  display for applications like BWView (although I'm currently using a"
NL "  Blackman window there)."
NL ""
NL "Butterworth: This IIR filter gives flat responses away from the"
NL "  transition areas, and sharp transitions, especially as the order"
NL "  increases.  However, this sharp frequency response is paid for with"
NL "  a wider and wider (i.e. more blurry) time-response."
NL ""
NL "Chebychev: This IIR filter exchanges some of the flatness in the"
NL "  passband of the Butterworth filter for a sharper fall-off at the"
NL "  cut-off frequency.  The resulting filter also takes more time to"
NL "  settle (see the time response).  The amount of permitted passband"
NL "  ripple is specified in dB, and should be negative, for example:"
NL "  \"LpCh4/-0.1\" or \"LpCh4/-1\"."
NL ""
NL "All of these types come in a matched-Z version (LpBeZ,HpBuZ,etc) which"
NL "uses the matched-Z transform instead of the bilinear transform.  This"
NL "eliminates the FIR part of the filter for low-pass filters, making"
NL "them pure IIR.  You really need to read what Tony Fisher has to say"
NL "about this on his site to understand whether to use it or not."
NL "Briefly he suggests this option is useful for generating Bessel"
NL "filters with optimally linear phase response, or for generating"
NL "filters that execute slightly faster, but the bilinear transform is"
NL "otherwise superior."
NL ""
NL "Resonators: These IIR filters are based on oscillators, equivalent to"
NL "  a tuned circuit.  The <value> gives the narrowness of the resonator"
NL "  response.  Low values give wider response and faster decay to the"
NL "  oscillations.  Infinity can be represented using a value of '0',"
NL "  which gives a pure oscillator -- for example: \"BpRe/0/0.1\".  The"
NL "  all-pass version (ApRe) has unit response, but the phase varies with"
NL "  frequency, changing rapidly around the resonant frequency.  These"
NL "  are all from mkfilter -- Tony Fisher there suggests that band-stop"
NL "  and band-pass filters made with resonators are often more efficient"
NL "  and better-behaved than Butterworth filters.  See the mkfilter docs"
NL "  for more info on all of this (the URL is close to the top of this"
NL "  file)."
NL ""
NL "Proportional-integral: I don't know what these are for, and they're"
NL "  not documented on the mkfilter site either.  The IIR part, at least,"
NL "  just totals up all the samples received (an 'integral').  I guess"
NL "  you'll know if you want this.  This is probably the digital version"
NL "  of some analogue op-amp technique.  Also note that they don't"
NL "  display at all well in either mkfilter or fiview!"
NL ""
NL "Biquad filters: These are based on Robert Bristow-Johnson's audio EQ"
NL "  cookbook formulae (see the source for more details).  The Q factor"
NL "  selects the shape of the response curve.  Order 1 gives the curves"
NL "  as specified in the original document.  Higher orders stack up these"
NL "  filters.  Note that an order one biquad filter is equivalent to an"
NL "  order two Bessel or Butterworth filter -- compare LpBe2 with LpBu2"
NL "  and LpBq1/0.5, for instance.  The auto-adjust option is useful to "
NL "  get the required half-power points (-3.01dB, 70.71% response) when"
NL "  comparing filters from different families like this."
NL ""
NL "Biquad low-pass and high-pass filters: For a low-pass filter, the"
NL "  significant values are Q=0.5, which is the maximum value to give no"
NL "  overshoot in the time response, and Q=0.707, which gives the most"
NL "  flat-topped frequency response without having a 'lip'."
NL ""
NL "Biquad band-pass, band-stop, all-pass and peaking filters: For these,"
NL "  larger Q values are good -- try up to Q=10 or more.  The peaking"
NL "  filter is designed to emphasise a frequency range.  The second value"
NL "  in this case is the peak gain in dB.  For example: PkBq1/3/10/0.1"
NL ""
NL "Biquad audio shelving filters: These use a 'shelf slope' parameter"
NL "  instead of Q.  S=1 gives the steepest slope without a lip, and lower"
NL "  values give lower values of slope.  The second parameter is the gain"
NL "  in the affected area in dB."
NL ""
NL "Window functions: Bartlett, Hann, Hamming and Blackman window functions"
NL "  are available here.  These act as FIR low-pass filters.  To understand"
NL "  these filters better, it is good to try them with a log display: type"
NL "  'L5' and adjust to view the full frequency range.  Also compare these"
NL "  filters to Bessel IIR filters (e.g. LpBe6)."
NL ""
NL ""
NL "Filter testing mode"
NL "-------------------"
NL ""
NL "Whilst the frequency response display is active, it is possible to"
NL "test the filter by passing test signals through it.  Testing mode is"
NL "entered by typing 't', then the test-signal spec, and then <Return>."
NL "You exit the mode by simply pressing 't' and then <Return>.  The 'x'"
NL "(expand) key may be useful to view any measured points which are off"
NL "the top of the display."
NL ""
NL "Two test signals are provided.  These can be useful for getting a more"
NL "realistic view of your filter than the idealised calculated frequency"
NL "response (which assumes you always have perfect infinitely-long"
NL "sine-waves as input)."
NL ""
NL "The first test signal is a sweeping tone, a sine-wave with linearly"
NL "increasing or decreasing frequency.  By passing a smoothly-varying"
NL "sine-wave through the filter, you might expect to get out of the other"
NL "end a response matching the shape of the response curve for that"
NL "frequency range.  However, this is not the case.  As the rate of the"
NL "tone's frequency change increases, the shape of the output becomes"
NL "more and more distorted.  This is most noticeable in filters that have"
NL "a long time-response because different parts of the filter will catch"
NL "different frequencies out of the sweeping tone.  Test this by entering"
NL "a spec of 's' followed by the rate of change of the tone's frequency"
NL "in Hz/sec, either positive or negative (e.g. 's0.1' or 's-1.5').  With"
NL "a rate of change of 0 ('s0'), this should give an identical response"
NL "to the calculated response."
NL ""
NL "(Note that the test signals passed to the filter aim to put the target"
NL "frequency at the correct centre of the filter time-response, but this"
NL "is not always accurate, resulting in a measured response which may be"
NL "offset either to the left or right compared to the calculated"
NL "response.  The shape will be correct, though, even if it has been"
NL "offset by a few Hz.)"
NL ""
NL "The second test signal is a wavelet of a given number of wave periods."
NL "This can give you an idea of how transient signals are handled by the"
NL "filter.  Test with a wavelet by using a spec of 'w' plus the length of"
NL "the wavelet in wave-periods, for example 'w8', 'w20' or 'w100'."
NL ""
NL "(Note that the wavelets are formed by applying a Blackman window to a"
NL "sine-wave.  The 'length' is the full length of the Blackman window."
NL "For frequencies close to zero, the wavelets can be immensely long, so"
NL "the calculation drops out, and the points will be missing from the"
NL "display.)"
NL ""
NL "General notes: "
NL ""
NL "Although I've said 'sine-wave' in the descriptions above, I'm actually"
NL "running a complex oscillator through the filters, i.e. two independent"
NL "sine-waves 90 degrees out of phase.  This means that I can work with"
NL "continuous output values, without having to watch out for maxima,"
NL "giving more accurate results."
NL ""
NL "Also, regarding accuracy: Sweeps are calculated to the 99.9% point of"
NL "the filter, i.e. to roughly 3sf.  Wavelets are limited by the"
NL "behaviour of the window for very high frequencies.  The program"
NL "doesn't stop you looking beyond the limits of the accuracy of the"
NL "algorithms, so in the extreme limits you may be examining artifacts of"
NL "the analysis methods rather than artifacts of your filter.  In fact,"
NL "by zooming in on very small features, you can even get to see"
NL "artifacts of the 64-bit floating point format!  Double-check with your"
NL "own testing if these things matter to you, or adjust the Fiview code."
NL ""
NL ""
NL "TODO"
NL "----"
NL ""
NL "Make long impulse-response filter checks time-out after 2 sec each"
NL "  filter to make performance similar on different-spec machines."
NL ""
NL "Clean up remaining JIT run-filter bugs, or drop the JIT option; only"
NL "  gives around 20% speed-up when enabled"
NL ""
NL "Add FIR filters (hamming, blackman, Tony Fisher's ones)"
NL "Probably need to put some loops in the generated example code to "
NL "  handle big FIRs more nicely"
NL ""
NL "Cross-test new generated fid_design code against other types of"
NL "  generated example code"
NL ""
NL ""
NL "TO FIX"
NL "------"
NL ""
NL "The second filter here comes out with twice the amplitude on the display:"
NL ""
NL "  ./fiview 200 -f =0.1-0.11 -i BpBe4,BpBe5"
NL ""
NL ""
NL "MAYBE"
NL "-----"
NL ""
NL "Maybe put in code to flatten the phase in the pass-band and display"
NL "  the equivalent delay.  For LP and HP, it would be possible to"
NL "  calculate the slope of the phase at f=0.0 and 0.5 by substituting in a"
NL "  small delta and eliminating delta-squared and higher."
NL ""
NL "Maybe clicking on mini displays shifts within main display"
NL "Maybe click on main displays zooms in and out (L + R)"
NL "Maybe drag on main display moves display"
NL ""
NL "Maybe add bigger font, and switch automatically to it for larger displays."
NL ""
NL "Maybe make FidFilter type into a full filter-expression"
NL "  representation, permitting addition as well as serial combination of"
NL "  filters, and also special types such as tunable heterodyne filters"
NL "  in the form Het1(LpBu10) or whatever.  Need to write generation and"
NL "  RunFilter code for these new types as well.  Significant work."
NL ""
NL "Maybe give generated process() and setup() calls names including the"
NL "  spec, e.g process_LpBu4.  Problems with combined filters, but perhaps"
NL "  we could allow these to be labelled, and carry the label over."
NL ""
NL;

// END //
