Прежде всего,
tmpCanvas = document.createElement('canvas');
tmpCanvas.width = c.width;
tmpCanvas.height = c.height;
tmpCtx = tmpCanvas.getContext('2d');
Это то, что вы никогда не хотите делать в цикле.Прямо сейчас вы создаете новый холст каждые 40 миллисекунд!Это безумие!
Во-вторых, если вам нужен полупрозрачный градиент, почему бы вам вообще не использовать globalCompositeOperations и просто использовать полупрозрачные цвета?
Добавить альфа к цветам,как это:
// half transparent
grad.addColorStop(0, 'rgba(0,0,0,.5)');
grad.addColorStop(1, 'rgba(' + color + ', ' + color + ', ' + color + '0.5)');