\documentclass[a4paper,12pt]{scrartcl}
\usepackage{luacode}
\usepackage{fontspec}
\usepackage{xcolor}
\begin{document}
\setmainfont{Recursive}[
	Renderer=HarfBuzz,
	ItalicFont=Recursive,
	BoldFont=Recursive,
	BoldItalicFont=Recursive,
	UprightFeatures={
		RawFeature={+ss01,+ss02,+ss08,+case},
	},
	BoldFeatures={RawFeature={+axis={wght=700}}},
	BoldItalicFeatures={RawFeature={+axis={wght=700,slnt=-15,CRSV=1}}},
	ItalicFeatures={RawFeature={+axis={slnt=-15,CRSV=1}}}
]
\begin{luacode*}
local vft =
	[[\addfontfeatures{RawFeature={+axis={MONO=%.2f,CASL=%.2f,slnt=%.2f,CRSV=%d,wght=%.0f}}}]]
function vf( MONO, CASL, slnt, CRSV, wght )
	local s = vft:format( MONO, CASL, slnt, CRSV, wght )
	return s
end
local N, buf = 3, { }
function c( v )
	if type( v ) == "number" then  return { v, v }  end
	if not v[2] then  v[2] = v[1]  end
	return v
end
function lerp( MONO, CASL, slnt, CRSV, wght, C,M,Y,J,F )
	F = F or 1
	local B = { c(MONO), c(CASL), c(slnt), c(CRSV), c(wght) }
	local color = { C,M,Y }
	local params = { }
	for k = 0, N do
		local t = k/N
		color[J] = (F<0) and (1+(F*t)) or (F*t)
		for i = 1, #B do
			params[i] = B[i][1] + (B[i][2] - B[i][1])*t
		end
		local s = vf( table.unpack( params ) )
		--[[ texio.write_nl( s ) ]]
		buf[#buf+1] = s
		local C = ("%.2f,%.2f,%.2f,0.65"):format( table.unpack( color ) )
		buf[#buf+1] = "\\textcolor[cmyk]{"..C.."}{Test?} "
	end
	buf[#buf+1] = "\\par "
end
lerp( 0, {0,1},       0, 0,       300,   0,0,0,2    )
lerp( 0,     1, {-15,0}, 0,       300,   0,1,0,3    )
lerp( 0, {1,0},     -15, 0,       300,   0,1,1,2,-1 )
lerp( 0,     0,     -15, 0, {800,300},   0,0,1,1    )
lerp( 0, {0,1},     -15, 0,       800,   1,0,1,2    )
lerp( 0,     1, {0,-15}, 0,       800,   1,1,1,3,-1 )
lerp( 0, {1,0},       0, 0,       800,   1,1,0,2,-1 )
lerp( 0,     0,       0, 0, {300,800},   1,0,0,1,-1 )
tex.print( table.concat( buf, "" ) )
\end{luacode*}
\end{document}
