From 546bb612d5b57fb27a95272458247b70eb27c6e7 Mon Sep 17 00:00:00 2001 From: Nick Bailey Date: Thu, 26 Jan 2012 10:50:13 +0000 Subject: [PATCH 01/25] Added research seminar --- python/labs/lab8.html | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/python/labs/lab8.html b/python/labs/lab8.html index 4dc657c..2da7439 100644 --- a/python/labs/lab8.html +++ b/python/labs/lab8.html @@ -16,15 +16,40 @@

Audio Programming Lab 8

+
+ +

Exercise 20: Research Seminar!

+
+

Your task...

+

+Research the literature and present a short (15-minute) presentation on a +Music Technology topic of your choice, to be presented at the Science and Music +Research Group Seminar on Issues in Music Technology. +

+

+If you have agreed your on topic for Exercise 21 already, you may present +on that. You may not present on any of the given topics for Exercise 21. +

+

+You can use moodle, web sites, html files with links in a browser, the CMT +wiki (apply to Nick for a user name), demonstrations etc., but the use of +Powerpoint or any similar software product designed to make vacuous +executives look important or knowledgeable will result in instant failure +and possible disciplinary proceedings. +

+

Present your work at the SMRGSIMT.

+

- -

Exercise 20. A Grand Challenge

+
+

Exercise 21. A Grand Challenge

Your task...

@@ -59,7 +84,7 @@

Your task...

speech or music sample without changing its pitch;
  • Using the Autocorrelation Method, plot the pitch of a piece of music sampled in a given file against time
  • -
  • Write a Linear Predictive Coder which given a speech file +
  • Write a Linear Predictive Coding program which given a speech file and a music file, determines the predictor parameters from the speech and imposes the formants on the music sample, thus creating a "talking instrument"
  • From fd419f2779808e815af11f09bb2a622f1ea34304 Mon Sep 17 00:00:00 2001 From: Nick Bailey Date: Tue, 7 Feb 2017 17:30:52 +0000 Subject: [PATCH 02/25] Tidy up some links and get ready for some more exciting stuff (fewer oscillators!) --- python/index.html | 4 ++-- python/info/programming-home.html | 39 ++++++++++++++++++++++++++++--- python/labs/lab1.html | 38 +++++++++++++++--------------- python/labs/lab2.html | 20 ++++++++-------- python/labs/lab3.html | 20 ++++++++-------- python/labs/lab4.html | 4 ++-- python/labs/lab5.xhtml | 4 ++-- python/labs/lab6.html | 2 +- python/labs/lab7.xhtml | 2 +- python/labs/lab8.html | 9 +++---- 10 files changed, 88 insertions(+), 54 deletions(-) diff --git a/python/index.html b/python/index.html index 89eb5ad..0251f20 100644 --- a/python/index.html +++ b/python/index.html @@ -60,9 +60,9 @@

    Lab Exercises

  • 8. Numpy Arrays
  • -9. Reading and writing wav files + 9. Reading and writing wav files
  • -10. Classes and buffer-based audio +10. Classes and buffer-based audio
  • diff --git a/python/info/programming-home.html b/python/info/programming-home.html index 13ed65b..1774fc5 100644 --- a/python/info/programming-home.html +++ b/python/info/programming-home.html @@ -31,23 +31,48 @@

    Programming at Home

    -

    Python 2.6 or 2.7

    +

    Python 3.x

    -Use python 2.6 or 2.7; do not use python 3.0 or higher. +Use python 3.5 or newer; do not use python 2.x.
    +

    +The language syntax and semantics changed significantly +between versions 2 and 3 of python. As of 2016, we have +switched to python 3 for Audio Programming. +There is still a lot of python 2 in the world, +but its use is discouraged for new projects. +

    + +

    Installation

    + +

    +You can choose between downloading the minimum +packages you need for your system, or installing +the Anaconda package which is much bigger but +contains many more, very powerful tools (see +"Other Sofware"). +

    + +

    +For a minumum install: +

    +

    Linux

    If you're running Ubuntu or Debian, enter:

    +
     sudo apt-get install \
    -  python-scipy python-matplotlib \
    +  python3-scipy \
    +  python3-matplotlib \
       audacity
     
    +

    MacOS X and Windows

    @@ -66,6 +91,14 @@

    MacOS X and Windows

    Other software

    +

    Anaconda IDE

    +
    +
    +Anaconda
    +Home Page and Download
    +
    +
    +

    Geany text editor.

    diff --git a/python/labs/lab1.html b/python/labs/lab1.html index 0650893..368acfe 100644 --- a/python/labs/lab1.html +++ b/python/labs/lab1.html @@ -9,7 +9,7 @@ Back to main -

    Lab 1 for C programming

    +

    Lab 1 for python programming

    @@ -101,7 +101,7 @@

    Technical details

    -print "hello world!"
    +print("hello world!")
     

    @@ -126,9 +126,9 @@

    Technical details

     # this is a comment
     
    -print "hello"
    +print("hello")
     
    -# print "this will not be printed"
    +# print("this will not be printed")
     
    @@ -237,24 +237,24 @@

    Technical details

     x = 3
    -print "x is currently", x
    +print("x is currently", x)
     
     y = 4.001
    -print "y is currently", y
    -print "Make that shorter: %.1f" % (y)
    -print "Make that longer: %.8f" % (y)
    +print("y is currently", y)
    +print("Make that shorter: {:.1f}".format(y))
    +print("Make that longer: {:.8f}".format(y))
     
     z = x/y
     z = x + z*y - y
    -print "Why does z = %i ?\n" % (z)
    +print("Why does z = {} ?\n".format(z))
     
     animal_name = "cat"
     cute_name = "kitty"
     combo = cute_name + animal_name
    -print "We can do \"math\" on strings: %s" % (combo)
    +print("We can do \"math\" on strings: {}".format(combo))
     
    -print "We can print multiple",
    -print "variables: %i %f %i %s\n" % (x, y, z, cute_name)
    +print("We can print multiple")
    +print("variables: {} {} {} {}\n".format(x, y, z, cute_name))
     
    @@ -356,7 +356,7 @@

    Technical details

     print "Enter an animal name:"
     animal_name = raw_input()
    -print "You typed: %s" % (animal_name)
    +print("You typed: ", animal_name)
     

    @@ -365,7 +365,7 @@

    Technical details

    -print "Enter your age (as an integer):"
    +print("Enter your age (as an integer):")
     user_input = raw_input()
     age = int(user_input)
     
    @@ -373,7 +373,7 @@ 

    Technical details

    user_input = raw_input() weight = float(user_input) -print "You typed: %i, %f" % (age, weight) +print("You typed: {}, {}".format(age, weight))
    @@ -525,10 +525,10 @@

    Technical details

    return a*a + b*b def p(years, c, animal): - print "If I were a %s, I'd be" % (animal), - print "%i years old.\n" % (years) - print "The sum of squares", - print "was %f units.\n" % (c) + print("If I were a {}, I'd be".format(animal), + "{} years old.\n".format(years)) + print("The sum of squares", + "was {} units.\n".format(c)) my_age = 18 x = 3.3 diff --git a/python/labs/lab2.html b/python/labs/lab2.html index 0576a6b..ae7ae13 100644 --- a/python/labs/lab2.html +++ b/python/labs/lab2.html @@ -9,7 +9,7 @@ Back to main -

    Lab 2 for C programming

    +

    Lab 2 for Python programming

    Exercises: @@ -77,13 +77,13 @@

    Technical details

    if x == 4: # this line will not be printed - print "x is equal to 4" + print("x is equal to 4") # one of these two lines will be printed if (x > 10) or (1 != 0): - print "Expression is true" + print("Expression is true") else: - print "Expression is false" + print("Expression is false")

    @@ -106,7 +106,7 @@

    Technical details

    # between 0 and 0.999999999999 number = random.random() -print "Random number is:", number +print("Random number is:", number)
    @@ -220,7 +220,7 @@

    Technical details

     while True:
    -    print "Infinite loop is infinite"
    +    print("Infinite loop is infinite")
     

    @@ -230,7 +230,7 @@

    Technical details

     i = 0
     while i < 10:
    -    print "The loop has repeated", i, "times."
    +    print("Looped {} times.".format(i))
         i = i + 1
     
    @@ -325,7 +325,7 @@

    Technical details

     for i in range(10):
    -    print "The loop has repeated", i, "times."
    +    print("For the {} time.".format(i))
     

    @@ -334,10 +334,10 @@

    Technical details

     for i in range(5, 15):
    -    print "What is this loop doing?  i is", i
    +    print("What is this doing?  i is", i)
     
     for i in range(20, 2, -2):
    -    print "What is this loop doing?  i is", i
    +    print("What is this doing?  i is", i)
     
    diff --git a/python/labs/lab3.html b/python/labs/lab3.html index 22b2cfd..37a2ed6 100644 --- a/python/labs/lab3.html +++ b/python/labs/lab3.html @@ -9,7 +9,7 @@ Back to main -

    Lab 3 for C programming

    +

    Lab 3 for audio programming

    Exercises: @@ -37,7 +37,7 @@

    Background

    An array is an ordered sequence of values; you cannot -rearrange values without changing the meaning). A two-dimensional +rearrange values without changing the meaning. A two-dimensional array is just a normal "table".

    @@ -74,7 +74,7 @@

    Technical details

    import numpy # initialize all positions with 0 arr = numpy.zeros(8) -print arr +print(arr)

    @@ -197,18 +197,18 @@

    Technical details

    sample_rate, samples = scipy.io.wavfile.read( "a440-1second.wav") -print "Data type is:", samples.dtype +print("Data type is:", samples.dtype) # scale to -1.0 -- 1.0 samples = samples / (convert_16_bit + 1.0) -print "Data type is now:", samples.dtype +print("Data type is now:", samples.dtype) # change the file samples = samples * 0.25 # scale to -32768 -- 32767 samples = numpy.int16( samples * convert_16_bit ) -print "Data type is now:", samples.dtype +print("Data type is now:", samples.dtype) scipy.io.wavfile.write("quieter.wav", sample_rate, samples) @@ -305,7 +305,7 @@

    Technical details

    # note the capitalization (convention) counter = CounterOne() for i in range(8): - print counter.get_next() + print(counter.get_next())

    @@ -337,7 +337,7 @@

    Technical details

    # the code here doesn't know if it's # using CounterOne or CounterTwo! for i in range(8): - print counter.get_next() + print(counter.get_next())

    @@ -363,7 +363,7 @@

    Technical details

    # pass in increment_value counter = CounterOne(4) for i in range(8): - print counter.get_next() + print(counter.get_next())

    @@ -382,7 +382,7 @@

    Technical details

    extra_stuff = numpy.zeros(2) big_buffer = numpy.append(big_buffer, extra_stuff) -print big_buffer +print(big_buffer)
    diff --git a/python/labs/lab4.html b/python/labs/lab4.html index e66a8d9..cb3ee60 100644 --- a/python/labs/lab4.html +++ b/python/labs/lab4.html @@ -50,7 +50,7 @@

    Background

    There are some notes here: mcm.pdf. +href="http://markov.music.gla.ac.uk/AP_Sandpit/mcm.pdf">mcm.pdf. Skip over chapter 1, and read chapter 2 up to and including section 2.3 Determining the Table Length. A print-out of this material will be handed out in class. @@ -184,7 +184,7 @@

    Background

    There are some notes here: mcm.pdf. +href="http://markov.music.gla.ac.uk/AP_Sandpit/mcm.pdf">mcm.pdf. Skip over chapter 1, and read chapter 2 up to and including section 2.4 Shortening the Lookup Table. A print-out of this material will be handed out in class. diff --git a/python/labs/lab5.xhtml b/python/labs/lab5.xhtml index ba70fd8..5e3b796 100644 --- a/python/labs/lab5.xhtml +++ b/python/labs/lab5.xhtml @@ -211,7 +211,7 @@ look-up table and interpolation.

    As described in Chapter 2 of mcm.pdf +href="http://markov.music.gla.ac.uk/AP_Sandpit/mcm.pdf">mcm.pdf the position of poles and zeros in Laplacian space characterises a system response. Poles on the left half of the s-plane represent a damped @@ -521,7 +521,7 @@ previous two outputs. This all sounds quite daunting, but it isn't hard after you've worked through what's happening once. Read Chapter 2 of mcm.pdf for more detail. +href="http://markov.music.gla.ac.uk/AP_Sandpit/mcm.pdf">mcm.pdf for more detail.

    diff --git a/python/labs/lab6.html b/python/labs/lab6.html index e749656..707e976 100644 --- a/python/labs/lab6.html +++ b/python/labs/lab6.html @@ -144,7 +144,7 @@

    Background

    we can follow the procedure described in the "Subtractive Synthesis" chapter of mcm.pdf. This describes an easily-rememered graphical +href="http://markov.music.gla.ac.uk/AP_Sandpit/mcm.pdf">mcm.pdf. This describes an easily-rememered graphical method to calculate the magnitude and phase of a system's transfer function given the position of the poles and zeros. In summary: diff --git a/python/labs/lab7.xhtml b/python/labs/lab7.xhtml index 3769b59..67e0a76 100644 --- a/python/labs/lab7.xhtml +++ b/python/labs/lab7.xhtml @@ -429,7 +429,7 @@ and then to transform it into the digital domain.

    The design process for a digital filter based on one of the "classical" polynomials is covered in detail in the -Making Computer Music PDF file. In (extreme) summary, +Making Computer Music PDF file. In (extreme) summary,

    • Design the desired filter in low-pass form with a cut-off diff --git a/python/labs/lab8.html b/python/labs/lab8.html index 2da7439..f551c20 100644 --- a/python/labs/lab8.html +++ b/python/labs/lab8.html @@ -38,8 +38,8 @@

      Your task...

      on that. You may not present on any of the given topics for Exercise 21.

      -You can use moodle, web sites, html files with links in a browser, the CMT -wiki (apply to Nick for a user name), demonstrations etc., but the use of +You can use moodle, web sites, html files with links in a browser, +demonstrations etc., but the use of Powerpoint or any similar software product designed to make vacuous executives look important or knowledgeable will result in instant failure and possible disciplinary proceedings. @@ -88,11 +88,12 @@

      Your task...

      and a music file, determines the predictor parameters from the speech and imposes the formants on the music sample, thus creating a "talking instrument"
    • -
    • Your own challenge, if agreed in advance with Nick and Graham. You'll +
    • Your own challenge, if agreed in advance with Nick and +the demonstrator. You'll need to support its viability with background research.
    -

    ... Write up and hand in your work. It's worth 3 normal exercises.

    +

    ... Write up and hand in your work. It's worth 2 normal exercises.

    From 3fd52a44531486c83246775a3e92029f30741016 Mon Sep 17 00:00:00 2001 From: Nick Bailey Date: Sun, 12 Feb 2017 22:55:06 +0000 Subject: [PATCH 03/25] Modified Index; wrote hello, world SWIG example program --- python/index.html | 55 +---- python/labs/lab-swig.html | 411 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 418 insertions(+), 48 deletions(-) create mode 100644 python/labs/lab-swig.html diff --git a/python/index.html b/python/index.html index 0251f20..292192d 100644 --- a/python/index.html +++ b/python/index.html @@ -116,75 +116,34 @@

    Lab Exercises

  • -Lab 8: - -
    • -20. A Grand Challenge -
    • -
    - - - - - + Poles at 0.99∠±0.1425; zeros at ±1. + +
  • + Poles at 0.99∠±0.62689; zeros at 0.9, same angles. +
  • + As above, but with the poles and zeros exchanged. +
  • + +

    + +

    ... show your work to a demonstrator

    +
    + + + + + +

    Back to main

    + + +
    + +

    +Unless otherwise noted, all materials on these pages +are licenced under a Creative +Commons Licence. +

    + + + + From 733057711d3481cab7a2043c9448648a64165f0f Mon Sep 17 00:00:00 2001 From: Nick Bailey Date: Mon, 13 Feb 2017 13:23:25 +0000 Subject: [PATCH 04/25] Started section on numpy arrays --- python/index.html | 2 +- python/labs/lab-swig.html | 98 ++++++++++++++++++++------------------- 2 files changed, 51 insertions(+), 49 deletions(-) diff --git a/python/index.html b/python/index.html index 292192d..00353f5 100644 --- a/python/index.html +++ b/python/index.html @@ -123,7 +123,7 @@

    Lab Exercises

  • 20. A very simple example
  • -18. Filtering with pole and zero placement in the z-plane + 18. SWIG and numpy nd-arrays
  • 19. Filtering to a specification
  • diff --git a/python/labs/lab-swig.html b/python/labs/lab-swig.html index ed13872..4101245 100644 --- a/python/labs/lab-swig.html +++ b/python/labs/lab-swig.html @@ -28,7 +28,7 @@


    - +

    Exercise 17: A Very Simple Example

    @@ -127,6 +127,15 @@

    Command Reminders and References

    resolving as many references as possibe producing a shared object library (extension .so). +
    +

    +The SWIG documentation is very comprehensive, +although aimed at expert users. Check out the +Executive Summary. +SWIG works with many languages, not just Python, so you'll +find the tutorial useful +as well as the more detailed information about +SWIG and Python.

    @@ -261,70 +270,63 @@

    Your task...

    might be different on the machine you're using.

    +

    +You should have covered the use of build tools in an earlier +programming class. Once you've understood what's going on, +you might save yourself some time by writing a Makefile +so that you can run all of the necessary steps by simply +typing make. There is an example of how to construct a +make file in the appendix of the +MCM document. +

    +

    ... show your work to a demonstrator


    - -

    Exercise 16: frequency response

    -
    + +

    Exercise 18: SWIG and numpy nd-arrays

    Background

    -A few labs ago, we constructed oscillators by placing -poles on the unit circle in the z-plane. -This concept can be extended by providing the -objects we build with an input, and implementing -them with poles (and zeros) inside the -unit circle. +The simple Hello World program +in passed a value to a C++ function. It didn't return +any value, but returning simple built-in types +(int, float, double +etc) is handled trivially by SWIG and you can call the function +entirely as expected, using the return value in Python as normal.

    -To calculate the frequency response of such a system, -we can follow the procedure described in the -"Subtractive Synthesis" chapter of -mcm.pdf. This describes an easily-rememered graphical -method to calculate the magnitude and phase of a -system's transfer function given the position of the -poles and zeros. In summary: -

      -
    1. Take a position on the unit-circle corresponding to -the frequency of the input signal.
    2. -Construct vectors from each pole to that position. -
    3. Calculate the vector product of these vectors, -producing the result P
    4. -
    5. Repeat the procedure for for the zeros -yeilding Z. Remember that to make a causal system, -you probably ended up with zeros at the origin.
    6. -
    7. The frequency response is the result of the vector -division of Z by P
    8. -
    -

    - -
    - -
    -

    Maths homework

    - -

    -Consider -a system is running at a sample rate of 44100Hz, -having two poles at -z = 0.995∠±π/10, and two -zeros at z = 0.9∠±π/10. +An issue arises with C(++) types which are semantically +ambiguous. In C (and C++, although it's frowned upon), +strings are represented as null-terminated character arrays, +and passed around the programmer as pointers to their +first character. Indeed, the declaration +
    char* s = "Hi"; +is really just a shorthand for +
    char* s = {'H', 'i', '\0'}; +
    The C "string" doesn't even have a method to determine +its length; it's just a pointer, not an object. +So what is SWIG to do with the pointer-to-char type? +There is a possibility that the C programmer really did +mean a pointer-to-character and it isn't to be regarded +as a "string".

    -What is the frequency response at alpha = 0.25 ? +The solution that SWIG offers to this is the application +of "Typemaps".

    +
    -

    -At what frequency does it have maximum gain? And what is -that gain? -

    +
    +

    Reference Documents

    +

    The full story on + SWIG + Typemaps.

    From 8aad586f09e89e34105fe6c518518e1df360667c Mon Sep 17 00:00:00 2001 From: Nick Bailey Date: Mon, 13 Feb 2017 20:17:08 +0000 Subject: [PATCH 05/25] numpy interaction and returning tuples --- python/labs/lab-swig.html | 227 +++++++++++++++++++++++++++++++------- 1 file changed, 189 insertions(+), 38 deletions(-) diff --git a/python/labs/lab-swig.html b/python/labs/lab-swig.html index 4101245..35b9535 100644 --- a/python/labs/lab-swig.html +++ b/python/labs/lab-swig.html @@ -270,6 +270,14 @@

    Your task...

    might be different on the machine you're using.

    +
    + If you have a very old C++ compiler, you might have to + encourage it to use the modern standard by adding the + flags ‑‑std=c++0x + or ‑‑std=c++11. + The C++ produced by SWIG relies on modern language features. +
    +

    You should have covered the use of build tools in an earlier programming class. Once you've understood what's going on, @@ -306,7 +314,7 @@

    Background

    and passed around the programmer as pointers to their first character. Indeed, the declaration
    char* s = "Hi"; -is really just a shorthand for +
    is really just a shorthand for
    char* s = {'H', 'i', '\0'};
    The C "string" doesn't even have a method to determine its length; it's just a pointer, not an object. @@ -318,15 +326,99 @@

    Background

    The solution that SWIG offers to this is the application -of "Typemaps". +of "Typemaps". A Typemap tells SWIG to generate some specific +code when the variable maps a type template. Most specific +templates are considered first (and they can include the +name of the variable), so it's possible to specify how +a variable is to be treated on a case-by-case basis. +Writing the Typemap requires a fairly intimate kowledge +of SWIG and the Python run-time, but the numpy authors +have provided an interface file for their package, so we +are in the happy position of only ever having to use those +which we're given. +

    + +

    +Finally, it's worth noting that as well as functions, SWIG +will convert wrappers for C++ classes wholesale if required. +The wrapped class in the C++ appears as a regular Python +class, and all of its public methods are accessible from +Python.

    +
    +

    Using Supplied numpy nd-array Typemaps

    +

    + To make use of the Typemaps provided to support + numpy nd-arrays through SWIG, it's necessary to + include in your interface file the instructions + to read numpy's interface file and initialise + the necessary array-support code. The first two + stanzas of the following code fragment achieve + this. +

    +
    +%include <numpy.i>
    +
    +%init %{
    +import_array();
    +%}
    +
    +%apply (double* IN_ARRAY1, int DIM1) {
    +  (const double* in, std::size_t in_size)
    +};
    +%apply (double* INPLACE_ARRAY1, int DIM1) {
    +  (double* out, std::size_t out_size)
    +};
    +        
    +

    + The final two stanzas apply the numpy array Typemaps to + functions which have the named arguments and types. You + have to understand that numpy.i is designed to pass arrays + using the convention of supplying a pointer to the first + element and the length of the dimension. + The first %apply instructs functions with the + formal parameter list (double* in, int in_size) + to be treated as if described in the Typemaps IN_ARRAY1 + and DIM1. So supplying a single nd-array argument + in the Python call invokes the C function with two + arguments: a pointer to the first element and the size of + the first (only) dimension. To know that, you have to read + the manual. +

    +

    + numpy.i provides a choice of signiatures for arrays of up + to 4D. To pass a 2D array, for example, you might use the + signiature + (DATA_TYPE* IN_ARRAY2, int DIM1, int DIM2) + where DATA_TYPE can be one of the supported types (that includes + almost any simple type you can think of). +

    +

    + Notice that the IN_ARRAY can't be modified: the C(++) type + which it is applied to is represented by a const pointer. + If you want to modify the Python array with the C function, + you must use a INPLACE_ARRAY1, INPLACE_ARRAY2, etc. + Python often returns more than one value with calls like + a,b=myfunction(x), but C(++) usually achieves + this by having pointers (or references) passed to the function. + If you code already uses numpy, and the return values are all + of the same type, an INPLACE array might be used to return + them. There is also the ARGOUTVIEWM_ARRAYx template to allow + properly memory-managed views of public arrays in your C++: + check out the documentation. However, if you want to return + multiple values, you might ask yourself whether you shouldn't + do the Pythonic thing and return a tuple. +

    +

    Reference Documents

    The full story on SWIG Typemaps.

    +

    Documentation + for the numpy SWIG interface specification.

    @@ -334,56 +426,115 @@

    Reference Documents

    Your task...

    +

    +First of all, provide the implementation for the +class described below. Then implement the resonator +you built in python using C++ from scratch. +

    -Make some plots of the magnitude frequency response for the following systems of -poles and zeros. This requires you to write a function to figure -out the frequency response at a particular point, then call that -function a bunch of times so you have your data to plot. +To illustrate the techniques involved, I've made a couple +of functions which calculate the minimum, maximum and sum +of an 1D numpy array of doubles. The calculation is done +in C++.

    -You should have a single frequency_response(poles, -zeros) function. +The functions are gratuitously wrapped in a class, for no +other reason than to show the calling convention. They are +static functions so they belong to the class and you don't +have to instantiate an object to use them. mms_t +calculates the maximum, minimum and sum and returns them +as a tuple (actually a Python list). mms_a +returns the values in a numpy array which the caller is +responsible for creating.

    -
      -
    • -You can define the poles and zeros as either python lists or numpy -arrays. They can be defined directly in the code; no need to -handle user input. +

      +Here is the header file. +

      -
      -def frequency_response(poles, zeros):
      -    print poles
      -    print zeros
      -    # calculate response for a bunch of alpha,
      -    # then plot them
      -
      -poles = numpy.array([0.995, 0.31415, 0.995, -0.31415])
      -zeros = numpy.array([0.9, 0.31415, 0.9, -0.31415])
      -frequency_response(poles, zeros)
      -
      +
      +// File: min_max_sum.h
      +//
      +// Given an array of double, return its minumum and
      +// maximum values and the sum of its contents in
      +// diverse and amusing ways.
      +//
       
      +#include <cstddef>
      +
      +class MMS {
      +public:
      +        // return the min, max and sum of the given array.
      +        // SWIG will arrange for this to be returned as a tuple.
      +        static void mms_t(const double* in, std::size_t in_size,
      +                          double* min, double* max, double* sum);
      +
      +        // return the min, max and sum of the given numpy array 'in'.
      +        // SWIG will write the values into the give numpy array, 'out'.
      +        static void mms_a(double* out, std::size_t out_size,
      +                          const double* in, std::size_t in_size);
      +};
      +

      -If you're feeling cheeky, you could plot the phase response too, on the same graph. +And here is the interface specification

      +
      +/* File: min_max_sum.i */
       
      -

      -System sample rate 44100Hz. +/* Name our python module */ +%module min_max_sum -

        -
      1. - Poles at 0.99∠±0.1425; zeros at ±1. -
      2. -
      3. - Poles at 0.99∠±0.62689; zeros at 0.9, same angles. -
      4. - As above, but with the poles and zeros exchanged. -
      5. -
      +/* Put the literal code needed at the top of the output file */ +%{ +#define SWIG_FILE_WITH_INIT +#include "min_max_sum.h" +%} + +/* The typemaps interface file lets us use the *OUTPUT Typemap. + This will enable us to use pointers to variables as return results. + If more than one *OUTPUT is matched, a tuple gets constructed. */ +%include <typemaps.i> + +/* Use the numpy interface for ndarrays. See the warning below */ +%include <numpy.i> + +%init %{ +import_array(); +%} + +/* Match the arguments of our various C++ methods */ +%apply (double* IN_ARRAY1, int DIM1) { (const double* in, std::size_t in_size) }; +%apply double *OUTPUT { double* min, double* max, double* sum }; +%apply (double* INPLACE_ARRAY1, int DIM1) { (double* out, std::size_t out_size) }; + +/* Parse the c++ header file and generate the output file */ +%include "min_max_sum.h" + +
      +

      +Just to prove it works, here's a session running on Nick's laptop:

      +
      +>>> from min_max_sum import MMS
      +>>> import numpy as np
      +>>> result = np.zeros(3)
      +>>> MMS.mms_t(np.array([1,4,3,7]))
      +[1.0, 7.0, 15.0]
      +>>> MMS.mms_a(result,np.array([1,4,3,7]))
      +>>> result
      +array([  1.,   7.,  15.])
      +
      + +
      + Some Linux distributions of python3-numpy don't + package the numpy.i interface file. + This is a bug. + If your copy of SWIG complains about not being + able to find numpy.i, you'll have to download one + and put it in the same directory as your code. +

      ... show your work to a demonstrator

    From 494cf86986cb1ede6310ec4f5cbca75d8d0e7618 Mon Sep 17 00:00:00 2001 From: Nick Bailey Date: Thu, 16 Feb 2017 16:35:49 +0000 Subject: [PATCH 06/25] Additional info for lab (and other) machines --- python/labs/lab-swig.html | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/python/labs/lab-swig.html b/python/labs/lab-swig.html index 35b9535..a967c8f 100644 --- a/python/labs/lab-swig.html +++ b/python/labs/lab-swig.html @@ -129,6 +129,18 @@

    Command Reminders and References


    +The python3-config command is your friend. +If you want to know which include files to use compile +your SWIG wrapper, python3-config ‑‑includes +will tell you. +Type it at the prompt and see what it says. +Try ldflags instead of includes. +Remember you can get output of a command +such as this included in the command you type using either +` cmd ` or $( cmd ). +

    +
    +

    The SWIG documentation is very comprehensive, although aimed at expert users. Check out the Executive Summary. @@ -162,7 +174,7 @@

    Your task...

    // Print a greeting. // -#include +#include <string> void hw(std::string who = std::string("World")); @@ -203,6 +215,18 @@

    Your task...

    +
    + If you are using a machine which has its Python environment + and numpy installations in non-standard places, you'll need + to do a bit of extra spade work. For example, the machines + in the lab have anaconda installed, which you'll want to use + in preference to their standard Python environment. + Make sure the computer looks there first for executables + with
    + export PATH=/local/anaconda/32/bin/:$PATH
    + You only have to issue this command once per session. +
    +

    Compile this and test it. Maybe say
    g++ -o simple_hello simple_hello_test.cxx simple_hello.cxx
    @@ -261,7 +285,7 @@

    Your task...

    files and link them into a shared library, then import that into a Python session. Here are the appropriate incantations:
    g++ -fPIC -c simple_hello.cxx
    -g++ -fPIC -c simple_hello_wrap.cxx -I/usr/include/python3.5m
    +g++ -fPIC -c simple_hello_wrap.cxx $( python3-config ‑‑includes )
    g++ -shared simple_hello_wrap.o simple_hello.o -o _simple_hello.so
    Note the leading underscore character on the filename of the shared object, and that I told the C++ compiler to look in @@ -432,6 +456,14 @@

    Your task...

    you built in python using C++ from scratch.

    +
    + If you have your own local copy of numpy, tell the C++ + compiler to use its header files with (e.g.)
    + export CPLUS_INCLUDE_PATH=/local/anaconda/32/lib/python3.5/site‑packages/numpy/core/include/ +
    That's where anaconda's up-to-the-minute numpy resides + on the lab machines. +
    +

    To illustrate the techniques involved, I've made a couple of functions which calculate the minimum, maximum and sum From 67475805526525ae962ec4b0c5619ac0bbb1233f Mon Sep 17 00:00:00 2001 From: Nick Bailey Date: Tue, 21 Feb 2017 13:35:58 +0000 Subject: [PATCH 07/25] Mac's aren't supported better --- python/labs/lab-swig.html | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/python/labs/lab-swig.html b/python/labs/lab-swig.html index a967c8f..9deb466 100644 --- a/python/labs/lab-swig.html +++ b/python/labs/lab-swig.html @@ -21,7 +21,7 @@

  • 17. A Very Simple Example
  • -16. Frequency Response +18. SWIG and numpy nd-arrays
  • @@ -294,6 +294,16 @@

    Your task...

    might be different on the machine you're using.

    +

    +Sometimes you might need extra linkage flags. For example, +MacOS requires a whole bunch of stuff to do with frameworks. +You might try appending $( python3-config --ldflags ) +to the last line if you get linkage errors. On a Mac, you'd +also normally use the .dylib extension instead +of .so, and say -dynamiclib instead +of -shared. +

    +
    If you have a very old C++ compiler, you might have to encourage it to use the modern standard by adding the From 3b6c5d95bdd7328a106865675736da20cd662a69 Mon Sep 17 00:00:00 2001 From: Nick Bailey Date: Tue, 21 Feb 2017 13:49:31 +0000 Subject: [PATCH 08/25] Silly close-tag typo fixed --- python/labs/lab-swig.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/labs/lab-swig.html b/python/labs/lab-swig.html index 9deb466..e0c7581 100644 --- a/python/labs/lab-swig.html +++ b/python/labs/lab-swig.html @@ -301,7 +301,7 @@

    Your task...

    to the last line if you get linkage errors. On a Mac, you'd also normally use the .dylib extension instead of .so, and say -dynamiclib instead -of -shared. +of -shared.

    From d5389e3b2e3b1e3e92f6715157751e0033acac1a Mon Sep 17 00:00:00 2001 From: Nick Bailey Date: Wed, 22 Feb 2017 10:12:28 +0000 Subject: [PATCH 09/25] numpy.i link and trivial beautification --- python/labs/lab-swig.html | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/python/labs/lab-swig.html b/python/labs/lab-swig.html index e0c7581..c660f77 100644 --- a/python/labs/lab-swig.html +++ b/python/labs/lab-swig.html @@ -99,12 +99,14 @@

    Command Reminders and References

    You'll aready know that you can compile a C++ program using the GNU compiler with the following command +

    -g++ -o < output_file_name> \
    -    <input_file_names> \
    -    -I<include_file_path> \
    -    -L<library_path> -l<library>
    +g++ -o output_file_name \
    +    input_file_names \
    +    -Iinclude_file_path \
    +    -Llibrary_path -llibrary
     
    +

    and that unless you specify otherwise with the -o flag, the program is written into a file called a.out (assembler output). Of course, you can leave the flags you don't @@ -168,6 +170,7 @@

    Your task...

    "Hello, " followed by its argument. Then write a test file with a main function in it to make sure your C function behaves as you wish it to behave. For example, here's the header file: +

     // File: simple_hello.h
     //
    @@ -178,7 +181,9 @@ 

    Your task...

    void hw(std::string who = std::string("World"));
    +

    here's the implementation: +

     // File: simple_hello.cxx
     //
    @@ -194,7 +199,9 @@ 

    Your task...

    std::cout << "Hello, " << who << std::endl; }
    +

    and here's the evaluation program: +

     // File: simple_hello_test.cxx
     
    @@ -239,6 +246,7 @@ 

    Your task...

    parse the C(++) header file and work out what's going on for itself. Let's call our python module simple_hello. A suitable interface file might contain: +

     /* File: simple_hello.i */
     
    @@ -257,7 +265,7 @@ 

    Your task...

    /* Parse the c++ header file and generate the output file */ %include "simple_hello.h"
    -Note that the awfully nice SWIG people have already provided +

    Note that the awfully nice SWIG people have already provided interface files for much of the C++ standard library, including the C++ string type. We take the opportunity to put two C preprocessor directives at the top of the wrapper file; @@ -298,7 +306,7 @@

    Your task...

    Sometimes you might need extra linkage flags. For example, MacOS requires a whole bunch of stuff to do with frameworks. You might try appending $( python3-config --ldflags ) -to the last line if you get linkage errors. On a Mac, you'd +to the last command above if you get linkage errors. On a Mac, you'd also normally use the .dylib extension instead of .so, and say -dynamiclib instead of -shared. @@ -365,11 +373,13 @@

    Background

    templates are considered first (and they can include the name of the variable), so it's possible to specify how a variable is to be treated on a case-by-case basis. -Writing the Typemap requires a fairly intimate kowledge +Writing the Typemap requires a fairly intimate knowledge of SWIG and the Python run-time, but the numpy authors have provided an interface file for their package, so we are in the happy position of only ever having to use those -which we're given. +which we're given. That's not to say you shouldn't ever +think of writing your own Typemap. Just be prepared to +read the manual.

    @@ -574,8 +584,9 @@

    Your task...

    package the numpy.i interface file. This is a bug. If your copy of SWIG complains about not being - able to find numpy.i, you'll have to download one - and put it in the same directory as your code. + able to find numpy.i, you'll have to + download + one and put it in the same directory as your code.

    ... show your work to a demonstrator

    From 42f0884aa4efe7b38ed37779ca14e7367dfeffd6 Mon Sep 17 00:00:00 2001 From: Nick Bailey Date: Mon, 27 Feb 2017 18:23:53 +0000 Subject: [PATCH 10/25] I like coroutines because they is good --- python/index.html | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/python/index.html b/python/index.html index 00353f5..19c4142 100644 --- a/python/index.html +++ b/python/index.html @@ -121,12 +121,23 @@

    Lab Exercises

    +
  • + +
  • +Creating a User Interface: + +
  • From d637fef55c35096be00e8a756ddce570213f2fd0 Mon Sep 17 00:00:00 2001 From: Nick Bailey Date: Mon, 27 Feb 2017 18:24:58 +0000 Subject: [PATCH 11/25] Philosophical musings on coroutines --- python/labs/lab-qt.html | 265 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 265 insertions(+) create mode 100644 python/labs/lab-qt.html diff --git a/python/labs/lab-qt.html b/python/labs/lab-qt.html new file mode 100644 index 0000000..034be66 --- /dev/null +++ b/python/labs/lab-qt.html @@ -0,0 +1,265 @@ + + + +Getting Ready II - Qt GUI + + + + +Back to main + +

    + Getting Ready for the Grand Challenge II
    + Building a Graphics User Interface using PyQt +

    + +
    +Exercises: + +
      +
    • +19. Thinking about GUIs +
    • +20. +
    • +
    +
    + +
    +

    Thinking about GUIs...

    +

    Objects or co-routines?

    +

    +Sometimes, it's important to think hard, and work out if +what you're writing in your code isn't more for the benefit +of the computer than for you. This is one of those times. +

    +

    +CPUs have hardware support for subroutines. So languages like +C, which is about as "close to the metal" as you can get +without assembler, base their whole modus operandi on breaking +up larger programs into a bunch of subroutines, which +pass arguments around and reserve local memory. +CPUs are built with (one or more) stacks which make +this easy for the compiler and fast to run. But +when a program gets bigger, and particularly when +it has to respond to asynchronous events, this isn't +necessarily the easiest way to express things. +

    +

    +Donald Knuth, a renowned computer scientist, famously +described subroutines as "special cases of ... coroutines." +[Knuth, Donald Ervin (1997). Fundamental Algorithms. The Art of Computer Programming. 1 +(3rd ed.). Addison-Wesley. Section 1.4.2: Coroutines, pp. 193–200. ISBN 0-201-89683-4.)] +So what's a coroutine? Here's an example. +

    +

    +Suppose you wish to simulate those ticket dispensers you +get in up-market delicatessens. Anybody can walk in and +take a ticket; every time a ticket is dispensed, the number +is one bigger than the previous ticket. In our software version, +I'm going to add the facility to skip ahead. Normally we'll +pass 0 and just get the next number; otherwise we can pass +a number of tickets to skip (these numbers are lost forever). +

    +
    +
    Creating an object
    +
    +# Turn counting with an Object
    +class TurnCounter:
    +
    +    # Initialise the sequence counter to 0.
    +    def __init__(self):
    +        self._seq = 0;
    +        
    +    # Return the next in seqence,
    +    # skipping as required.    
    +    def get(self, skip):
    +        ticket = self._seq
    +        self._seq += 1 + skip
    +        return ticket
    +
    +

    +We'd then create an instance of the object (thus +initializing its state) and repeatedly call +get(0) to receive tickets. +

    +
    +In [31]: tc=TurnCounter()
    +In [32]: tc.get(0)
    +Out[32]: 0
    +In [33]: tc.get(0)
    +Out[33]: 1
    +In [34]: tc.get(1)
    +Out[34]: 3
    +
    +
    +
    +
    Creating a coroutine
    +
    +# Turn counting with a co-routine
    +# (also called a generator object in Python)
    +def turn_counter():
    +    # Our state variable local to this function
    +    _seq = 0
    +    
    +    while True:
    +        # Pass back the sequence count to our
    +        # coroutine, and receive the next skip value
    +        skip = yield _seq
    +        # Do some processing and loop forever
    +        _seq += 1 + skip
    +
    +

    +The clue's in the name: a coroutine isn't subordinate to its caller +like a subroutine. Subroutines get passed variables, process them +and return a value. Any information stored in the +subroutine's local variables is lost when the subroutine +returns. +

    +

    +Coroutines get created, and are allowed to proceed by the routine +that created them. The coroutine then takes the conn until +it's ready to pass control back to the original routine +— its coroutine — using the yield +command. +

    +

    +Execution now passes back to the original coroutine until it +decides to yield control back again. It can do that by invoking +next() with the coroutine as an argument, or to +send data to the coroutine, using the coroutine's send() +method. send() causes execution to continue after +the yield command which relinquished it, and with +the sent value being treated like returned data. +

    +

    +The important thing here is that the coroutine's state — its +local variables and so forth — remain intact with the same +values as they had when the thread of execution was yielded on +the previous occasion. +

    +
    +In [35]: tc = turn_counter()
    +In [36]: tc
    +Out[36]: 
    +In [37]: next(tc)
    +Out[37]: 0
    +In [38]: tc.send(0)
    +Out[38]: 1
    +In [40]: tc.send(1)
    +Out[40]: 3
    +
    +

    +Here we create a generator (coroutine) called tc. Python knows +it's a generator because its definition contained +a yield statement. Then we run the coroutine +to the first yield with next(tc) +(tc.send(None) would have worked too). We get the +first ticket as a result. Then we as for two more tickets, +and the last time ask to skip one. +

    +
    + +

    +So what's the benefit of the coroutine approach over using +an object? The answer is that to program well, you should +say what you mean. In the case of a single object +and a single coroutine, the different methods of expression +aren't that obvious. But suppose there were many different +coroutines which became ready to run at different times +and that they all had arbitrary, equally important roles +in the overall program... choosing an object hierarchy and +deciding which object called which others might well be +syntactically opaque compared with an egalitarian collection +of coroutines. Check out Python >=3.4's +asyncio +library (and keep reading to the end of +this +section) for an example of how coroutines can simply +and elegantly organise different subco-tasks +under the auspices of an event loop. +

    +

    +No imagine each of the coroutines belonged to different +graphic objects, each of which needs to communicate with +other objects at any time the user chooses to interact +with them. They can do this by communicating though +a single executive which can gather all +the information the waiting coroutines may (asynchronously) +yield. Does that sound like a GUI yet? +

    +

    +One last point to make is that what is being described here +is in no way "parallel processing". It is co-operative +multitasking. The coroutines get to keep the single +thread of execution until they yield it up. +Coroutines don't run in parallel (for example +on multiple cores of a modern CPU) but neither do they +impose the considerable overhead of starting a new process, +allocating resources and resynchronising the machine when +necessary. You can perform a 4096-point FFT on a single core +of a modern Intel processor faster than you can force +two threads on two different cores to synchronise. +Coroutines permit the expression of complex interactions +between entities handling asynchronous events in a +convenient way which is efficient for both the programmer +and the computer. +

    +

    +Coroutines feature big-time "under the hood" of the GUI +toolkit we're going to use in due course, and if you +understand what they do, it will demystify what's going +on. We'll also fire up a separate thread of execution +which will jump to C++-space, permitting potentially +generally parallel execution, but Python makes sure it +will never execute code concurrently within a single +instance of its interpreter. +

    +

    +Now, about Graphic User Interfaces... +

    +
    +

    GUI components: the MVC model

    +

    ...On to some programming

    +
    + + +
    + +

    Exercise 17: A Very Simple Example

    + +
    +

    Background

    +

    +

    + +
    + +
    + + + + + + + +

    Back to main

    + + +
    + +

    +Unless otherwise noted, all materials on these pages +are licenced under a Creative +Commons Licence. +

    + + + + From 1b06b732074dc4573f82cdb0cbb8edfe8999bb50 Mon Sep 17 00:00:00 2001 From: Nick Bailey Date: Mon, 27 Feb 2017 21:04:22 +0000 Subject: [PATCH 12/25] Short section on MVC --- python/labs/lab-qt.html | 70 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 68 insertions(+), 2 deletions(-) diff --git a/python/labs/lab-qt.html b/python/labs/lab-qt.html index 034be66..d09fde3 100644 --- a/python/labs/lab-qt.html +++ b/python/labs/lab-qt.html @@ -165,7 +165,8 @@
    Creating a coroutine
    So what's the benefit of the coroutine approach over using an object? The answer is that to program well, you should say what you mean. In the case of a single object -and a single coroutine, the different methods of expression +and a single coroutine, the difference between +the two methods of expression aren't that obvious. But suppose there were many different coroutines which became ready to run at different times and that they all had arbitrary, equally important roles @@ -221,6 +222,71 @@
    Creating a coroutine


    GUI components: the MVC model

    +

    +

    +
    Model View Controller interaction
    +
    +By Totallybradical - Own work, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=56162327 +
    +If you've learned one thing from this course, I hope it's +that you should design your program before writing a single +line of code. It's therefore appropriate at this juncture +to review the current thinking behind the design of modern +GUI systems. +

    +

    +GUI programs are generally composed from Widgets (the +generic name for buttons, text entry fields, spin-boxes, +sliders and other graphical components) assembled into +one or more frames. The widgets are positioned +by a layout manager whose job it is to construct +their spacing and size in accordance with the style rules +for the platform on which the program is running. +

    +

    +All widget sets will enable the programmer to +define new widgets, but the choice of a modern and popular +widget set makes it unlikely that it will ever be necessary +to do more than enhance the functionality of one of the +supplied widgets. +

    +

    +It is considered to be good design to split the interface up +into three aspects: the model, view +and controller. +

    +
      +
    • The model determines the behaviour +of a widget in response to input and defines the information +available to the application program. It is independent of +the user interface. If the idea of the widget were +reimplemented in a non-graphical way, for example for +blind users, the model would remain unchanged.
    • +
    • The view is concerned with the presentation of +the widget to the user and hence determining to +an extent what input gestures take effect. The application +may supply different views depending upon the intended +platform: on a phone, a photo gallery might move to +the next image with a swipe, whereas on a workstation +it may accept a mouse click. The view will not be involved +in the interpretation of such gestures, only reporting +them.
    • +
    • The controller supplies the logic to connect the +model and the view. It can send commands to the model +to update its state ("next photo") and when instructed +buy the model, sends the necessary commands to the view +to maintain the widget's consistency
    • +
    +

    +Splitting the GUI into these three aspects ensures maximum +code reuse and enables consistency of behaviour across a +variety of access methods with as little code modification +(read "breaking") as possible. The diagram summarises the +interactions. The widget set will permit us to add ways for +the widget's controller to let the application program +know when something has happened. +

    +

    ...On to some programming

    @@ -231,7 +297,7 @@

    Exercise 17: A Very Simple Example

    Background

    -

    +

    http://zetcode.com/gui/pyqt5/

    From 4cf0951bb51ea69ae765ad93346704d9247b88df Mon Sep 17 00:00:00 2001 From: Nick Bailey Date: Tue, 28 Feb 2017 14:14:54 +0000 Subject: [PATCH 13/25] dunno --- python/index.html | 3 --- python/labs/lab-swig.html | 41 +++++++++++++++++++++++++-------------- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/python/index.html b/python/index.html index 00353f5..22a4c7d 100644 --- a/python/index.html +++ b/python/index.html @@ -124,9 +124,6 @@

    Lab Exercises

    20. A very simple example
  • 18. SWIG and numpy nd-arrays -
  • -19. Filtering to a specification -
  • diff --git a/python/labs/lab-swig.html b/python/labs/lab-swig.html index c660f77..b8f01f5 100644 --- a/python/labs/lab-swig.html +++ b/python/labs/lab-swig.html @@ -54,12 +54,14 @@

    Background

    a C++ class as a Python one requires a lot of boiler-plate code because of the differences between the languages. Just think about them: +

    PythonC(++)
    TypesDynamicStatic, Strict
    AllocationOn demandExplict
    Memory ManagementGarbage collectionRAII, explicit or end-of-scope deletion
    +

    Every call to a C(++) function from Python needs to take these differences into consideration, and that makes for a lot of tedious, error prone work to connect the two @@ -89,7 +91,7 @@

    Background

  • Link the wrapper and your original C++ object files to produce a shared library.
  • Start Python, import the shared library - just line any regualar Python module, and enjoy.
  • + just like any regualar Python module, and enjoy.

    @@ -166,7 +168,7 @@

    Your task...

    clear to you.

    -Write two c++ files. In one, write a function which prints +Write two C++ files. In one, write a function which prints "Hello, " followed by its argument. Then write a test file with a main function in it to make sure your C function behaves as you wish it to behave. For example, here's the header file: @@ -272,7 +274,7 @@

    Your task...

    as we get more advanced, we can add extra python-specific functionality to the wrapper, but for now these two lines are all you need. They are simply copied into the output file. -We then parser our "library" header file and prodeuce the +We then parse our "library" header file and produce the C++ code.

    @@ -342,7 +344,7 @@

    Background

    The simple Hello World program -in passed a value to a C++ function. It didn't return +passed a value to a C++ function. It didn't return any value, but returning simple built-in types (int, float, double etc) is handled trivially by SWIG and you can call the function @@ -353,7 +355,7 @@

    Background

    An issue arises with C(++) types which are semantically ambiguous. In C (and C++, although it's frowned upon), strings are represented as null-terminated character arrays, -and passed around the programmer as pointers to their +and passed around the program as pointers to their first character. Indeed, the declaration
    char* s = "Hi";
    is really just a shorthand for @@ -448,7 +450,7 @@

    Using Supplied numpy nd-array Typemaps

    Python often returns more than one value with calls like a,b=myfunction(x), but C(++) usually achieves this by having pointers (or references) passed to the function. - If you code already uses numpy, and the return values are all + If your code already uses numpy, and the return values are all of the same type, an INPLACE array might be used to return them. There is also the ARGOUTVIEWM_ARRAYx template to allow properly memory-managed views of public arrays in your C++: @@ -456,14 +458,23 @@

    Using Supplied numpy nd-array Typemaps

    multiple values, you might ask yourself whether you shouldn't do the Pythonic thing and return a tuple.

    +
    +

    Reference Documents

    -

    The full story on - SWIG - Typemaps.

    -

    Documentation - for the numpy SWIG interface specification.

    - + +
    @@ -479,7 +490,7 @@

    Your task...

    If you have your own local copy of numpy, tell the C++ compiler to use its header files with (e.g.)
    - export CPLUS_INCLUDE_PATH=/local/anaconda/32/lib/python3.5/site‑packages/numpy/core/include/ + export CPLUS_INCLUDE_PATH=/local/anaconda/32/lib/python3.5/site‑packages/numpy/core/include
    That's where anaconda's up-to-the-minute numpy resides on the lab machines.
    @@ -509,7 +520,7 @@

    Your task...

     // File: min_max_sum.h
     //
    -// Given an array of double, return its minumum and
    +// Given an array of doubles, return its minimum and
     // maximum values and the sum of its contents in
     // diverse and amusing ways.
     //
    @@ -524,7 +535,7 @@ 

    Your task...

    double* min, double* max, double* sum); // return the min, max and sum of the given numpy array 'in'. - // SWIG will write the values into the give numpy array, 'out'. + // SWIG will write the values into the given numpy array, 'out'. static void mms_a(double* out, std::size_t out_size, const double* in, std::size_t in_size); }; From 334b429cbddf77d2bdf970a6b1a03da662e1444c Mon Sep 17 00:00:00 2001 From: Nick Bailey Date: Tue, 28 Feb 2017 17:14:15 +0000 Subject: [PATCH 14/25] Slight tidy-up and a typo --- python/labs/MVC-basic.svg | 1 + python/labs/lab-qt.html | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 python/labs/MVC-basic.svg diff --git a/python/labs/MVC-basic.svg b/python/labs/MVC-basic.svg new file mode 100644 index 0000000..0039cc2 --- /dev/null +++ b/python/labs/MVC-basic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/python/labs/lab-qt.html b/python/labs/lab-qt.html index d09fde3..9dd94a2 100644 --- a/python/labs/lab-qt.html +++ b/python/labs/lab-qt.html @@ -182,7 +182,7 @@
    Creating a coroutine
    under the auspices of an event loop.

    -No imagine each of the coroutines belonged to different +Now imagine each of the coroutines belonged to different graphic objects, each of which needs to communicate with other objects at any time the user chooses to interact with them. They can do this by communicating though @@ -226,7 +226,8 @@

    GUI components: the MVC model

    Model View Controller interaction

    -By Totallybradical - Own work, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=56162327 +By Totallybradical - Own work, CC BY-SA 4.0, +https://commons.wikimedia.org/w/index.php?curid=56162327
    If you've learned one thing from this course, I hope it's that you should design your program before writing a single From f78b76053dbbc393925f7ae56c77006f959d47f8 Mon Sep 17 00:00:00 2001 From: Nick Bailey Date: Wed, 1 Mar 2017 17:26:22 +0000 Subject: [PATCH 15/25] Starting Background --- python/labs/lab-qt.html | 62 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 57 insertions(+), 5 deletions(-) diff --git a/python/labs/lab-qt.html b/python/labs/lab-qt.html index 9dd94a2..70a76eb 100644 --- a/python/labs/lab-qt.html +++ b/python/labs/lab-qt.html @@ -160,7 +160,10 @@
    Creating a coroutine
    and the last time ask to skip one.

    - +
    +

    Read this next ⇗

    +
    +

    So what's the benefit of the coroutine approach over using an object? The answer is that to program well, you should @@ -182,7 +185,7 @@

    Creating a coroutine
    under the auspices of an event loop.

    -Now imagine each of the coroutines belonged to different +No imagine each of the coroutines belonged to different graphic objects, each of which needs to communicate with other objects at any time the user chooses to interact with them. They can do this by communicating though @@ -226,8 +229,7 @@

    GUI components: the MVC model

    Model View Controller interaction

    -By Totallybradical - Own work, CC BY-SA 4.0, -https://commons.wikimedia.org/w/index.php?curid=56162327 +By Totallybradical - Own work, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=56162327
    If you've learned one thing from this course, I hope it's that you should design your program before writing a single @@ -275,7 +277,7 @@
    Model View Controller interaction
  • The controller supplies the logic to connect the model and the view. It can send commands to the model to update its state ("next photo") and when instructed -buy the model, sends the necessary commands to the view +by the model, sends the necessary commands to the view to maintain the widget's consistency
  • @@ -298,7 +300,57 @@

    Exercise 17: A Very Simple Example

    Background

    +

    +We're going to use the Qt widget set to design a GUI program. +Qt (pronounced "Cute") is a cross-platform toolkit +written by Trolltech, and currently owned by +The Qt Company in Finland. +It is dual licensed under both version 3 of the +GNU +Public License and a proprietary licence which +permits distribution of software without the obligations +attached to GPLv3. This document is based on version 5 +of Qt. +

    + +

    +Qt is written in C++, so the +documentation +assumes that the reader will be creating classes +and calling methods from a C++ program. +We're going to use it via Python modules +created from the C++ API using SWIG. The top-level +Python module is called PyQt5. PyQt5 has its own +documentation +but for the most part, it simply instructs you +how to load the Python class and then simply +directs you to the Qt C++ documentation page. +

    + +

    +At some time or another, you'll most likely be asked to +use some other GUI framework to write a program. +There's no good reason for that as there are a huge +number of reliable and large-scale applications +written with Qt, for example +MusE, +Rosegarden, +MuseScore, +Frescobali, +Kdenlive, + + + + +

    + +
    + +
    +

    Details and Reference

    http://zetcode.com/gui/pyqt5/ +
    Qt5 documentation +
    PyQt5 documentation

    From cdf07bba036250db068a1afa8c12291d9dca5d8e Mon Sep 17 00:00:00 2001 From: Nick Bailey Date: Thu, 2 Mar 2017 18:59:41 +0000 Subject: [PATCH 16/25] Simple Qt application with some background notes --- python/labs/lab-qt.html | 268 +++++++++++++++++++++++++++++++++++- python/labs/qt_sketch-1.png | Bin 0 -> 18763 bytes python/labs/qt_sketch-2.png | Bin 0 -> 77296 bytes python/labs/qt_sketch-3.png | Bin 0 -> 101225 bytes 4 files changed, 265 insertions(+), 3 deletions(-) create mode 100644 python/labs/qt_sketch-1.png create mode 100644 python/labs/qt_sketch-2.png create mode 100644 python/labs/qt_sketch-3.png diff --git a/python/labs/lab-qt.html b/python/labs/lab-qt.html index 70a76eb..eed08fb 100644 --- a/python/labs/lab-qt.html +++ b/python/labs/lab-qt.html @@ -338,24 +338,286 @@

    Background

    MuseScore, Frescobali, Kdenlive, +Spyder, +Skype, +Google Earth, +Scribus, +Sibelius, +VLC +and Spotify's client +to name but a few. +

    +

    +The Qt application usually consists of a QApplication +instance and one or more QWidgets which define the +visual appearance. Depending on the platform style guidelines, +the widget might consist of a framed window, a menu bar, +a toolbar, and an interaction area consisting of a variety +of widgets drawn from the familiar standard types (spin boxes, +editable and read-only text areas, images, sliders, push-buttons +and so on). An application might present the user with dialogues +in other windows during the course of its execution. +Such dialogues might be modal (grab the application's inputs +until it is dismissed) or not depending on the program's +requirements. +

    +

    +Once the widgets are created they can be laid out using +one of Qt's layout managers. This ensures that +window resizing causes the widgets to expand and/or +move around in an expected fashion. Several different +layout algorithms are available and one can be chosen +to suit the complexity of the GUI being designed. +The program will create a layout manager instance +and attach it to its window, then add widgets to +the layout manager. Layout managers may be nested +hierarchically. Having created, populated and laid-out +the window, its show() method can be +called to make it appear on the screen, and control +handed over to Qt's event-handling loop. +

    +

    +That's only half the story, however. If you want the +program to respond to user inputs, the widgets have +to inform the relevant functions of the application +when user-events happen to them. Different GUI +frameworks have different ways of doing this, and +the way Qt does it has been somewhat controversial +in the past. The idea is that QObjects +can emit signals to send information about +events to interested listeners and slots +to receive such information. Why is this controvertial? +Because the slots were implemented by extending +the C++ language and then running a +metaobject compiler on them to obtain a +compilable C++ file. This enraged the C++ standards +people and almost started a civil war. Consider the following +C++ code. It creates a window with a single button +(that bit's omitted for brevity) and changed the +button's label when it's clicked. +

    +
    +class MyWindow :
    +   public QWidget,
    +   public Ui::AMainWindow
    +{
    +   Q_OBJECT
    +public:
    +   explicit MyWindow(QWidget *parent = 0) :
    +       QWidget(parent)
    +   {
    +       // create the interface
    +       this->setupUi(this);
    +
    +       // connect the signal to lambda
    +       // (using [this] to capture 
    +       // the object's this pointer)
    +       connect(theButton,
    +               &QPushButton::clicked,
    +               [this]() {
    +                   this->setString("Bye!");
    +               });
    +   }
    +
    +public slots:
    +   void setString(QString text)
    +   {
    +       theButton->setText(text);
    +   }
    +};
    +
    + +

    +The Q_OBJECT gets expanded to include +the necessary "boiler-plate", but the main bone +of contention is the public slots: +access specifier. public slots: isn't +valid C++: it's expanded by the MOC to generate +the necessary public function which can accept +signals. Then then QObject's +connect function is used to cause +theButton's clicked +signal to propagate to the given function. +In this case we want to pass an argument, +so we use a C++ λ-expression to call +the this MyWindow's setString() +method with the desired value. +

    + +

    +As you can imagine, building a hierarchy of widgets +which send each other signals presents a challenge +with C++'s memory model. Qt is very carefully written +to handle memory very efficiently and seems to be +watertight — at least I've never experienced +a memory leak that wasn't my fault. It even has a +QObject::deleteLater() method so you +can request the event loop to destroy an object +as soon as it's safe to do so. Of course, the other +way around that is to write in Python, where the +memory-management point is moot.

    -

    Details and Reference

    -

    http://zetcode.com/gui/pyqt5/ +

    Getting Started and Reference

    +

    +Let's write an application! +

    +

    +Perhaps more than with any other kind of program, +you should begin by sketching the appearance of what +you want. Here's what I want the main window of my +program to look like. +

    + +

    +The code to create my class, ExecutiveToy +is this: +

    +
    +class ExecutiveToy(QWidget):
    +
    +    def __init__(self, parent = None):
    +        super().__init__(parent)
    +        self.create_UI(parent)
    +
    +

    +I'm going to break the layout into two rows, so the +main layout manager of my window will be a QVBoxLayout +with two elements: +

    + +

    +The lower of the two rows will contain three elements: +two QPushButtons and some elastic filler +to push the buttons to the outer edge of the window. +That way it will keep a consistent layout if and when +it is resized. +

    + +

    +Let's create the widgets. Continuing the ExecutiveToy +class: +

    +
    +    def create_UI(self, parent):        
    +        # Create a slider and two buttons
    +        self.mySlider = QSlider(Qt.Horizontal)
    +        self.showButton = \
    +            QPushButton(self.tr('&Show Value'))
    +        self.quitButton = \
    +            QPushButton(self.tr('&Quit'))
    +        
    +        # No parent: we're going to add this
    +        # to vLayout.
    +        hLayout = QHBoxLayout()
    +        hLayout.addWidget(self.showButton)
    +        hLayout.addStretch(1)
    +        hLayout.addWidget(self.quitButton)
    +        
    +        # parent = self: this is the
    +        # "top level" layout
    +        vLayout = QVBoxLayout(self)
    +        vLayout.addWidget(self.mySlider)
    +        vLayout.addLayout(hLayout)  
    +
    +

    +Now to define the actions. I'm going to do +two things. First I'll connect the clicked +signals of the buttons to their respective +slots, then I'll provide the functions which +will act as slots. PyQt provides +decorators +to hint to the interpreter that a function is +a slot. If you are expecting your slot to +receive arguments, you can say +@pyqtSlot(int) for example. +

    + +

    +The quitClicked() method simply +closes the widget; the showClicked() +method creates a modal dialogue box, populates +it with some data from the slider object, +and gives it control. +

    +
    +        self.quitButton.clicked.connect(
    +            self.quitClicked
    +        )
    +        self.showButton.clicked.connect(
    +            self.showClicked
    +        )
    +    
    +    # Now the slots which accept events
    +    @pyqtSlot()
    +    def quitClicked(self):
    +        self.close()
    +        
    +    @pyqtSlot()
    +    def showClicked(self):
    +        msg = QMessageBox()
    +        msg.setIcon(QMessageBox.Information)
    +    
    +        msg.setText('Current Slider Value')
    +        msg.setInformativeText(
    +            'When requested, value was '
    +            + str(self.mySlider.value())
    +        )
    +        msg.setWindowTitle('mySlider')
    +        msg.setDetailedText('That is all I know')
    +        msg.setStandardButtons(QMessageBox.Ok)
    +    	
    +        msg.exec()
    +
    +

    +To make it all work, you'll need to top and tail the code +with the necessary imports and a few lines +to create the application and its window, make the window visible, +then pass control to Qt's event loop until the window is closed, +whereupon the application should exit cleanly. Here is +the appropriate incantation: +

    +
    +import sys
    +from PyQt5.QtCore import \
    +    Qt, pyqtSlot
    +from PyQt5.QtWidgets import \
    +    QApplication, QWidget, \
    +    QSlider, QPushButton, \
    +    QMessageBox, \
    +    QVBoxLayout, QHBoxLayout
    +    
    +...
    +
    +if __name__ == "__main__":
    +
    +    app = QApplication(sys.argv)
    +    window = ExecutiveToy()
    +    window.show()
    +    sys.exit(app.exec_())
    +
    +
    + +

    Zetcode's Introduction to PyQt5
    Qt5 documentation
    PyQt5 documentation +
    Python Decorators

    +
    +
    +

    Read this next ⇗

    +
    -
    + diff --git a/python/labs/qt_sketch-1.png b/python/labs/qt_sketch-1.png new file mode 100644 index 0000000000000000000000000000000000000000..97fb6ab3a51a7c423483a548e6c1945850c0649c GIT binary patch literal 18763 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 literal 0 HcmV?d00001 diff --git a/python/labs/qt_sketch-2.png b/python/labs/qt_sketch-2.png new file mode 100644 index 0000000000000000000000000000000000000000..63f03dbf32ed03697dea5645e3780485fbcec1bd GIT binary patch literal 77296 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

    dQDn@uEbb?nQC)1@ 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 literal 0 HcmV?d00001 diff --git a/python/labs/qt_sketch-3.png b/python/labs/qt_sketch-3.png new file mode 100644 index 0000000000000000000000000000000000000000..533e717295709926c28e554da7c303577b9f04c3 GIT binary patch literal 101225 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 OilVHFOtF;loBsiSWI(q7 literal 0 HcmV?d00001 From 01e914e4682bc6114d68a16c65c8e1768e252337 Mon Sep 17 00:00:00 2001 From: Nick Bailey Date: Tue, 7 Mar 2017 17:21:20 +0000 Subject: [PATCH 17/25] QtMultimedia and Mido --- python/labs/lab-qt.html | 379 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 365 insertions(+), 14 deletions(-) diff --git a/python/labs/lab-qt.html b/python/labs/lab-qt.html index eed08fb..1a1af10 100644 --- a/python/labs/lab-qt.html +++ b/python/labs/lab-qt.html @@ -21,7 +21,7 @@
    Creating an object
    def __init__(self): self._seq = 0; - # Return the next in seqence, + # Return the next in sequence, # skipping as required. def get(self, skip): ticket = self._seq @@ -98,17 +98,20 @@
    Creating an object
    Creating a coroutine
     # Turn counting with a co-routine
    -# (also called a generator object in Python)
    +# (also called a generator in Python)
     def turn_counter():
    -    # Our state variable local to this function
    -    _seq = 0
    +    # Our state variable,
    +    # local to this function
    +    seq = 0
         
         while True:
    -        # Pass back the sequence count to our
    -        # coroutine, and receive the next skip value
    -        skip = yield _seq
    -        # Do some processing and loop forever
    -        _seq += 1 + skip
    +        # Pass back the sequence count
    +        # to our coroutine, and receive
    +        # the next skip value
    +        skip = yield seq
    +        # My turn to use the CPU: do some
    +        # processing and yield the result
    +        seq += 1 + skip
     

    The clue's in the name: a coroutine isn't subordinate to its caller @@ -151,7 +154,7 @@

    Creating a coroutine
    Out[40]: 3

  • 19. Thinking about GUIs
  • -20. +20. A(nother) Very Simple Example
  • @@ -72,7 +72,7 @@

    -Here we create a generator (coroutine) called tc. Python knows +Here we create a generator (coroutine) called tc. Python knows it's a generator because its definition contained a yield statement. Then we run the coroutine to the first yield with next(tc) @@ -295,7 +298,7 @@

    ...On to some programming


    - +

    Exercise 17: A Very Simple Example

    @@ -396,7 +399,7 @@

    Background

    compilable C++ file. This enraged the C++ standards people and almost started a civil war. Consider the following C++ code. It creates a window with a single button -(that bit's omitted for brevity) and changed the +(that bit's omitted for brevity) and changes the button's label when it's clicked.

    @@ -617,11 +620,359 @@

    Getting Started and Reference


    - +

    +Being single-threaded, The Qt executive has to be in charge +at all times. So it isn't possible to write a single function +which loops around for an arbitrary time generating +audio samples. This is why we asked you to make your +audio-generating classes capable of working with +small buffers, and be called repeatedly as more samples +were required. +

    +

    +The framework with Qt to deal with audio samples is +called QtMultimedia. It uses a stream model +to create and route audio and/or video streams. +If we use QtMultimedia, the executive will provide +the necessary time for the Qt application to generate +buffers of audio samples as required. However, +if we want our audio synthesis object to be +a bona fide output stream, we have to +"play ball" with the Qt executive, and that +means providing the minimum functionality it +expects. This isn't intellectually taxing, but +it does take around 100 lines of Python code. +

    + +

    +We might hope that Qt also handles MIDI input and +output so we can connect to MIDI event sources +which will appear in our program as signals, +or create MIDI synthesisers which accept MIDI +events via sockets. Sorry to disappoint you. +There is no MIDI support in Qt at this time. +Qt is considered a general-purpose GUI framework +for general use, and while that includes audio +and video these days, the Qt developers think +of MIDI as just a bit too specialist. +

    +

    +Fortunately, a(t least one) solution exists, +and we'll be using python's Mido module to handle +the arrival of MIDI events. This will be covered +later on, but first, let's write a(n almost) trivial +audio class. Meep is generates a 1kHz +tone which Qt can play. +

    + +
    +
    +

    QtMultimedia

    +
    +

    Looking to your right...

    +

    +Opposite is the code for a mimimalist PyQt +QIODeivce-based audio generator. It's quite long, +so I've not broken it up into fragments. You'll +have to pay attention. +

    + +

    +We'll begin by defining some "application-wide" +constants and here I'm just using global variables +to hold the sample rate, number of channels +and audio resolution in bits. I'm also specifying +how big the "chunk size" is. That is to say, +if I'm asked for the next batch of samples, +the caller's going to get this many milliseconds' +worth of audio. +

    + +

    +After importing the module's dependencies, +I'm declaring my signal generating class Meep. +Meep will generate at most SAMPLES_PER_READ +samples per request. Making this number smaller means +lower latency between changing a control parameter +and the response taking effect in the audio output +stream, but also causes a greater overhead passing +samples around and in the worst case can lead to +"stuttering" if the samples are prepared before +the audio playback hardware needs them. +

    + +

    +Meep is derived from QIODevice, so its initialiser +first makes sure the base class is initialised. +The it reserves a QByteArray, data, +which will hold the raw audio samples, and +phase which will preserve the final +phase of the previous audio output between calls +to make sure the audio is click-free. +

    + +

    +QIODevices are supposed to be capable of dealing with +a number of output sample formats, but this is a minimum +example so only 16-bit, signed integer, little-endian +samples will be countenanced. The format type is checked +and if it agrees, a congratulatory message will be issued. +

    + +

    +A QIODevice can be used it one of two ways. +In push mode, you write a bunch of samples to +it and it plays them. This is great for simple "plink fizz" +special effects which might be needed to alert that user +that something interesting has happened. However, we need +to use the device in pull mode so that we're +informed via the Qt system when more samples are required, +then supply them. This means all the other GUI-related +activity can continue concurrently with a continuous audio +output. Such a device needs to supply a start method +and in this case it's a simple one: the parent +QIODevice's open method to indicate +the device's readiness and to place it into read-only mode. +

    + +

    +The other required method is readData +but I've chosen to provide a generateData +method to segregate the sample generation activity +from the mechanics of preparing samples for dispatch. +It uses a trivial vector-sin together +with arange to create a sinusoid from +an array of phase angles, then saves the phase for +the next call so that the waveform recommenced from +the "same place". In case the phase angle eventually +waxes too large, it is stored modulus 2π. +The 16-bit integer samples are +returned as a byte array using the tostring +method of a numpy array. +

    + +

    +Qt's executive will call readData when +the output stream needs more bytes. Note that the +number of bytes is what is specified, not +the number of samples. We know we only work with +16-bit integers, so we ask generateData +to produce half that number of samples or, +to preserve interactivity, SAMPLES_PER_READ +samples if that number is smaller. +The binary representation of the samples is returned. +

    + +

    +Now for the QWidget which deploys a +Meep. The audio format of the Meep +needs to be specified, so the local variable format +specifies this. An audio output device is summoned +into existence with an agreeing format and stored +in self.output. Its buffer size is kept to within +the limits specified by the CTRL_INTERVAL. +

    + +

    +Finally, self.generator is an instance of Meep. +After starting our Meep it's used to supply +the input data to self.output by passing it +to the latter's start method. +

    + +

    The rest of the code is unremarkable.

    +
    +
    +

    A(n almost) Minimal Audio Output Class

    +
    +SAMPLE_RATE = 32000
    +AUDIO_CHANS = 1
    +SAMPLE_SIZE = 16
    +CTRL_INTERVAL = 100 # milliseconds of audio
    +
    +import sys
    +import numpy as np
    +from PyQt5.QtCore import QByteArray, QIODevice
    +from PyQt5.QtMultimedia import QAudioFormat, \
    +                               QAudioOutput
    +from PyQt5.QtWidgets import QApplication, \
    +                            QWidget
    +
    +class Meep(QIODevice):
    +    
    +    SAMPLES_PER_READ = 1024
    +    
    +    def __init__(self, format, parent = None):
    +
    +        QIODevice.__init__(self, parent)
    +        self.data = QByteArray()
    +        
    +        # Preserve phase across calls
    +        self.phase = 0
    +        
    +        # Check we can deal with the supplied
    +        # sample format. We're supposed to be
    +        # able to deal with any requested
    +        # sample format. But this is a
    +        # _minimal_ example, right?
    +        if format.isValid() and \
    +           format.sampleSize() == 16 and \
    +           format.byteOrder() == \
    +                QAudioFormat.LittleEndian and \
    +           format.sampleType() == \
    +                QAudioFormat.SignedInt and \
    +           format.channelCount() == 1 :
    +               print(
    +                 "Meep: Format compatible. Good."
    +               )
    +               self.format = format
    +    
    +    
    +    def start(self):
    +        
    +        # Call QIODevices open
    +        # making this object readable
    +        self.open(QIODevice.ReadOnly)
    +    
    + 
    +    def generateData(self, format, samples):
    +        
    +        pps = 1000*2*np.pi/format.sampleRate()
    +        finalphase = samples*pps + self.phase
    +        tone = (
    +          10000 * np.sin(
    +            np.arange(self.phase,
    +                      finalphase,
    +                      pps)
    +          )
    +        ).astype(np.int16)
    +        
    +        self.phase = finalphase % (2*np.pi)
    +        return tone.tostring()
    +    
    +    
    +    def readData(self, bytes):
    +
    +        if bytes > 2 * Meep.SAMPLES_PER_READ:
    +            bytes = 2 * Meep.SAMPLES_PER_READ
    +        return self.generateData(self.format,
    +                                 bytes//2)
    +
    +
    +class ToneGenerator(QWidget):
    +    
    +    def __init__(self, parent=None):
    +        
    +        QWidget.__init__(self, parent)
    +
    +        format = QAudioFormat()
    +        format.setChannelCount(AUDIO_CHANS)
    +        format.setSampleRate(SAMPLE_RATE)
    +        format.setSampleSize(SAMPLE_SIZE)
    +        format.setCodec("audio/pcm")
    +        format.setByteOrder(
    +            QAudioFormat.LittleEndian
    +        )
    +        format.setSampleType(
    +            QAudioFormat.SignedInt
    +        )
    +
    +        self.output = QAudioOutput(format, self)
    +        output_buffer_size = \
    +            int(2*SAMPLE_RATE \
    +                 *CTRL_INTERVAL/1000)
    +        self.output.setBufferSize(
    +            output_buffer_size
    +        )
    +        
    +        self.generator = Meep(format, self)        
    +        self.generator.start()
    +        self.output.start(self.generator)
    +
    +
    +if __name__ == "__main__":
    +
    +    app = QApplication(sys.argv)
    +    window = ToneGenerator()
    +    window.show()
    +    sys.exit(app.exec_())
    +
    +
    + +
    +

    What about MIDI?

    + +
    +

    It's easy.

    +

    +If you use mido, +Reading MIDI events is as concise as +QIODevice was verbose. +

    +

    +GNU/Linux supports a variety of MIDI backends +so on that platform you'll have to tell it which +one to use. One of the most tried and tested is +librtmidi, and to use that you'll +have to install the python3-librtmidi package +if it isn't already on your machine. I've chosen +this one because it's so widely used, but also +because it supports virtual MIDI devices +meaning you can create a virtual MIDI port (called +"pipes" in this application) and route MIDI signals +to it. +

    + +

    +After that we just sit and wait for MIDI signals. +mido can tell you the type of +the signal (Note_on, Note_off, etc) and also let you +access the three-byte MIDI message in the raw. +That lets you access information like the key-number +and the velocity on a Note_on event. +

    + +

    +There's only one problem here. The with +loop declares and opens the MIDI input (mip) +but this code fragment sits and reads the input forever, +producing MIDI messages (mmsg) as they arrive. +This is incompatible with the +Qt executive which expects functions to complete +their work and hand control back a short time. +Something needs to be done about this. And the way +to do it is... +

    +
    +
    +

    Reading MIDI events

    +
    +import mido
    +
    +mido.set_backend(
    +    'mido.backends.rtmidi/LINUX_ALSA'
    +)
    +print(
    +    "Using MIDI APIs: {}".format(
    +        mido.backend.module.get_api_names()
    +    )
    +)
    +
    +with mido.open_input(
    +    'pipes',
    +    virtual=True
    +) as mip:
    +    for mmsg in mip:
    +        print(mmsg.type)
    +        print(mmsg.bytes())
    +
    +
    +
    +

    QtThread

    From 983a6927891e8fe8b3b001591e582fcab7eacf02 Mon Sep 17 00:00:00 2001 From: Nick Bailey Date: Wed, 8 Mar 2017 10:56:16 +0000 Subject: [PATCH 18/25] QThreads --- python/labs/lab-qt.html | 190 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 186 insertions(+), 4 deletions(-) diff --git a/python/labs/lab-qt.html b/python/labs/lab-qt.html index 1a1af10..5c16e1e 100644 --- a/python/labs/lab-qt.html +++ b/python/labs/lab-qt.html @@ -902,10 +902,10 @@

    A(n almost) Minimal Audio Output Class


    -

    What about MIDI?

    +

    What about MIDI?

    -

    It's easy.

    +

    It's easy.

    If you use mido, Reading MIDI events is as concise as @@ -972,14 +972,196 @@

    Reading MIDI events


    -

    QtThread

    +

    QThread

    +
    +

    Python and Threads

    +
    +Whenever faced with a problem, some people say +"Let's use Threads". +
    +Now, they have two problems. +

    after D. Tilbrook, USENET, 1988

    +
    +

    +Until very recently, Python ignored multiprogramming. +This is a good thing to do if you can. Multiprogramming +opens a whole new can of worms. In addition to the +usual bugs, there will be deadlocks, races, and other +dynamic conditions which can cause the system to +lock-up for no apparent reason even when the multiple +threads of execution have all be tested and shown +to work perfectly. In the early 1980s, Tony Hoare showed it +was possible to prove a multi-threaded +program to be deadlock free, but only if (some would +say impractically rigorous) conditions were imposed +on the programming language and run-time. +

    +

    +Python saw itself as a RAD (Rapid Application Development) +language which did not concentrate on running as fast +as possible. However even some phones have 8 CPU cores +(in 2017) so to ignore multiprogramming condemns the +application to use no more than 12½% of the device's +processing capacity. Consequently, in Python 3, +we have the threading module to support +multiple execution threads. This module does not +do what you probably think it does. +CPython, which is the one you are probably used +(so-called because it's written in C), implements +a "Global Interpreter Lock" (GIL) Mutex. So multiple +threads can't run in a single Python interpreter +at the same time. Sure you can represent a +program as a collection of threads, but they +won't run concurrently, however many processor cores +your machine has. It's so hard to make the interpreter +thread-safe (memory allocation being the main source +of difficulty) that the GIL won't allow it. +Fortuantely, The GIL is released when a thread enters +an external library (such as Qt, via a PyQt call) +whereupon all the problems associated with multitasking +become the external library's problem. The utter nightmare +that is process synchronisation and inter-process +communication is handled in a safe and memory-tight +way by Qt signals and slots +so we can thank our lucky stars for that. +

    +

    +The question arises should we use a Qt thread or a +Python native thread to read the MIDI port in the +background. It's really up to you. Since we're +using the Qt framework for everything else, it +seems sensible not to court disaster by trying +to go it alone on thread provision. If you were +writing a program which didn't use the Qt framework, +you'd probably want to use Python native threads +to avoid importing a whole sophisticated run-time +environment just for that one feature. Really, +the best thing to do is to try not to use threads +at all, but here is a good time to use them. +

    +

    +There is more than one way to start a QThread. +In the example opposite, I've chosen to extend +a QObject, create a thread, then +move the object into that thread. This allowed +me to wire up the signals and slots associated +with the object before handing it off to run in +its own little universe. +You might alternatively have extended a thread +object and overriden its run method. +See the QThread +documentation +and +use notes. +

    + +
    +
    +

    QThread example and References

    +
    Suggested template for a MIDI port reader object
    +
    +class MidiPortReader(QObject):
    +
    +    # Create a signal for when a
    +    # MIDI note_on happens
    +    newNoteFrequency = pyqtSignal(float)
    +    
    +    # Object initialisation:
    +    def __init__(self):
    +        QObject.__init__(self)
    +        ...
    +    
    +    # Define a function which is to
    +    # run in its own thread
    +    def listener(self):
    +        
    +        ....
    +        # Only communicate via the Qt signal
    +        # Qt will stop us hurting ourselves
    +        if something_happens:
    +            self.newNoteFrequency.emit(0.)
    +        ...
    +
    +
    Creating a thread to listen for MIDI events
    +

    +In the main object (probably the QWindow), +you might say something like this to start a +thread listening to a MIDI port and make sure +you receive notifications when notes happen: +

    +
    +# Create the port reader object
    +self.midiListener = MidiPortReader()
    +
    +# Create a thread which will it
    +self.listenerThread = QThread()
    +
    +# Take the object and move it
    +# to the new thread (it isn't running yet)
    +self.midiListener.moveToThread(
    +    self.listenerThread
    +)
    +
    +# Tell Qt the function to call
    +# when it starts the thread 
    +self.listenerThread.started.connect(
    +    self.midiListener.listener
    +)
     
    +# Fingers in ears, eyes tight shut...
    +self.listenerThread.start()
    +
    +# Good grief, IT WORKS!
    +
    +

    +The thread you created can now do blocking +reads on the MIDI port, and the Qt executive +will be able to run its other thread while +that's happening. When the listener function +can run, if the GUI thread is dormant it will +receive midi messages and emit signals, +enabling the GUI/synthesis thread to behave +accordingly. Everyone's a winner. +

    +
    + + +
    +

    Back to main

    -

    Date: Wed, 8 Mar 2017 14:08:52 +0000 Subject: [PATCH 19/25] There's always one more ytpo --- python/labs/lab-qt.html | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/python/labs/lab-qt.html b/python/labs/lab-qt.html index 5c16e1e..2fc38e8 100644 --- a/python/labs/lab-qt.html +++ b/python/labs/lab-qt.html @@ -699,7 +699,7 @@

    Looking to your right...

    and the response taking effect in the audio output stream, but also causes a greater overhead passing samples around and in the worst case can lead to -"stuttering" if the samples are prepared before +"stuttering" if the samples aren't prepared before the audio playback hardware needs them.

    @@ -746,8 +746,8 @@

    Looking to your right...

    with arange to create a sinusoid from an array of phase angles, then saves the phase for the next call so that the waveform recommenced from -the "same place". In case the phase angle eventually -waxes too large, it is stored modulus 2π. +the "same place". To avoid the phase angle eventually +waxing too large, it is stored modulus 2π. The 16-bit integer samples are returned as a byte array using the tostring method of a numpy array. @@ -931,7 +931,7 @@

    It's easy.

    the signal (Note_on, Note_off, etc) and also let you access the three-byte MIDI message in the raw. That lets you access information like the key-number -and the velocity on a Note_on event. +and the velocity of a Note_on event.

    @@ -989,7 +989,7 @@

    Python and Threads

    usual bugs, there will be deadlocks, races, and other dynamic conditions which can cause the system to lock-up for no apparent reason even when the multiple -threads of execution have all be tested and shown +threads of execution have all been tested and shown to work perfectly. In the early 1980s, Tony Hoare showed it was possible to prove a multi-threaded program to be deadlock free, but only if (some would @@ -1006,7 +1006,7 @@

    Python and Threads

    we have the threading module to support multiple execution threads. This module does not do what you probably think it does. -CPython, which is the one you are probably used +CPython, which is the one you are probably using (so-called because it's written in C), implements a "Global Interpreter Lock" (GIL) Mutex. So multiple threads can't run in a single Python interpreter @@ -1016,7 +1016,7 @@

    Python and Threads

    your machine has. It's so hard to make the interpreter thread-safe (memory allocation being the main source of difficulty) that the GIL won't allow it. -Fortuantely, The GIL is released when a thread enters +Fortunately, The GIL is released when a thread enters an external library (such as Qt, via a PyQt call) whereupon all the problems associated with multitasking become the external library's problem. The utter nightmare @@ -1093,7 +1093,7 @@
    Creating a thread to listen for MIDI events
    # Create the port reader object self.midiListener = MidiPortReader() -# Create a thread which will it +# Create a thread which will read it self.listenerThread = QThread() # Take the object and move it From 3fbe1e992cc9823eae108d2e5d1894a2b5502d9e Mon Sep 17 00:00:00 2001 From: Nick Bailey Date: Thu, 9 Mar 2017 12:19:39 +0000 Subject: [PATCH 20/25] The s and d keys are very close together --- python/labs/lab-qt.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/labs/lab-qt.html b/python/labs/lab-qt.html index 2fc38e8..41ca144 100644 --- a/python/labs/lab-qt.html +++ b/python/labs/lab-qt.html @@ -745,7 +745,7 @@

    Looking to your right...

    It uses a trivial vector-sin together with arange to create a sinusoid from an array of phase angles, then saves the phase for -the next call so that the waveform recommenced from +the next call so that the waveform recommences from the "same place". To avoid the phase angle eventually waxing too large, it is stored modulus 2π. The 16-bit integer samples are From f7d4669a0bacab8827d67e503b7fd604541231a8 Mon Sep 17 00:00:00 2001 From: Nick Bailey Date: Thu, 9 Mar 2017 21:45:35 +0000 Subject: [PATCH 21/25] Fix up index, exercise numbers etc --- python/labs/lab-qt.html | 8 +- python/labs/lab4.html | 293 ---------------------------------------- 2 files changed, 7 insertions(+), 294 deletions(-) delete mode 100644 python/labs/lab4.html diff --git a/python/labs/lab-qt.html b/python/labs/lab-qt.html index 41ca144..49678f2 100644 --- a/python/labs/lab-qt.html +++ b/python/labs/lab-qt.html @@ -22,7 +22,11 @@

    19. Thinking about GUIs
  • 20. A(nother) Very Simple Example +
  • +21. QtMultimedia
  • +
  • 22. MIDI
  • +
  • 23. QThreads
  • @@ -669,6 +673,7 @@

    Getting Started and Reference



    +

    QtMultimedia

    Looking to your right...

    @@ -902,6 +907,7 @@

    A(n almost) Minimal Audio Output Class


    +

    What about MIDI?

    @@ -971,7 +977,7 @@

    Reading MIDI events


    - +

    QThread

    Python and Threads

    diff --git a/python/labs/lab4.html b/python/labs/lab4.html deleted file mode 100644 index cb3ee60..0000000 --- a/python/labs/lab4.html +++ /dev/null @@ -1,293 +0,0 @@ - - - -Lab 4 - - - - -
    Back to main - -

    Lab 4 for Audio Programming

    - -
    -Exercises: - -
      -
    • -11. Look-up table (full) -
    • -12. Look-up table (quarter) -
    • -
    - -
    - - -
    - -

    Exercise 11: look-up table (full)

    - -
    - -
    -

    Maths homework

    - -
    -Do this homework on paper. I know that writing stuff on paper by -hand is a drag, but it will save you a lot of time and effort in -the long run. -
    - -

    -Answer these questions, assuming you are creating CD-quality audio -(44100 Hz, 16-bit samples, stereo channels). -

    - -
      -
    • -How large should your look-up table (a numpy array) be for a sine -wave? -
    • -What should the phase increment be to play a sine wave at 1 Hz? -
    • -What should the phase increment be to play a sine wave at 100 Hz? - -
    • - -Make a rough plot of these two functions: -
      -f(x) = sin(x)
      -g(x) = sin(2*x)
      -
      - -Suppose you wanted to create a look-up table for g(x). How large -should that table be? - -
    • - -Write a look-up table for a sine wave with 10 samples, i.e. - -
      - - - -
      Index012...
      Value00.5880.951...
      -
      - -Assume that you are producing audio at 10 hz (yes, ridiculously -low!). - -
        -
      • -Using your table, write the first 10 values you will use for the -audio to produce a sine wave at 2 hz. Make a rough plot of those -values; does the result look like a sine wave? - -
      • -Using your table as much as possible, write the first 5 values you -will use for the audio to produce a sine wave at 0.5 hz. Use any -reasonable approximation to generate the values you have not -pre-calculated. - -
      • - -
      -
    • -
    -
    - -
    - -
    -

    Your task...

    - -
    -Stop! Before you try to write a program, you must finish the -maths homework. -
    - -

    -Let the user specify a frequency, then generate a sine wave at -that frequency -

    - -
      -
    • -You must calculate your look-up table before asking the user for -their desired frequency. (this imitates the table being -implemented in ROM with silicon) - -
    • -You must use a class for your SineOscillator. All data (look-up -table, internal state, etc) must be part of that class. - -
    • -Given the previous point, you should not need to change anything -from your program in exercise 10 other than your SineOscillator -class. - -
    • -
    - -

    ... show your work to a demonstrator

    -
    - - - -
    - -

    Exercise 12: look-up table (quarter)

    - -
    - -
    -

    Maths homework

    - -
    -Do this homework on paper. I know that writing stuff on paper by -hand is a drag, but it will save you a lot of time and effort in -the long run. -
    - -
      -
    • -Plot one full sine wave, then draw vertical lines diving it into -quarters. For each quarter, indicate whether the quarter is -mirrored or flipped. - -
    • -Write a quarter look-up table for a sine wave with 10 -samples, i.e. -

      - -
      - - - -
      Index012...
      Value00.1560.309...
      -
      - -Assume that you are producing audio at 10 hz (yes, ridiculously -low!). - -
        -
      • -Using your table, write the first 10 values you will use for the -audio to produce a sine wave at 2 hz. - -
      • -
      -
    -
    - -
    - -
    -

    Your task...

    - -
    -Stop! Before you try to write a program, you must finish the -maths homework. -
    - -

    -Let the user specify a frequency, then generate a sine wave at -that frequency -

    - -
      -
    • -You must calculate your quarter look-up table before -asking the user for their desired frequency. (this imitates the -table being implemented in ROM with silicon) - -
    • -You must use a class for your SineOscillator. All data (look-up -table, internal state, etc) must be part of that class. - -
    • -Given the previous point, you should not need to change anything -from your program in exercise 11 other than your SineOscillator -class. - -
    • -
    - -

    ... show your work to a demonstrator

    -
    - - -

    Move on to Lab 5

    - - -

    Back to main

    - - -
    - -

    -Unless otherwise noted, all materials on these pages -are licenced under a Creative -Commons Licence. -

    - - - - From 5a3992cbd2048a9d2b6cdd8a53ff1201a9296543 Mon Sep 17 00:00:00 2001 From: Nick Bailey Date: Fri, 10 Mar 2017 10:22:51 +0000 Subject: [PATCH 22/25] Fix up index. Edit right file this time --- python/index.html | 53 +++++++++++++++++++++-------------------------- 1 file changed, 24 insertions(+), 29 deletions(-) diff --git a/python/index.html b/python/index.html index 19c4142..996a9ca 100644 --- a/python/index.html +++ b/python/index.html @@ -25,7 +25,7 @@

    Lab Exercises

    @@ -303,7 +303,7 @@

    ...On to some programming


    -

    Exercise 17: A Very Simple Example

    +

    Exercise 21: A Very Simple Example

    Background

    @@ -1165,6 +1165,9 @@
    Creating a thread to listen for MIDI events

    +
    +

    ... Write up and hand in your work. It's worth 2 normal exercises.

    +

    Back to main

    diff --git a/python/labs/lab-swig.html b/python/labs/lab-swig.html index b8f01f5..f9465ef 100644 --- a/python/labs/lab-swig.html +++ b/python/labs/lab-swig.html @@ -19,9 +19,9 @@

    • -17. A Very Simple Example +18. A Very Simple Example
    • -18. SWIG and numpy nd-arrays +19. SWIG and numpy nd-arrays
    @@ -29,7 +29,7 @@


    -

    Exercise 17: A Very Simple Example

    +

    Exercise 18: A Very Simple Example

    -
    - -

    Exercise 13: Small Angle Interpolation

    - -
    -

    Background

    - -

    -As well as programming a large computer for -audio output, it's often useful to be able to -minimise the time and storage spent generating -a sine-wave. Some devices contain very low -power processors but might still need to -implement audio-frequency oscillators; others -may need to generate sine-waves at very high -frequency sample rates. It is now possible to -build FM receivers using software-only IF -processing (at 10.7MHz) on a relatively modest -dsp chip. -

    - -

    -The size of the look-up table, even in its -quarter-cycle version, would be regarded by -hardware designers as a profligate waste of -memory, when a simple piece of trig can cut -the storage requirement dramatically. -

    - -

    -sin(A+B) = sinAcosB - + cosAsinB
    -sin(x) ≈ x; -cos(x) ≈ 1 - x2/2 -(for small x). -

    - -

    -Here's the clever bit: let's store a smaller -number of entries in the look-up table, and use -the identity above to interpolate between them. -So A will be a "big" angle (cos and -sine obtained from the table) -and B will be the difference -between the value which can be obtained by the -table lookup and the angle we need. B is a "small" -angle, so the approximations can be used to -calculate the final value. -

    - -

    -Do the Maths Homework to find out how much of the -table can be thrown away without compromising -the accuracy of the result. -

    - -
    - -
    -

    Maths homework

    - -

    -Before investing effort in coding up an interpolated -solution, we'd better find out exactly how much storage -can be saved from the look-up table. -

    - -
      -
    • -The interpolation described begins to fail as the -angle increases. If we're using 16-bit audio -and A=0, find how the largest B -before the error exceeds 0.5bit (1/65536) by solving -
      - |sin(A+B) - ξ| = 1/216 -
      -  where ξ = - (sinA)(1-B2/2) - + BcosA -
    • - -
    • -How many samples are there between 0 and this B -radians in your original look-up table? -
    • - -
    • -Is the answer different if A = π/2? -
    • - -
    • -How does the situation change if we ignore the -x2 term and simply take -cos(x)≈1 for small x? -
    • - -
    - -

    Reference: Newton's Method

    -

    -You can find the roots of (most) -differentiable polynomials -iteratively using Newton's method. (Hint: it's easy -to code in Python if you get bored using a calculator) -

    - - - - x - - n - + - 1 - - - = - - x - n - - - - - - - - f - - - ( - - x - n - - ) - - - - - - f - ' - - - ( - - x - n - - ) - - - - - - -
    - -
    - -
    -

    Your task...

    - -

    -Modify the oscillator class you have already -written so that it uses a smaller -look-up table and interpolation. -

    - -

    ... show your work to a demonstrator

    -
    - - -
    -

    Exercise 14: A Recursive Oscillator

    +

    Exercise 12: A Recursive Oscillator

    Background

    diff --git a/python/labs/lab6.html b/python/labs/lab6.html index 707e976..966fd9f 100644 --- a/python/labs/lab6.html +++ b/python/labs/lab6.html @@ -16,17 +16,17 @@

    Audio Programming Lab 6

    • -15. Complex Arithmetic +13. Complex Arithmetic
    • -16. Frequency Response +14. Frequency Response

    -
    -

    Exercise 15: Complex Arithmetic

    +
    +

    Exercise 13: Complex Arithmetic

    Background

    @@ -124,9 +124,9 @@

    ... show your work to a demonstrator


    -
    -

    Exercise 16: frequency response

    -
    + +

    Exercise 14: frequency response

    +

    Background

    diff --git a/python/labs/lab7.xhtml b/python/labs/lab7.xhtml index 67e0a76..e7e0e23 100644 --- a/python/labs/lab7.xhtml +++ b/python/labs/lab7.xhtml @@ -15,19 +15,19 @@
    Exercises: -
      +
      • -17. Manipulating buffers. +15. Manipulating buffers.
      • -18. Filtering with pole and zero placement in the z-plane. +16. Filtering with pole and zero placement in the z-plane.
      • -19. Filtering to a specification. +17. Filtering to a specification.

    -

    Exercise 17
    Manipulating buffers.

    +

    Exercise 15
    Manipulating buffers.

    In this short exercise, we'll practice writing classes @@ -84,7 +84,7 @@ comparison.


    -

    Exercise 18
    Filtering with pole and zero placement +

    Exercise 16
    Filtering with pole and zero placement in the z-plane.

    @@ -350,7 +350,8 @@ Use the coefficients of the filter in Example 16 to test it.
    -

    Exercise 19
    +
    +

    Exercise 17
    Filtering to a specification

    diff --git a/python/labs/lab8.html b/python/labs/lab8.html index f551c20..7bcc227 100644 --- a/python/labs/lab8.html +++ b/python/labs/lab8.html @@ -16,16 +16,16 @@

    Audio Programming Lab 8

    • -20. Research Seminar! +25. Research Seminar!
    • -21. A Grand Challenge +26. Your Very Own Grand Challenge

    -

    Exercise 20: Research Seminar!

    +

    Exercise 25: Research Seminar!

    Your task...

    @@ -49,7 +49,7 @@

    Present your work at the SMRGSIMT.


    -

    Exercise 21. A Grand Challenge

    +

    Exercise 26. A Grand Challenge

    Your task...

    From 5253c33d17e360c9906557de2db8202a3f552212 Mon Sep 17 00:00:00 2001 From: Nick Bailey Date: Sat, 2 Apr 2022 15:38:44 +0100 Subject: [PATCH 25/25] Update README --- README | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/README b/README index d8dbff0..1d6cacd 100644 --- a/README +++ b/README @@ -10,12 +10,11 @@ Disclaimers: enough to get students started in the right direction, I stopped working on it. I accept no blame for any faults in the labs. -- I provided some input to the syllabus, but the final call was - always the lecturer, not me. These labs include some stuff - that I don't think is useful; they even include some stuff that - I think is actively harmful to students learning to program. - (e.g. pointers, excessive amounts of sine waves) - Again, I accept no fault for these. +"The Lecturer" has now rewritten a lot of the course with +Python and PyQt, although it's now been replaced by +a completely new course and back to C++ again, as it's for +electronics engineers who will be doing embedded stuff. +This can stay here in case it's of any use to anyone. This material is dual-licensed under: