Grumpy_Mike / marco_c.... Progress
Sort of, two steps forward one step back 
Up until now, I have not had much success with the SPI Hardware interface when using more than one MD_MAX7219 Instance and struggling with speed issues while using other Arbitrary pins.
I have now spent a far bit of time working on this and with your help have now cracked this with two Strips of two lots of four 8 X 8 matracies.
As marco_c advised the speed improvement over the bitbash method is very very noticeable and this has somewhat "got around" the issue I was having in display response time, but I am still perusing methods of only updating the displays when needed i.e. when Potentiometers have actually changed.
Having got so far, I then added two additional 4 off 8 X 8 Matracies to each instance making 16 8 X 8 modules per instance and then started getting issues with displays sets three and four giving strange results.
I reduced my hardware and sketch accordingly to 3 lots of 4 off 8 X 8 making 12 Matracies per instance and had exactly the same issues.
So everything works fine with 2 lots of 4 off 8 X 8 Matracies but not three.
I added some delays to the sketch to see if perhaps the SPI Hardware interface was running too fast but exact same issue, so don't think it is an issue with the SPI speed.
I have done some voltage checks between the variations and I am fairly sure there is no current limiting or voltage drop going on and I intend adding some additional larger DC Capacitors to the Matracies when they arrive (On order......Bring back Maplins, that's all I can say), perhaps I need to add some AC filter capacitors as well ?? .
I have done some digging around the Forum and internet and there are lots of conflicting stories about MAXIM MX7219 chips and the multitude of Chinese copies which I know mine are as I don't know if MAXIM even manufacture a 4 Off integrated MX7219 Chips with 8 X 8 Matracies module.
I can't believe that these Chinese modules are such an issue and I am sure there must be many people out there building projects with more than two of these Chinese 4 Off 8 X 8 units, but I am reluctant to purchase any more until I resolve the issue that I have with my current modules.
I wish I had access to an oscilloscope to do some more intensive investigation but for now will just have to concentrate on trial and error.
Once I have this sorted, I intend to add to my sketch, such that when each of the three strings of LED Matracies are set to three different pre-defined levels, another action is performed.
This part I am fairly comfortable with, but at this point I can't proceed until I resolve this current issue.
Fimez.
// INCLUDES
// Used to control a panel of MAX7219 LED displays based on the input from a Potentiometer.
#include <MD_MAX72xx.h>
#include <SPI.h>
// DEFINES
// Define the number of devices we have in the chain and the hardware interface
// NOTE: These pin numbers will probably not work with your hardware and may
// need to be adapted
#define PRINT(s, x) { Serial.print(F(s)); Serial.print(x); }
#define PRINTS(x) Serial.print(F(x))
#define PRINTD(x) Serial.println(x, DEC)
#define PRINT(s, x)
#define PRINTS(x)
#define PRINTD(x)
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 12
#define CLK_PIN 13 // or SCK
#define DATA_PIN 11 // or MOSI
#define CS_PIN 10 // or SS
//#define CS_PIN1 9 // or SS1
// SPI hardware interface
MD_MAX72XX mx0 = MD_MAX72XX(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
//MD_MAX72XX mx1 = MD_MAX72XX(HARDWARE_TYPE, CS_PIN1, MAX_DEVICES);
MD_MAX72XX mx[] = {mx0};
// Arbitrary pins
// MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);
#define DELAYTIME 100 // in milliseconds
// CONSTANTS
// The analogue input pins to which the potentiometers are connected.
const byte potPins[] = {A0, A2, A4};
// The total number of valves ****** Currently only two potentiometers in use ********
// Hopefully in the final sketch hope to use three Potentiometers a three lots of four 8X8 Matracies
const byte numPots = 1;
// GLOBALS
// This array will record the current reading of each input valve **** Currently Only 2 In use *****
int currentReadings[numPots] = {};
//int previousReadings[numPots] = {};
// Initialisation
void setup() {
mx[0].begin();
//mx[1].begin();
// Set the linear pot pins as input
for (int i = 0; i < numPots; i++) {
// Set the pin for the pot
pinMode(potPins[i], INPUT);
}
}
// Create a fixed map function:
long map2(long x, long in_min, long in_max, long out_min, long out_max) {
return (x - in_min) * (out_max - out_min + 1) / (in_max - in_min + 1) + out_min;
}
/**
Read the input from the potentiometer/s and store in the currentReadings array
*/
void getInput() {
int totalColumns = 96;
// Read the value from the pots
for (int i = 0; i < numPots; i++) {
// Get the "raw" input, which is a value from 0-1023
int rawValue = analogRead(potPins[i]);
// Scale the value to the number of LEDs in each strip
int scaledValue = map2(rawValue, 0, 1023, 0, totalColumns);
// To ensure we don't get any dodgy values, constrain the output range too
scaledValue = constrain(scaledValue, 0, totalColumns);
// Store the scaled value in the currentReadings array
currentReadings[i] = scaledValue;
// Print some debug information
}
}
/**
Set the LEDs dependant on the scaled value */
void setDisplay() {
int totalColumns = 96;
// Loop over each input
for (int pot = 0; pot < numPots; pot++)
{
for (uint8_t col = currentReadings[pot]; col < totalColumns; col++)
{
mx[pot].setColumn(col, 0x00); delay(DELAYTIME / MAX_DEVICES);
}
for (uint8_t col = 0; col < currentReadings[pot]; col++)
{
mx[pot].setColumn(col, 0xff); delay(DELAYTIME / MAX_DEVICES);
}
}
}
/**
Main program loop runs indefinitely
*/
void loop()
{
getInput();
setDisplay();
}