******************** Basic Manipulations ******************** AudioStream and Buffer objects have nearly all of their mathematical operators overloaded. It is easy to manipulate the data they contain. Every operation that can be done on a Buffer can be done on an AudioStream. In the following examples, only the Buffer case will be demonstrated, but it can easily be done to an AudioStream as well. Concatenation ------------- After creating an empty Buffer, one can insert samples into it with concatenation:: import Nsound as ns b = ns.Buffer() b << 1 << 2 << 3 b.getLength() # 3 b.toList() # [1.0, 2.0, 3.0] Buffers can be concatenated together:: b2 = ns.Buffer() b2 << 6 << 7 << 8 b << b2 b.getLength() # 6 b.toList() # [1.0, 2.0, 3.0, 6.0, 7.0, 8.0] Scalar Math ----------- When a scaler is applied to a Buffer or AudioStream, the scalar is applied element-wise for all the samples contained in the Buffer:: import Nsound as ns b = ns.Buffer() b << 1 << 2 << 3 << 6 << 7 << 8 b.toList() # [1.0, 2.0, 3.0, 6.0, 7.0, 8.0] b += 1.0 # b = b + 1.0 would also work b.toList() # [2.0, 3.0, 6.0, 7.0, 8.0, 9.0] b *= 2.0 b.toList() # [4.0, 6.0, 12.0, 14.0, 16.0, 18.0] b /= 3.0 b.toList() # [1.3333, 2.0, 2.6666, 4.6666, 5.3333, 6.0] Vector Math ----------- Nsound also allows element-wise math between two Buffers. Unlike other packages such as Numpy or Matlab, the Buffers don't have to be the same length:: import Nsound as ns b1 = ns.Buffer() b1 << 1 << 1 << 1 b2 = ns.Buffer() b2 << 0 << 1 << 1 << 1 # Addition b3 = b1 + b2 b3.toList() # [1.0, 2.0, 2.0] b3 = b2 + b1 b3 # [1.0, 2.0, 2.0, 1.0] # Subtraction b3 = b1 - b2 b3.toList() # [1.0, 0.0, 0.0] b3 = b2 - b1 b3.toList() # [-1.0, 0.0, 0.0, 1.0] # Products b3 = b1 * b2 b3.toList() # [0.0, 1.0, 1.0] b3 = b2 * b1 b3.toList() # [0.0, 1.0, 1.0, 1.0] # Quotients b3 = b1 / b2 b3.toList() # [1e+20, 1.0, 1.0] b3 = b2 / b1 b3.toList() # [0.0, 1.0, 1.0, 1.0]