Eu resolvi juntar o movimento X e pulsação com movimento no Y achando que ia ficar em zig-zag, mas ficou igualzinho uma tela de descanso, só tem que diminuir o setInterval
<canvas width="600" height="400"></canvas>
<script>
var tela = document.querySelector('canvas');
var pincel = tela.getContext('2d');
function desenhaCirculo(x, y, r,){
pincel.fillStyle = 'blue';
pincel.beginPath();
pincel.arc(x, y, r, 0, 2 * Math.PI);
pincel.fill();
}
function limpaTela(){
pincel.clearRect(0,0,600,400);
}
var x = 0;
var r = 20;
var y = 0;
//vai e volta VAR
var sentido = 1
//pulsa VAR
var pulsa = 1
//altura VAR
var altura = 1
function atualizaTela(){
limpaTela();
//vai e volta
if(x > 600){
sentido = -1;
}else if(x < 0){
sentido = 1;
}
//pulsa
if(r > 40){
pulsa = -1;
}else if(r < 20){
pulsa = 1;
}
//altura
if(y > 400){
altura = -1;
console.log('sobe')
}else if(y < 0){
altura = 1;
console.log('desce')
}
desenhaCirculo(x, y, r);
x = x + sentido;
r = r + pulsa;
y = y + altura;
}
setInterval(atualizaTela, 1);
</script>